zoukankan      html  css  js  c++  java
  • MySQL 子查询 EXISTS 和 NOT EXISTS

    MySQL EXISTS 和 NOT EXISTS 子查询

    MySQL EXISTS 和 NOT EXISTS 子查询语法如下:

    SELECT ... FROM table WHERE  EXISTS (subquery)
    

    该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。

    MySQL EXISTS 子查询实例

    下面以实际的例子来理解 EXISTS 子查询。下面是原始的数据表:

    article 文章表:
    aidtitlecontentuid
    1 文章1 文章1正文内容... 1
    2 文章2 文章2正文内容... 1
    3 文章3 文章3正文内容... 2
    4 文章4 文章4正文内容... 4
    user 用户表:
    uidusernameemail
    1 admin admin@5idev.com
    2 小明 xiao@163.com
    3 Jack jack@gmail.com

    我们要查出 article 表中的数据,但要求 uid 必须在 user 表中存在。SQL 语句如下:

    SELECT * FROM article WHERE EXISTS (SELECT * FROM user WHERE article.uid = user.uid)
    

    返回查询结果如下:

    aidtitlecontentuid
    1 文章1 文章1正文内容... 1
    2 文章2 文章2正文内容... 1
    3 文章3 文章3正文内容... 2

    从语句执行结果可以看出,article 表中第 4 条记录没有被保留,原因就是该条记录的数据在子查询中返回的结果是 FALSE 。

    当上面的 SQL 使用 NOT EXISTS 时,查询的结果就是 article 表中 uid 不存在于 user 表中的数据记录。

    提示

    • EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。
    • EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
    • EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来替代,何种最优需要具体问题具体分析。
  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/a757956132/p/4311919.html
Copyright © 2011-2022 走看看