zoukankan      html  css  js  c++  java
  • sql语句exists 用法

    参考:SQL语句exists用法 Sql语句中IN和exists的区别及应用

    现在有三张表

    学生表S: sno ,sname

    课程表C:cno ,cname

    学生选课表SC: sno ,cno 

    查询选了所有课程的学生信息

    SELECT *
      FROM S T1
     WHERE NOT EXISTS (SELECT 1
              FROM C T2
             WHERE NOT EXISTS (SELECT 1
                      FROM SC T3
                     WHERE T1.SNO = T3.SNO
                       AND T2.CNO = T3.CNO))

    我理解就是,上面的语句是查询不存在每门课都没有选的学生,那就是选择了所有课程的学生。上面的语句使用了两个NOT EXISTS,如果使用EXISTS又是什么意思呢?

    SELECT *
      FROM S T1
     WHERE EXISTS (SELECT 1
              FROM C T2
             WHERE NOT EXISTS (SELECT 1
                      FROM SC T3
                     WHERE T1.SNO = T3.SNO
                       AND T2.CNO = T3.CNO))

    查询存在着有一门课没有选择的学生信息。

    SELECT *
      FROM S T1
     WHERE NOT EXISTS (SELECT 1
              FROM C T2
             WHEREEXISTS (SELECT 1
                      FROM SC T3
                     WHERE T1.SNO = T3.SNO
                       AND T2.CNO = T3.CNO))

    查询不存在选择了一门课的学生,就是查询没有选课的学生信息。

    SELECT *
      FROM S T1
     WHERE EXISTS (SELECT 1
              FROM C T2
             WHEREEXISTS (SELECT 1
                      FROM SC T3
                     WHERE T1.SNO = T3.SNO
                       AND T2.CNO = T3.CNO))

    查询选择了一门课或多门课的学生信息,就是查询至少选择了一门课的学生信息。

    平常用的多是IN,那么IN和EXISTS有什么区别呢?

    对IN执行过程的描述

      确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。

    对EXISTS执行过程的描述

      定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。

    区别即应用场景

     in 和 exists的区别: 如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in, 反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了 ,另外IN时不对NULL进行处理。

     in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。

    not in 和not exists

      如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。

  • 相关阅读:
    Linux 命令查找文件中某个字段所存在的位置
    PHP in_array() 函数
    php一维数组如何追加到二维数组
    电脑切换窗口
    微擎前端逻辑判断的时弹框
    JDBC批量处理
    数据库事务
    处理BLOB
    JDBC自动生成主键值
    JDBC的元数据
  • 原文地址:https://www.cnblogs.com/alway-july/p/9753344.html
Copyright © 2011-2022 走看看