关于exists 的使用
--近来干活时发现对同事写的用exists的sql看不很懂,在网上搜集了些资料学习学习。
--下面这些说法不见的都对,有不对的地方请高手指正。
1、exists 字面意思存在。
EXISTS里的子查询结果集非空,EXISTS()子句的值就是true。
EXISTS里的子查询结果集为空,EXISTS()子句的值就是false。
SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT SYSDATE FROM DUAL);
此句将查出scott.emp表所有内容.
SELECT * FROM SCOTT.EMP WHERE EXISTS(SELECT * FROM scott.salgrade where 1=2) ;
返回空结果集
参考一下论述:
带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
使用存在量词EXISTS后,若内层查询结果非空,则外层的WHERE子句返回真值否则返回假值。
由EXISTS引出的子查询,其目标列表达式通常都用*,因为带EXISTS的子查询只返回真值或假值,
给出列名无实际意义。
2、用exists的相关子查询
明白相关子查询:
子查询的查询条件依赖于外层父查询的某个属性值,称这类查询为相关子查询。
求解相关子查询不能像求解不相关子查询那样,一次将子查询求解出来,然后求解父查询。
内层查询由于与外层查询有关,因此必须反复求值。
弄清相关子查询处理过程:
从概念上讲,相关查询的一般处理过程是:
首先去外层查询中表的第1个元组,根据它与内层查询相关的属性值处理内层查询,
若WHERE子句返回值为真,则取此元组放入结果表;然后再取表的下一个元组;
重复这个过程直到外层表全部检查完为止。
SQL> select a.ENAME from scott.emp a
where exists(select * from scott.dept b where b.deptno=a.deptno);
ENAME
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
查询到14记录.
相当于下sql:
select a.ENAME from scott.emp a
where a.deptno in (select b.deptno from scott.dept b );
exists子查询实际是通过关联别的表安某种条件缩小主查询的范围。
3、not exists 简单的理解就是 not exists= not in
实际not exists 取得是不属于exists限制条件的主表的数据集
SQL> select a.ENAME from scott.emp a
where exists(select * from scott.dept b where b.deptno=a.deptno and b.deptno=10);
ENAME
----------
CLARK
KING
MILLER
select a.ENAME from scott.emp a
where not exists(select * from scott.dept b where b.deptno=a.deptno and b.deptno=10)
ENAME
----------
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
SCOTT
TURNER
ADAMS
JAMES
FORD
查询到11记录.
4 、exists和in
in子句通常用在不相关子查询中。通常先执行子查询,将子查询的结构用于父查询。
子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询。
关键字: 在Oracle SQL中取数据时in 和 exists 的区别?
在Oracle SQL中取数据时有时要用到in 和 exists 那么他们有什么区别呢?
1 性能上的比较
比如Select * from T1 where x in ( select y from T2 )
执行的过程相当于:
select *
from t1, ( select distinct y from t2 ) t2
where t1.x = t2.y;
相对的
select * from t1 where exists ( select null from t2 where y = x )
执行的过程相当于:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x ) )
then
OUTPUT THE RECORD
end if
end loop
表 T1 不可避免的要被完全扫描一遍
分别适用在什么情况?
以子查询 ( select y from T2 )为考虑方向,如果子查询的结果集很大需要消耗很多时间,
但是T1比较小执行( select null from t2 where y = x.x )非常快,那么exists就比较适合用在这里。
相对应得子查询的结果集比较小的时候就应该使用in.
5、问题: 我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,
但是怎么样才能保证不会插入重复的记录呢?
答案: 可以通过使用 EXISTS 条件句防止插入重复记录。
示例一:插入多条记录
假设有一个主键为 client_id 的 clients 表,可以使用下面的语句:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, 'advertising'
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
个人批注:not exists不存在,也就是说后面的括号中只要返回了数据那么这个条件就不存在了,
可以理解为括号前的notexists是一个左表达式 ,括号后的查询是一个右表达式,
只有当右表达式返回的也是not exists(即后面的查询出来的结果是非空的)时,等式才成立。
示例一:插入单条记录
Code:
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, 'IBM', 'advertising'
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
使用 dual 做表名可以让你在 select 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。
关于exists 的使用相关推荐
- MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)
1. 子查询概念 子查询是指嵌套在其他语句(SELECT . INSERT . UPDATE . DELETE 等)中的 SELECT 语句:子查询也称为内查询( inner query )或者嵌套查 ...
- oracle中的exists 和 not exists 用法详解
from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...
- SQL:EXISTS的用法理解(转)
摘自:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c. ...
- oracle中的exists 和not exists 用法详解
有两个简单例子,以说明 "exists"和"in"的效率问题 1) select * from T1 where exists(select 1 from T2 ...
- SQL with NUll处理,Join系列,between,in对比exists以及少量题目
2019独角兽企业重金招聘Python工程师标准>>> 1.一些题目: 选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜) Selecta,b,c fr ...
- Sql 语句中 IN 和 EXISTS
原文链接: (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...
- git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....
Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 解决办法一:保 ...
- oracle exists mysql_oracle_in_exists_left-join
查询A表中的数据没有出现在B表中 mysql> select * from user; +------+-------+ | uid | uname | +------+-------+ | ...
- oracle exists语句
前言 书上这么写的,先看from,再看where,最后选出满足的行 select * from A where exists (select * from A where Code=1111) 等同于 ...
- sql中exists,not exists的用法
exists : 强调的是是否返回结果集,不要求知道返回什么, 比如: select name from student where sex = 'm' and mark exists(selec ...
最新文章
- JZOJ 1598. 文件修复
- Schedulerx2.0工作流支持数据传输
- Django 3 配置日志器,时区,修改静态文件,创建应用
- java final形参_求高手回答final形参问题
- Spring Boot 的 GraphQL 框架DGS
- 2017年前端该学些什么(译)
- 每日一词20190301——比例尺和地图比例尺
- 南部龙凤小学:六一文艺表演
- Android5.0+win8双系统平板PK苹果ipad
- windows操作系统基础总结
- 女王大学 计算机专业,女王大学计算机科学专业本科.pdf
- 广西大学计算机仿真实验,基于Simulink的汽车动力性仿真实验设计
- day38--Dijkstra 算法与 Prim 算法
- 【JY】YJK前处理参数详解及常见问题分析:控制信息(二)
- 主营女性内容生产,木棉说获A轮3000万融资
- 计算机应用怎样升本科,计算机应用基础模拟试卷“高职升本科”Excel教案.doc
- MIDI音阶与频率关系
- 【一周读书】《把时间当作朋友》《一个人就是一支骑兵》读书心得
- VC10中的C++0x特性 part 3 : 声明之类型
- Linux 探索 第一幕 传奇的开始(转)
热门文章
- 房间虚拟样板间vr制作及价格
- pprint 和print_求你了,别再使用 pprint 打印字典了
- 毛蟠桃文案:水果毛蟠桃新鲜的文案,水果毛蟠桃的销售文案
- 《Head First Java》读后笔记
- Origin学习笔记——(1)初识Origin
- hdu 3308 LCIS(区间合并)
- 迅雷极速版解决版本太旧提示问题
- jq ajax 读取本地文件,jquery读取本地文件
- 前端img不显示服务器图片,【前端】img 加上crossOrigin=”anonymous”之后导致图片无法显示...
- 智慧查验Vue、elementUI使用总结