• 子查询一(WHERE中的子查询)


    子查询

    子查询就是指的在一个完整的查询语句之中,嵌套若干个不同功能的小查询,从而一起完成复杂查询的一种编写形式,为了让读者更加清楚子查询的概念。

    子查询返回结果
    子查询可以返回的数据类型一共分为四种:

      1. 单行单列:返回的是一个具体列的内容,可以理解为一个单值数据;
      2. 单行多列:返回一行数据中多个列的内容;
      3. 多行单列:返回多行记录之中同一列的内容,相当于给出了一个操作范围;
      4. 多行多列:查询返回的结果是一张临时表;

    WHERE子句中使用子查询

    在WHERE子句之中处理单行单列子查询、多行单列子查询、单行多列子查询。

    单行单列子查询

     示例一、查询公司之中工资最低的雇员的完整信息
    --查询公司之中工资最低的雇员的完整信息
    SELECT * 
    FROM emp e
    WHERE e.sal=(
      SELECT MIN(sal) 
      FROM emp);

    示例二、查询出基本工资比ALLEN低的全部雇员信息

    复制代码
    -- 查询出基本工资比ALLEN低的全部雇员信息
    SELECT * 
    FROM emp e
    WHERE e.sal<(
     SELECT sal 
     FROM emp 
     WHERE ename='ALLEN'
    );
    复制代码

    示例三、查询基本工资高于公司平均薪金的全部雇员信息

     
    --查询基本工资高于公司平均薪金的全部雇员信息
    SELECT *
    FROM emp e
    WHERE e.sal>(
    SELECT AVG(sal)
    FROM emp);

    单行多列子查询。

    示例四、查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,

    复制代码
    --查找出与ALLEN从事同一工作,并且基本工资高于雇员编号为7521的全部雇员信息,
    SELECT *
    FROM emp e
    WHERE e.job=(
      SELECT job
      FROM emp 
      WHERE ename='ALLEN') 
      AND e.sal>(
      SELECT sal
      FROM emp 
      WHERE empno=7521);
    复制代码

    示例五、查询与SCOTT从事同一工作且工资相同的雇员信息

    复制代码
    SELECT *
    FROM emp e
    WHERE (e.job,e.sal) = (
      SELECT job,sal
      FROM emp 
      WHERE ename='SCOTT')
      AND ename<>'SCOTT';
    复制代码

    示例六、查询与雇员7566从事同一工作且领导相同的全部雇员信息

    复制代码
      --查询与雇员7566从事同一工作且领导相同的全部雇员信息
    SELECT *
    FROM emp e
    WHERE (e.job,e.mgr) =(
            SELECT job,mgr
            FROM emp
          WHERE empno=7566
    );
    复制代码

    示例七、查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)

    复制代码
    --查询与ALLEN从事同一工作且在同一年雇佣的全部雇员信息(包括ALLEN)
    SELECT *
    FROM emp e
    WHERE (e.job,to_char(e.hiredate,'yyyy'))=(
               SELECT job,to_char(hiredate,'YYYY')
                FROM emp
                WHERE ename='ALLEN'
    );
    复制代码

    多行单列子查询

    主要使用三种操作符:IN、ANY、ALL
     IN操作

    示例八、查询出与每个部门中最低工资相同的全部雇员信息

    复制代码
    --查询出与每个部门中最低工资相同的全部雇员信息
    SELECT *
    FROM emp e
    WHERE e.sal IN(
         SELECT MIN(sal)
        FROM emp
        GROUP BY deptno
    );
    复制代码

    示例九、查询出不与每个部门中最低工资相同的全部雇员信息

    复制代码
    --查询出不与每个部门中最低工资相同的全部雇员信息
    SELECT *
    FROM emp e
    WHERE e.sal NOT IN(
         SELECT MIN(sal)
        FROM emp
        GROUP BY deptno
    );
    复制代码

    ANY在使用中有如下三种使用形式:
    =ANY:表示与子查询中的每个元素进行比较,功能与IN类似(然而<>ANY不等价于NOT IN)
    >ANY:比子查询中返回结果的最小的要大(还包含了>=ANY)
    <ANY:比子查询中返回结果的最大的要小(还包含了<=ANY)

    示例十、查询出每个部门经理的工资

    复制代码
    --查询出每个部门经理的工资
    
    SELECT  * 
    FROM emp 
    WHERE sal = ANY (
       SELECT MIN (sal)
      FROM emp
      WHERE job='MANAGER'
      GROUP BY deptno
    );
    复制代码

    示例十一、查询出每个部门大于经理的工资

    复制代码
    --查询出每个部门大于经理的工资
    SELECT  * 
    FROM emp 
    WHERE sal > ANY (
       SELECT MIN (sal)
      FROM emp
      WHERE job='MANAGER'
      GROUP BY deptno
    );
    复制代码

    示例十二、查询出每个部门小于经理的工资

    复制代码
    --查询出每个部门小于经理的工资
    SELECT  * 
    FROM emp 
    WHERE sal < ANY (
       SELECT MIN (sal)
      FROM emp
      WHERE job='MANAGER'
      GROUP BY deptno
    );
    复制代码

    ALL操作符有以下三种用法:
    <>ALL:等价于NOT IN(但是=ALL并不等价于IN)
    >ALL:比子查询中最大的值还要大(还包含了>=ALL)
    <ALL:比子查询中最小的值还要小(还包含了<=ALL)

    示例十三、查询出每个部门不等于经理的工资

    复制代码
    --查询出每个部门不等于经理的工资
    SELECT  * 
    FROM emp 
    WHERE sal <> ALL (
       SELECT MIN (sal)
      FROM emp
      WHERE job='MANAGER'
      GROUP BY deptno
    );
    复制代码

    示例十四、

    复制代码
    SELECT  * 
    FROM emp 
    WHERE sal < ALL (
       SELECT MIN (sal)
      FROM emp
      WHERE job='MANAGER'
      GROUP BY deptno
    );
    复制代码

    示例十五、

    复制代码
    SELECT  * 
    FROM emp 
    WHERE sal >ALL (
       SELECT MIN (sal)
      FROM emp
      WHERE job='MANAGER'
      GROUP BY deptno
    );
    复制代码
    空数据判断
    在SQL之中提供了一个exists结构用于判断子查询是否有数据返回。如果子查询中有数据返回,则exists结构返回true,反之返回false。

    示例十五、验证exists结构

     
    --验证exists结构
    SELECT * FROM emp
        WHERE EXISTS(   --返回空值,没有内容输出
          SELECT * FROM emp WHERE empno=9999); --没有这个编号的员工

    示例十六、

     SELECT * FROM emp
     WHERE EXISTS(SELECT * FROM emp);--有内容将返回数据

    示例十七、

      SELECT * FROM emp
     WHERE NOT EXISTS(SELECT * FROM emp);--有数据,但取返,没有内容输出
  • 相关阅读:
    [virsh] error: unknown OS type hvm解决办法
    TCP长连接与短连接的区别
    MySQL数据优化总结-查询备忘录
    Tomcat 调优测试
    MySQL的分表与分区
    iptables防火墙入门
    regex正则
    xtrabackup
    锁&lock与latch
    文档测试
  • 原文地址:https://www.cnblogs.com/Soprano/p/10659101.html
Copyright © 2020-2023  润新知