本质上是数据分布在不同的数据表中,在查询的时候,需要在不同的表中进行查询,但是我们只想写一个sql,所以就产生了多表查询;
一个sql语句当中,where后面的约束条件依赖一个select语句的查询结果;
注意:多表查询时,要注意查询的列是属于哪一个表当中的,如果多个表当中存在相同名称的字段,则需要指定该字段属于哪一个表,否则mysql的服务端层,在解析sql语句的时候,是没有办法进行区分的,就会报错。
eg:显示雇员名、雇员工资以及所在部门的名字,需要多表查询
eg:显示雇员编号、雇员名、雇员工资以及所在部门的地址,需要多表查询
eg:显示部门号为20的部门名,员工名和工资
eg:显示各个员工的姓名,工资,及工资级别
自连接是指在同一张表连接查询
eg:显示员工ADAMS的上级领导的编号和姓名
使用子查询:
使用多表查询(自查询)
子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询
(1)单行子查询
外层select,内层select;内层查询的内容是单行单列的
eg:显示FORD同一部门的员工
eg:显示JONES同一工作的员工
(2)多行子查询
本质上指的是内层的select查询出来的结果是单列多行的
eg:查询和30号部门的工作相同的雇员的名字,岗位,工资,部门号,但是不包含30自己的
eg:显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
eg:显示工资比部门10的任意员工的工资高的员工的姓名、工资和部门号
(3)多列子查询
本质上是单行多列的数据,本质上内层的select搜索了多列的数据
eg:查询和KING的部门和岗位完全相同的所有雇员,不含SMITH本人
子查询的语句在from子句中出现,是把子查询当做一个临时表来使用
eg:显示低于自己部门平均工资的员工的姓名、部门、工资、平均工资
eg: 查找每个部门工资最低的人的姓名、工资、部门、最低工资
为了合并多个select的执行结果,可以使用集合操作符union、union all
(1)union
该操作符用于取得两个结果集的并集,其会自动去掉结果集中的重复行
(2)union all
该操作符用于取得两个结果集的并集,但其不会去掉结果集中的重复行
(3)例子:查询工资大于2000或职位是MANAGER的人