前文铺垫一些基础知识,老鸟直接拉到文末看原因!
什么是子查询
- 一个查询的结果做为另一个查询的条件
- 有查询的嵌套,内部的查询称为子查询
- 子查询要使用括号
子查询的结果是一个值的时候
示例:SELECT 查询字段 FROM 表 WHERE 字段=(子查询);
案例:查询工资最高的员工是谁?
-- 查询员工工资的最大值
select max(salary) from emp;
-- 查询领最多工资的员工信息
select * from emp where salary = (select max(salary) from emp);
这个案例中select max(salary) from emp; 就是子查询的语句,它查到的最高工资作为select * from emp where salary = (select max(salary) from emp);的查询条件。
子查询结果是多行单列的时候
- 子查询结果是单例多行,结果集类似于一个数组,父查询使用 IN 运算符
- 示例:SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询)
案例:查询工资大于5000的员工,对应的部门名称
-- 查询大于5000的员工所在的部门id
select dept_id from emp where salary > 5000;
-- 根据部门id查询部门名字
select name from dept where dept_id in (select dept_id from emp where salary > 5000);
这个案例中select dept_id from emp where salary > 5000;是自查询语句,查询结果是多个值(多行单列),因此使用子查询时要用in关键字。查询结果作为select name from dept where dept_id in (select dept_id from emp where salary > 5000);的查询条件。
子查询的结果是多行多列
- 子查询结果只要是多列,肯定在 FROM 后面作为表
- SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件
- 子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段 (这个相当重要,不加的话sql是运行不了的)
案例:查询出2023年以后入职的员工信息,包括部门名称
-- 在员工表中查询2023-1-1以后入职的员工
select * from emp wherec join_date >= '2023-1-1';
-- 查询所有的部门信息,与上面的虚拟表中的信息组合,找出所有部门id等于的dept_id
select * from dept d, (select * from emp wherec join_date >= '2023-1-1') e where d.dept_id = e.dept_id;
上述例子中select * from emp wherec join_date >= ‘2023-1-1’;的查询结果被当作派生表,用到了select * from dept d, (select * from emp wherec join_date >= ‘2023-1-1’) e where d.dept_id = e.dept_id;这个语句中。此时可以看到我为select * from emp wherec join_date >= ‘2023-1-1’;取了一个别名为e,这个时候sql就不会报错。