SQL中EXISTS的使用

SQL中EXISTS的使用1.简介不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS的子查询就是相关子查询EXISTS表示

大家好,又见面了,我是你们的朋友全栈君。

1.简介

  • 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
  • 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询
  • EXISTS表示存在量词:带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值“True”或“False”

2.表结构

选课表:学号、课程号

学生表:学号、姓名

课程表:课程号、课程名

3.查询所有选修了“C1”课程的学生名。

普通SQL查询:

SELECT 姓名 
FROM 学生表 
WHERE 学号 IN (SELECT 学号 FROM 选课表 WHERE 课程号 = 'C1'); 

带EXISTS的SQL查询:

SELECT 姓名
FROM 学生表
WHERE EXISTS    
(
    SELECT * 
    FROM 选课表
    WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1' 
);

相关子查询执行过程:先在外层查询中取“学生表”的第一行记录,用该记录的相关的属性值(在内层WHERE子句中给定的)处理内层查询,若外层的WHERE子句返回“TRUE”值,则这条记录放入结果表中。然后再取下一行记录;重复上述过程直到外层表的记录全部遍历一次为止。

EXISTS语句不关心子查询的具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。

  • Exists:若子查询的结果集非空时,返回“True”;若子查询的结果集为空时,返回“False” 。
  • NOT EXISTS :若子查询结果为空,返回“TRUE”值;若子查询的结果集非空时,返回 “FALSE。

4.查询没有选C1课程的学生的学号、姓名

SELECT 姓名
FROM 学生表
WHERE NOT EXISTS
(
    SELECT *
    FROM 选课表
    WHERE 学生表.学号 = 选课表.学号 AND 课程号 = 'C1'
);

5.查询选修了所有课程的学生的姓名(续)

SELECT 姓名
FROM 学生表
WHERE NOT EXISTS
(
    SELECT *
    FROM 课程表
    WHERE NOT EXISTS
    (
       SELECT *
       FROM 选课表
       WHERE 学生表.学号 = 选课表.学号 AND 课程表.课程号 = 选课表.课程号
    )
);

6.查询至少选修了S1所选的全部课程的学生名

SELECT 姓名
FROM 学生表
WHERE NOT EXISTS                     
( 
    SELECT *
    FROM 选课表 AS 选课表X            
    WHERE 选课表X.学号='s1' AND NOT EXISTS            
    (
        SELECT *
        FROM 选课表 AS 选课表Y
        WHERE  学生表.学号 = 选课表Y.学号 AND 选课表X.课程号 = 选课表Y.课程号
    )
);

7.在FROM语句中使用子查询,对查询结果定义表名及列名 例:求平均成绩超过80分的学号及平均成绩

SELECT 学号, AVG_G
FROM        
(
    SELECT 学号, AVG(Grade)
    FROM 选课表
    GROUP BY 学号 
) AS RA(学号, AVG_G)
WHERE AVG_G > 80 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154297.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • javacollection_java freemarker

    javacollection_java freemarkerlabelmeImagePolygonalAnnotationwithPythonDescriptionLabelmeisagraphicalimageannotationtoolinspiredbyhttp://labelme.csail.mit.edu.ItiswritteninPythonandusesQtforitsgraphica…

    2025年10月30日
    2
  • Idea激活码永久有效Idea2019.3.3激活码教程-持续更新,一步到位

    Idea激活码永久有效Idea2019.3.3激活码教程-持续更新,一步到位Idea激活码永久有效2019.3.3激活码教程-Windows版永久激活-持续更新,Idea激活码2019.3.3成功激活

    2022年6月17日
    128
  • c++、webServices、gsoap、tinyxml、iconv

    c++、webServices、gsoap、tinyxml、iconv

    2022年3月13日
    36
  • 搜空白符号_excel筛选空白格

    搜空白符号_excel筛选空白格这是网络上很多人都在找的空白格符号,游戏ID、文本编辑、设计等等,这些是确实可用的,如果不小心帮到了你,点赞评论支持。➧ 空白格符号:【】【】【 】【】➧ 小空白格符号:【】【⠀】【⠀】【⠀】【】➧ 极小空白格符号:【⁡】【⁡】 注:【括号中】是有字符的带着括号复制,把括号删除即可下面是一些其他符号:▲÷↑↓◆◇⊙■□△▽─│♂♀▼≈←→◎☉★☆⊿※━┃ツΣ卐√↖↗●Θ◤◥︻〖〗┄┆℃℉°¢€£∞★×↙↘○⊕◣◢︼【】┅┇〓▂▃▄▅▆▇█▉▊▋▌▍▎▏の┈┊①②③④⑤⑥⑦⑧⑨⑩

    2022年10月5日
    3
  • mysql左连接丢失null值的问题

    mysql左连接丢失null值的问题一、前言      如题所示,我们有的时候直接使用左连接查询,当右表不存在该数据的时候,是可以查出带有null的列。可是当在where条件中有右表相关的筛选条件时,我们惊奇的发现查询的结果不带null值了,换句话说就是查出来的结果比预期的少。      博主之前遇到过这个问题…

    2022年5月6日
    38
  • c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog

    c++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlogc++日志库实战——spdlog,是不是感觉log4cxx有点笨重,不妨试一试spdlog背景spdlog是什么spdlog快速入门常见问题打印行号怎么控制台看不到log同时输出控制台和文件文件按天分割完整代码附录CMakeList.txt关于背景在最近新入职同事的推荐下,作者在一个小工具中学习和使用了spdlog,且已发布到线上运行,以下是学习记录。spdlog是什么FastC++…

    2022年6月23日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号