17.子查询

  • 查询中又有查询称为子查询,也就是说一条语句中有多个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后面作为表存在,前面已经有例子

你可能感兴趣的:(17.子查询)