zoukankan      html  css  js  c++  java
  • SQL中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 
    
  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/rainman/p/4475357.html
Copyright © 2011-2022 走看看