SQL----EXISTS 关键字EXISTS基本意思
1.EXISTS基本意思
英语解释就是存在,不过他的意思也差不多,相当于存在量词'З'。他不返回数据的,当后带带的查询为空值是,返回“FALSE”,非空则返回“TRUE”。
就因为 EXISTS 返回的是真值或假值,所以他所带的子查询一般直接用'select *' 因为给出列名也没多少意义。
其实,EXISTS属于相关子查询,也就是说子查询的条件依赖于外层父查询的查个属性值。比如:
select Sname
from Student
where exists (
select *
from SC
where Sno=Student.Sno and Cno ='1');
所说的依赖也就是这一句“ Sno=Student.Sno”。这里要说明一下,这个查询过程不是一般的自下而上执行,他与外查询依赖,执行的时候是先从父查询中取一个元组,然后根据条件 Sno=Student.Sno 处理内查询,得到结果再进行父查询中取第二个元组,如果反复。
可与NOT 连用,反意思反过来理解,如:
select Sname
from Student
where not esists (
select *
from SC
where Sno=Student.Sno and Cno ='1');
EXISTS 的子查询,有一些是不能被其它形式的子查询等价替换的,但是所有 IN、比较运算符、ANY 和ALL的子查询都能用带有EXISTS 的子查询等价替换。但是在做的时候,请考虑效率问题,哪种高效用啊种,这是优化问题。
例如在上一篇 IN 的讲述中第一个例子,我们就可以改一下,变成:
select Sno,Sname,Sdept
from Student S1
where exists (
select *
from Student S2
where S2.Sdept=S1.Sdept and S2.Sname='A');
在这里,EXISTS只要知道内查询是否为空值就可以了,所以效率要比用IN的查询要高效一些。
如何理解一下语句:
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT *
FROM Course
WHERE NOT EXISTS
(SELECT *
FROM SC
WHERE Sno= Student.Sno
AND Cno= Course.Cno
)
);
这个例子目的是查找数据库三个表中是否存在不对应的记录(各表应存在如下关系SC.Cno= Course.Cno ,sc.Sno= Student.Sno
)
它的功能和in有点类似,这条语句改成用in的方法就是这样,这样就比较容易理解了.
SELECT Sname FROM Student
WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN (SELECT Cno FROM Course))
- exist与in的区别
in 和 exists也是很好区别的.
in 是一个集合运算符.
A in {a,c,d,s,d....}
这个运算中,前面是一个元素,后面是一个集合,集合中的元素类型是和前面的元素一样的.
而exists是一个存在判断,如果后面的查询中有结果,则exists为真,否则为假.
in 运算用在语句中,它后面带的select 一定是选一个字段,而不是select *.
比如说你要判断某班是否存在一个名为"小明"的学生,你可以用in 运算:
"小明" in
(select sname from student)
这样(select sname from student)
返回的是一个全班姓名的集合,in用于判断"小明"是否为此集合中的一个数据;
同时,你也可以用exists语句:
exists
(select * from student where sname="小明")
这两个涵数是差不多的, 但是由于优化方案的不同, 通常NOT
EXISTS要比NOT IN 要快, 因为NOT EXISTS可以使用结合算法而NOT IN 就不行了,而EXISTS则不如IN快,
因为这时候IN可能更多的使用结合算法.
select * from 表A where exists(select * from 表B
where 表B.id=表A.id)
这句相当于
select * from 表A where id in (select id
from 表B)
:对于表A的每一条数据,都执行(select * from 表B where
表B.id=表A.id )的存在性判断,如果表B中存在表A当前行相同的id,则exists为真,该行显示,否则不显示
exits适合内小外大的查询,in适合内大外小的查询
IN
确定给定的值是否与子查询或列表中的值相匹配。
EXISTS
指定一个子查询,检测行的存在。
比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。
USE
pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO
=============================================================
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT
pub_id
FROM titles
WHERE type = 'business')
GO
下面是任一查询的结果集:
pub_name
Algodata
Infosystems
New Moon Books
(2 row(s) affected)
exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P
表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时为真; s
not in P 表示s与P中的每一个值都不相等时 为真
SQL----EXISTS 关键字EXISTS基本意思的更多相关文章
- sql server if exists和 if not exists 的关键字用法
if exists和if not exists关键字用法 1.介绍 if not exists 即如果不存在,if exists 即如果存在 2.使用 a.判断数据库不存在时 if not ...
- SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别
SQL中IN,NOT IN,EXISTS,NOT EXISTS的用法和差别: IN:确定给定的值是否与子查询或列表中的值相匹配. IN 关键字使您得以选择与列表中的任意一个值匹配的行. 当要获得居住在 ...
- SQL-57 使用含有关键字exists查找未分配具体部门的员工的所有信息。
题目描述 使用含有关键字exists查找未分配具体部门的员工的所有信息.CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` ...
- mysql 数据操作 多表查询 子查询 带EXISTS关键字的子查询
带EXISTS关键字的子查询 EXISTS关字键字表示存在. EXISTS 判断某个sql语句的有没有查到结果 有就返回真 true 否则返回假 False 如果条件成立 返回另外一条sql语句的返 ...
- 十、SQL中EXISTS的用法 十三、sql server not exists
十.SQL中EXISTS的用法 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False EXISTS 指定一个子查询,检测 行 的存在. 语法 ...
- SQL语句中exists和in的区别
转自https://www.cnblogs.com/liyasong/p/sql_in_exists.html 和 http://blog.csdn.net/lick4050312/article/d ...
- MyBatis框架中的条件查询!关键字exists用法的详细解析
exists用法 exists: 如果括号内子查询语句返回结果不为空,说明where条件成立,就会执行主SQL语句 如果括号内子查询语句返回结果为空,说明where条件不成立,就不会执行主SQL语句 ...
- 你真的会玩SQL吗?EXISTS和IN之间的区别
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- SQL里的EXISTS与in、not exists与not in
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELEC ...
- SQL in与exists相关性能问题总结
SQL in与exists相关性能问题总结 in 和 exists in 和 exists的是DBA或开发人员日常工作学习中常用的基本运算符,今天我就这两个所带来的性能问题进行分析总结,方便自己与他 ...
随机推荐
- 分布式计算 Distributed computing
分布式计算(Distributed computing),又译为分散式运算,是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处 ...
- 1构建NTP时间服务器
NTP时间服务器 NTP服务器是用于局域网服务器时间同步使用的,可以保证局域网所有的服务器与时间服务器的时间保持一致,某些应用对时间实时性要求高的必须统一时间. 互联网的时间服务器也有很多,例如ntp ...
- Nginx结合tomcat 负载均衡
负载均衡是我们大流量网站要做的一个东西,下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法,希望对有需要的同学有所帮助哦. 负载均衡 先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可 ...
- VMware Workstation Ubuntu 20.04 LTS无法连接网络问题
本文记录了自己使用的安装在VMware Workstation上的Ubuntu20.04无法连接到网络的解决过程--终于解决困扰我两个小时的问题 出现问题# 毫无征兆,平时使用正常的Ubuntu在今天 ...
- Mybatis缓存(3)
10.4.3二级缓存
- MyBatis_09(逆向工程)
MyBatis的逆向工程 正向工程:先创建Java实体类,由框架负责根据实体类生成数据库表.Hibernate是支持正向工程的 逆向工程:先创建数据库表,由框架负责根据数据库表,反向生成如下资源: J ...
- 关于matlab2011b 32bit无法成功激活
matlab2011b版本已经很少见了 下载链接:Matlab_R2011B.Win32.iso_免费高速下载|百度网盘-分享无限制 (baidu.com) 解决办法:(参考原博) (43条消息) M ...
- CAD安装失败,如何才能删除(卸载)CAD?三步完美卸载CAD软件
CAD安装失败,怎么样才能彻底删除CAD各种残留注册表?有时候我们想将CAD重新安装,但却显示CAD已经安装,但又不见CAD软件程序文件,然后我们就会产生这样的疑问:CAD无法重新安装是怎么一回事?下 ...
- py常用模块
02 collection模块 # 具名元组# 想表示坐标点x为1 y为2的坐标from collections import namedtuple# point = namedtuple('坐标', ...
- 从零搭建hadoop集群之mysql安装
Linux RPM 方式安装 MySQL在 hadoop02机器上 1. 安装新版mysql前,需将系统自带的mariadb-lib卸载 [root@hadoop02 ~]# rpm -qa|grep ...