1.多表查询

本质上是数据分布在不同的数据表中,在查询的时候,需要在不同的表中进行查询,但是我们只想写一个sql,所以就产生了多表查询;  

一个sql语句当中,where后面的约束条件依赖一个select语句的查询结果;

注意:多表查询时,要注意查询的列是属于哪一个表当中的,如果多个表当中存在相同名称的字段,则需要指定该字段属于哪一个表,否则mysql的服务端层,在解析sql语句的时候,是没有办法进行区分的,就会报错。

eg:显示雇员名、雇员工资以及所在部门的名字,需要多表查询

mysql 复合主键 声明 mysql复合语句_结果集

mysql 复合主键 声明 mysql复合语句_结果集_02

 eg:显示雇员编号、雇员名、雇员工资以及所在部门的地址,需要多表查询

mysql 复合主键 声明 mysql复合语句_结果集_03

eg:显示部门号为20的部门名,员工名和工资

mysql 复合主键 声明 mysql复合语句_多表查询_04

eg:显示各个员工的姓名,工资,及工资级别

mysql 复合主键 声明 mysql复合语句_子查询_05

2.自连接

自连接是指在同一张表连接查询

eg:显示员工ADAMS的上级领导的编号和姓名

使用子查询:

mysql 复合主键 声明 mysql复合语句_mysql 复合主键 声明_06

使用多表查询(自查询) 

mysql 复合主键 声明 mysql复合语句_多表查询_07

3.子查询

子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询

(1)单行子查询

外层select,内层select;内层查询的内容是单行单列的

eg:显示FORD同一部门的员工

mysql 复合主键 声明 mysql复合语句_子查询_08

 eg:显示JONES同一工作的员工

mysql 复合主键 声明 mysql复合语句_子查询_09

(2)多行子查询

本质上指的是内层的select查询出来的结果是单列多行的

  • in关键字:外层select的约束条件只要满足内层select查询出来的任意一个结果

eg:查询和30号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含30自己的

mysql 复合主键 声明 mysql复合语句_mysql 复合主键 声明_10

mysql 复合主键 声明 mysql复合语句_子查询_11

  • all关键字:全部

eg:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号

mysql 复合主键 声明 mysql复合语句_结果集_12

  • any关键字:任意

eg:显示工资比部门10的任意员工的工资高的员工的姓名、工资和部门号

mysql 复合主键 声明 mysql复合语句_mysql 复合主键 声明_13

(3)多列子查询

本质上是单行多列的数据,本质上内层的select搜索了多列的数据

eg:查询和KING的部门和岗位完全相同的所有雇员,不含SMITH本人

mysql 复合主键 声明 mysql复合语句_结果集_14

 4.在from子句中使用子查询

子查询的语句在from子句中出现,是把子查询当做一个临时表来使用

eg:显示低于自己部门平均工资的员工的姓名、部门、工资、平均工资

mysql 复合主键 声明 mysql复合语句_多表查询_15

eg: 查找每个部门工资最低的人的姓名、工资、部门、最低工资

mysql 复合主键 声明 mysql复合语句_多表查询_16

 5.合并查询

为了合并多个select的执行结果,可以使用集合操作符union、union all

(1)union 

该操作符用于取得两个结果集的并集,其会自动去掉结果集中的重复行

(2)union all

该操作符用于取得两个结果集的并集,但其不会去掉结果集中的重复行

(3)例子:查询工资大于2000或职位是MANAGER的人

mysql 复合主键 声明 mysql复合语句_子查询_17