一、引言
上一篇博客学习了行子查询。(看弹幕:同一张表用or,不同张表用union)
下面接着学习子查询当中的最后一种——表子查询。
- 表子查询
1、概念
子查询返回的结果是多行多列,这种子查询称为表子查询。
2、常用的操作符
IN
3、注意
这个表子查询经常出现在 FROM 之后,
把表子查询返回的结果作为一张临时表,再和其它表进行联查操作。
接下来通过两个需求演示一下基本的用法。
二、操作
打开图形可视化工具 DataGrip 进行操作。
(0)员工表 emp 、部门表 dept
emp表
dept 表
(1)查询与员工 “ 必胜客 ”," 宋远桥 ”的职位和薪资相同的员工信息
1、分析(拆解需求)
先得去查询必胜客和宋远桥这两个员工的职位和薪资,再查询符合需求的员工信息
第一步
SELECT job,salary FROM emp WHERE name IN('必胜客','宋远桥'); /*这里用 OR 也行*/
第二步
2、实操
解决方法:我们使用 IN
意思就是:
用 IN 就是在返回的这个多行多列表格当中选某一行,只要查询 SELECT 满足其中一行就查询出来
SELECT * FROM emp WHERE (job,salary) IN (SELECT job,salary FROM emp WHERE name IN('必胜客','宋远桥') );
(2)查询入职日期是 “ 2006-01-01 ” 之后的员工信息,及其部门信息
1、分析(拆解需求)
先查询出在指定入职时间之后的员工信息,再去查询这部分员工其对应的部门信息
第一步
SELECT * FROM emp WHERE entrydate > '2006-01-01';
2、实操
我们要把第一张查到的表作为一张 "临时表",去这里面查询对应的部门信息。
所以才有前面的:表子查询通常在 FROM 之后
注意:这里还要用到左连接查询(因为防止有些字段为 NULL ,也要给他查询出来)
/* ON 后面接连接的条件 */ SELECT e.*,d.* FROM (SELECT * FROM emp WHERE entrydate > '2006-01-01') AS e LEFT JOIN dept AS d ON e.dept_id = d.id;
这上面的案例就用到了表子查询,它会把返回的表("临时表")作为一张表去联合其它表做一个联查操作。表子查询返回的结果是多行多列的数据。
这篇博客的内容就结束了。