MySQL-子查询
# 子查询
子查询(Subquery)是SQL查询语句中的一个重要概念,它是在一个查询语句内部嵌套的另一个查询语句。子查询可以看作是一个临时的中间结果集,被外部查询进一步处理或筛选。通过子查询,用户可以在单次查询中执行复杂的多步逻辑操作,极大地增强了SQL语言的功能性和表达力。
数据库表结构参照《多表查询-外连接-自连接》文档中的emp和dept表
# 一.什么是查询中嵌套查询呢?
示例:
需求:查询工资高于猪八戒的员工信息。
来实现这个需求,我们就可以通过二步实现,
第一步:先查询出来 猪八戒的工资 select salary from emp where name = '猪八戒';
执行结果:
** 第二步:查询工资高于猪八戒的员工信息**
select * from emp where salary > 3600;
执行结果:
第二步中的3600可以通过第一步的sql查询出来,所以将3600用第一步的sql语句进行替换(子查询语句结果为单行单列的情况)
select * from emp where salary > (select salary from emp where name = '猪八戒');
这就是查询语句中嵌套查询语句。
# 二.子查询根据查询结果不同,作用不同
1.子查询语句结果是单行单列,子查询语句作为条件值,使用 = != > < 等进行条件判断 2.子查询语句结果是多行单列,子查询语句作为条件值,使用 in 等关键字进行条件判断 3.子查询语句结果是多行多列,子查询语句作为虚拟表
示例:
1.查询 '财务部' 和 '市场部' 所有的员工信息(子查询的结果为单行多列的情况)
-- 查询 '财务部' 或者 '市场部' 所有的员工的部门did
select did from dept where dname = '财务部' or dname = '市场部';
执行结果:
select * from emp where dep_id in (select did from dept where dname = '财务部' or dname = '市场部');
执行结果:
2.查询入职日期是 '2011-11-11' 之后的员工信息和部门信息(子查询语句结果是多行多列的情况)
-- 查询入职日期是 '2011-11-11' 之后的员工信息
select * from emp where join_date > '2011-11-11' ;
执行结果:
-- 将上面语句的结果作为虚拟表和dept表进行内连接查询
select * from (select * from emp where join_date > '2011-11-11' ) t1, dept where t1.dep_id = dept.did;
执行结果: