背景:
有时我们在进行SQL查询时,需要用到一个子查询的查询结果作为另一个查询的查询条件或者查询结果。也是被称之为SQL的子查询。
用法:主要有两种,一种是放在where查询子句中使用,另一种是作为查询结果。
测试用到的表:
在where查询子句中使用
比如要查询部门员工表中员工编号为10005所在的部门员工信息
不使用SQL嵌套查询时,那可以使用两个SQL来解决这个问题。
第一步先查询出员工编号为10005的部门编号。
select dept_no from dept_emp where emp_no='10005'
第二步利用第一步查询出的部门编号进而查询出该部门的部门员工信息。
select * from dept_emp where dept_no ='d003' ;
但是如果如果使用嵌套查询的话,那么只需要一个SQL就可以解决该问题。
-- 先利用子查询查询出部门编号,再利用主查询查询其需要的相关信息
select * from dept_emp where dept_no in (select dept_no from dept_emp where emp_no='10005');
子查询作为查询结果
比如我要查询部门编号,部门名称以及每个部门的人数
分析:依据部门表,部门编号和部门名称这两个字段很好获取,但是每个部门的人数就需要用到部门员工表,要统计每个部门的员工数目就要用到count(*)函数。要查询d001部门的人数可以将SQL写成
select count(*) from dept_emp where dept_no ='d001';
但是需要的是各个部门的人数,那这时where子句就不能这样写了,需要写成
where dept_emp.dept_no=departments.dept_no
它要使用完全限定列名。
那么这个SQL就自然写成了
select dept_no,
dept_name,
(select count(*) from dept_emp where dept_emp.dept_no=departments.dept_no) as emp_num
from departments;
结果为: