SQL exists 和 not exists等关键字学习

前言

关于这个知识点,因为一眼看不懂,当时又没时间,所以我很早就定下了计划要好好了解,但是一直拖到现在,才有时间好好看看整理整理。

一、exist 和 not exist

看得懂exists是有结果就返回,但是就不是很理解具体效果,所以决定敲一敲

大概我理解是这样的
假设有a,b两张表

a(id, name)
1 a1
2 a2
3 a3
b(id, name)
1 b1
3 b3

select * 
from a
where EXISTS (select * from b where a.id = b.id)

得出的结果会是

1  	a1
3	a3

这个可以理解为a left jion b, 或者说是用a的数据去b表中找,a表中的数据在b表中exist(存在或者说符合exist()里的条件),exist方法为真,当条记录就返回

select name from user where exist(sql语句)

从上面这句话来解析就是 “exist(sql语句)” 这一段当成整体,只要是里面的sql语句条件满足的记录就返回。

not exist同理

二、 intersect、except、union和minux

  • UNION(并集): 这里面个人最熟悉的就是union,作用就是可以将多个select语句的结果合并
    • tips:会去除相同的结果,如果只查询name,相同name只会出现一次,如果是记录,记录只有每个字段值都一样才会被去除
  • INTERSECT(交集):也会自动去除重复,如果想保留所有的重复,必须用INTERSECT ALL代替INTERSECT,结果中出现的重复元组数等于两集合出现的重复元组数里较少的那个。
    • tips :在oracle这个关键字可以直接使用,但mysql不支持intersect关键字查询,我们在使用mysql查询两个语句的结果集的时候可以使用inner join的方式来替代intersect实现交集查询
  • EXCEPT(除):自动去除重复,如果想保留所有的重复,必须用EXCEPT ALL代替EXCEPT,结果中出现的重复元组数等于两集合出现的重复元组数之差(前提是差是正值)。(也是ORACLE才能使用,mysql 用not in)
  • MINUS(差集):比较两个查询的结果,返回在第一个查询结果集中,但不是第二个查询结果集中的行记录,也就是说不包含两个查询返回集合的相交部分。mysql还是不能用,mysql可以用not exists找出差集
select sno 
from t_student t1 
where not exists(select 1 from t_score t2 where t2.sno = t1.sno)
   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值