- 查询中又有查询称为子查询,也就是说一条语句中有多个select关键字
- 如查询工资最高的员工的详细信息,下面这种写法是错误的,聚合函数不能出现在where条件中
SELECT * FROM emp WHERE sal = MAX(sal)
- 子查询步骤:
- 先查出最高工资
SELECT MAX(sal) FROM emp
- 再查询工资等于最高工资的员工,将上次查询得到的结果用()括起来作为值给sql语句
SELECT * FROM emp WHERE sal = (SELECT MAX(sal) FROM emp);
- 子查询能出现的位置
- from后作为表存在
- where后作为条件存在
SELECT *
FROM (子查询)
WHERE (子查询)
子查询在结果后作为表存在
- 如:查询销售中工资最高的人
SELECT *
FROM (SELECT * FROM emp WHERE job = '销售员') e
WHERE sal = (SELECT MAX(sal) FROM (SELECT * FROM emp WHERE job = '销售员') j);
- 注意1:每一个子查询出来的表都必须有别名
- 注意2:这种写法比较臃肿,可以用其他sql语句完成该功能
SELECT *
FROM emp
WHERE job = '销售员'
ORDER BY sal DESC
LIMIT 1;
子查询在where后作为条件存在
单行单列
题目:查询最高工资的员工
第一步:查询出最高工资,得到一个单行单列的结果
SELECT MAX(sal) FROM emp
第二步:查询出工资=最高工资的员工
SELECT * FROM emp WHERE sal = (SELECT MAX(sal) FROM emp)
- where 条件可以用= != > < >= <= 等条件
单行多列
题目:查询所有工作和上级与韦一笑一样的员工
第一步:查询出韦一笑的工作和上级, 得到一个单行多列的结果
SELECT job, mgr FROM emp WHERE ename = '韦一笑';
第二步:查询出与韦一笑工作和上级相同的人
SELECT * FROM emp WHERE (job, mgr) IN (SELECT job, mgr FROM emp WHERE ename = '韦一笑');
多行单列
题目:查询出工资比20部门所有人/某一人高的员工信息
第一步:查询出20部门的所有人的工资,得到一个多行单列的结果
SELECT sal FROM emp WHERE deptno = 20;
第二步:查询比里面所有人工资都高的人,注意ALL关键字的使用
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 20);
第三步:查询出比里面某一人工资高的人,注意ANY关键字的使用
SELECT * FROM emp WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 20);
多行多列
常用在from后面作为表存在,前面已经有例子