美文网首页
数据库第八天

数据库第八天

作者: __method__ | 来源:发表于2021-02-18 10:10 被阅读0次

    多行子查询

    • 多行子查询返回的记录有多条
    • 可以使用的操作符 in / all // any
    in

    查询是经理的员工姓名, 工资

    -- SELECT ename, sal from emp
    -- where EMPNO in (SELECT mgr from emp)
    SELECT ename, sal from emp
    where EMPNO in (7902, 7698, 7839, 7566, 7788, 7782)
    -- SELECT DISTINCT mgr from emp
    
    any 表示和子查询的任意一行进行比较有一个满足就行

    查询是经理的员工姓名, 工资

    • < ANY 表示小于子查询结果集合中的任意一个, 即小于最大值就可以
    • ANY 表示大于子查询结果集合中的任意一个, 即大于最小值就可以

    • = ANY表示等于子查询结果集合中的任意一个, 即等于谁都可以
    SELECT ename, sal from emp
    where EMPNO = any (SELECT mgr from emp)
    
    • 查询部门编号不为10,且工资比10部门任意一名 员工工资高的员工编号,姓名,职位,工资。
    select empno, ename, job, sal from emp
    where sal> any 
    (select sal from emp where deptno=10) and deptno <> 10
    

    ALL 表示和子查询的所有行进行比较, 每一行必须都满足条件

    • < ALL 表示小于子查询结果集合中的所有行, 即小于最小值
    • 大于 ALL 表示大于子查询结果集合中的所有行, 即大于最大值就可以
    • = ALL表示等于子查询结果集合中的所有行, 即等于所有值, 通常无意义
    -- 查询部门编号不为20,且工资比20部门所有员工工资高的
    -- 员工编号,姓名,职位,工资。
    SELECT empno, ename, JOB, sal from emp
    WHERE sal > ALL(SELECT sal from emp where deptno=20) AND
    DEPTNO <> 20
    
    • 查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
    • 查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
    • 查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员工
    select ename, HIREDATE from emp
    where hiredate> any (select hiredate from emp where deptno=10) and deptno <> 10
    
    select ename, HIREDATE from emp
    where hiredate> all (select hiredate from emp where deptno=10) and deptno <> 10
    
    select ename, job from emp
    where job =any (select job from emp where deptno=10) and deptno <> 10
    

    子查询中有空的情况

    SELECT ename, sal from emp
    where EMPNO not in (SELECT mgr from emp)
    

    上面子查询中计算包含了空值, 因为有一条值控制, 会导致主查询返回没有记录, 结论: 只要空值有可能成为子查询的一部分, 就不能使用 not in

    在 from 子句中使用子查询

    • 查询比自己部门平均工资高的员工姓名,工资,部门编号,部门平均工资
    SELECT  a.ename, a.sal, a.deptno, b.salavg
    FROM    emp a, (SELECT   deptno, AVG(sal) salavg
                     FROM     emp
                     GROUP BY deptno) b
    WHERE   a.deptno = b.deptno  AND    a.sal > b.salavg;
    
    • 查询部门平均工资在2500元以上的部门名称及平均工资。
    • 查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。
    • 查询部门人数在2人以上的部门名称、最低工资、最高工资。
    • 查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。
    • 显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序
    • 查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
    • 查询工资最高的员工姓名和工资。
    • 查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
    • 查询员工工资为其部门最低工资的员工的编号和姓名及工资。
      显示经理是KING的员工姓名,工资。
    • 显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间

    相关文章

      网友评论

          本文标题:数据库第八天

          本文链接:https://www.haomeiwen.com/subject/jmsgxltx.html