SQL中EXISTS的使用

exists : 强调的是是否返回结果集

  • 不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。
  • 相关子查询:子查询的查询条件依赖于外层父查询的某个属性值的称为相关子查询,带EXISTS 的子查询就是相关子查询
关键词意思返回结果判断
EXISTS若子查询的结果集非空时,返回“True”当为ture时,主查询返回结果
NOT EXISTS若子查询结果为空,返回“True”当为ture时,主查询返回结果

Exists执行的流程

Exists首先执行外层查询,再执行内存查询,与IN相反。 流程为首先取出外层中的第 一元组, 再执行内层查询,将外层表的第一元组代入,若内层查询为真,即有结果时。返回外层表中的第一元组,接着取出第二元组,执行相同的算法。一直到扫描完外层整表

类似java:

for(int i =0;  i<>EOFout;i++) {
    for (int j = 0 ; j<EOFint,j++) {

    }
}

IN 查询和 EXISTS 查询,返回结果相同
in查询,先执行内层查询

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

等价于 下面EXISTS 查询(先执行外层查询)

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

在子查询中使用 NULL 仍然返回结果集

select * from table where exists(select null)
等同于: select * from table 

EXISTS 和 = ANY 的查询,返回结果相同

select * from 学生表 where exists(select 选课表.学号 from 选课表 where 选课表.学号=学生表.学号)
select * from 学生表 where 学生表.学号=ANY(select 选课表.学号 from 选课表)

查询年龄最大的学生

SELECT * 
FROM 学生表 user1
    WHERE not EXISTS (
        SELECT 1 
        FROM 学生表 user2
        WHERE
        user1.age < user2.age
    )

查询选修了所有课程的学生的姓名

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

查询至少选修了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.课程号
    )
);

在FROM语句中使用子查询,对查询结果定义表名及列名

SELECT 学号, AVG_G
FROM  (
    SELECT 学号, AVG(Grade)
    FROM 选课表
    GROUP BY 学号 
) AS RA(学号, AVG_G)
WHERE AVG_G > 80 
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值