zoukankan      html  css  js  c++  java
  • 数据库中的子查询

    概述

    • 什么是子查询?
      select语句当中嵌套select语句,被嵌套的select语句是子查询。
    • 子查询可以出现在哪里?
      select
      ...(select)
      from
      ...(select)
      where
      ... (select)

    where后面嵌套子查询

    • 例子
      找出高于平均薪资的员工信息。
    • 错误写法:
    SELECT * FROM emp
    where sal>avg(sal);
    

    原因:where后面不能使用分组函数。

    • 分步查询
      先找出平均薪资:SELECT avg(sal) FROM emp;(2073.214286)
      再过滤:
    SELECT * FROM emp
    where sal>2073.214286;
    
    • 合并:
    SELECT * FROM emp
    where sal > (
    SELECT * FROM emp
    where sal>avg(sal)
    );
    

    嵌套查询

    from后面嵌套子查询

    • 例子
      找出每个部门平均薪水的薪资等级。
    • 解答:
      1、找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
    SELECT deptno, avg(sal) as avgsal 
    from emp 
    group by deptno;
    

    在这里插入图片描述
    2、将以上的查询结果当做临时表t,让t表和salgrade s表连接。

    SELECT t.*, s.grade 
    FROM (SELECT deptno, avg(sal) as avgsal 
    from emp 
    group by deptno) t
    join salgrade s
    on
    t.avgsal between s.losal and s.hisal;
    

    在这里插入图片描述

    • 例子
      找出每个部门的薪水等级的平均值
      1、找出每个员工的薪资等级
    SELECT e.ename, e.sal, e.deptno, s.grade
    from emp e 
    join salgrade s 
    on e.sal between s.losal and s.hisal;
    

    在这里插入图片描述
    2、看似会用到子查询,但是不会(因为需要的数据都有)。

    SELECT e.deptno, avg(s.grade) 
    FROM emp e
    join salgrade s
    on
    e.sal between s.losal and s.hisal 
    group by e.deptno;
    

    在这里插入图片描述

    select后面嵌套子查询

    • 例子
      找出每个员工所在的部门名称,要求显示员工名和部门名。
      (用嵌套的方法,不用连接)
    SELECT e.ename, 
    (
    select d.dname 
    from dept d 
    where e.deptno = d.deptno
    ) as dname
    from emp e;
    

    在这里插入图片描述

  • 相关阅读:
    结对项目——电子书的字段
    痛点分析
    文本统计——字符 单词 行数
    音乐播放器需求分析
    简单的四则运算
    高德地图——一款功能强大的APP
    记一次mysql小版本升级
    Servlet/JSP面试题目-----近期总结
    【转】各种概念POJO、JAVABEAN、DAO、DTO、PO、VO、BO、SSH、EJB
    springMVC框架(二)---springMVC框架高级开发
  • 原文地址:https://www.cnblogs.com/yu011/p/13295015.html
Copyright © 2011-2022 走看看