子查询(嵌套查询)
定义很简单,在SQL语句中使用了select嵌套语句就称为子查询。
1.标量子查询
标量子查询的查询结果为一个单一值。
举个例子,查询销售部所有员工的信息。
我们可以把这个要求分成两步,第一步先查询出销售部的部门id,然后再根据部门id去寻找员工的信息。注意这里是两张表格,不要和单表查询搞混了。
查询销售部门id:
select id from dept where name = '销售部'
运行结果为一行一列,也就是标量查询。
根据部门id查找员工信息:
select * from emp where dept_id = 4
通过观察不难发现,其实第一句的结果不就是第二句的“4”嘛!,那么直接把第一句语句替换掉4不就行了?
于是:
select * from emp where dept_id = (select id from dept where name = '销售部')
记得加括号!不然会报错的。
2.列子查询
查询结果为一列的子查询叫做列子查询。
列子查询的操作符比较不一样,主要有以下几种:
举个例子:查询销售部和市场部的所有员工信息。
和标量子查询一样的步骤,首先是查询两个部门的id,再通过id查询员工信息:
select id from dept where name = '销售部' or name = '市场部'
select * from emp where dept_id in(2,4)
那么这里的in还是可以被替换成上面的语句。由于上面的语句输出的是一列数据,所以叫做列子查询。
select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部')
3.行子查询
返回结果是一行的子查询。
举例:查询和“张无忌”的薪资和直属领导相同的员工信息。
拆解:先查询“张无忌”的薪资和直属领导,然后再查询相同的员工信息。
select emp.salary, emp.managerid from emp where name = '张无忌'
查询结果:
这里输出的形式是一行,所以叫做行子查询。
接着查询相同的员工信息:
select * from emp where (salary, managerid) = (12500, 1)
那么通过替换,就可以实现行子查询了。
select * from emp where (salary, managerid) = (select emp.salary, emp.managerid from emp where name = '张无忌')
4.表子查询
返回的结果是多行多列,就称为表子查询。
举例:查询与“鹿杖客”,“宋远桥”职位和薪资的相同员工信息。
拆解:查询“鹿杖客”,“宋远桥”职位和薪资,然后查询相同员工信息。
select emp.job, emp.salary from emp where name = '鹿杖客' or name = '宋远桥'
查询结果:
因为输出的是多行多列,所以是表子查询。
select * from emp where (job, salary) in (select emp.job, emp.salary from emp where name = '鹿杖客' or name = '宋远桥')
通过in关键字,就可以查询出多行多列下所有的员工信息了。
因此关键字为in。
至此所有的多表查询操作就介绍完毕了。阶段性成果++!