--近来干活时发现对同事写的用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 的使用相关推荐

  1. MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)

    1. 子查询概念 子查询是指嵌套在其他语句(SELECT . INSERT . UPDATE . DELETE 等)中的 SELECT 语句:子查询也称为内查询( inner query )或者嵌套查 ...

  2. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  3. SQL:EXISTS的用法理解(转)

    摘自:http://www.cnblogs.com/netserver/archive/2008/12/25/1362615.html 比如在Northwind数据库中有一个查询为 SELECT c. ...

  4. oracle中的exists 和not exists 用法详解

    有两个简单例子,以说明 "exists"和"in"的效率问题 1) select * from T1 where exists(select 1 from T2 ...

  5. SQL with NUll处理,Join系列,between,in对比exists以及少量题目

    2019独角兽企业重金招聘Python工程师标准>>> 1.一些题目: 选择在每一组B值相同的数据中对应的a最大的记录的所有信息,(用于论坛每月排行榜) Selecta,b,c fr ...

  6. Sql 语句中 IN 和 EXISTS

    原文链接:  (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...

  7. 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). 解决办法一:保 ...

  8. oracle exists mysql_oracle_in_exists_left-join

    查询A表中的数据没有出现在B表中 mysql> select * from user; +------+-------+ | uid  | uname | +------+-------+ |  ...

  9. oracle exists语句

    前言 书上这么写的,先看from,再看where,最后选出满足的行 select * from A where exists (select * from A where Code=1111) 等同于 ...

  10. sql中exists,not exists的用法

    exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:   select name from student where sex = 'm' and mark exists(selec ...

最新文章

  1. 渗透测试工作流程渗透测试类型法律边界
  2. android视频教程
  3. 语言与golang语言运行速度_Golang语言情怀第13期 Go 语言设计模式 介绍
  4. Notepad++使用技巧
  5. php删除excel文件,PHPExcel:HTML到Excel,写入删除excel文件中的CSS
  6. 抖音回应火山小视频被判赔腾讯800万元:目前已提起上诉
  7. 使用 Redis 实现自动补全功能
  8. 【MySQL】通信协议
  9. 【Android命令行】jarsigner参数详解
  10. 29 伪造ICMP数据包的IP层
  11. 图解机器学习:分类模型性能评估指标
  12. 安卓Tv端App开发与手机端的开发的区别
  13. 研发质量管理工作经验总结(五)----关于流程建设的思考
  14. uni-app实现生成二维码功能
  15. cubieboard 资源
  16. 推荐的前端开源项目CDN加速服务
  17. Light OJ 1138
  18. 个人小程序开发有哪些限制?
  19. CPD配准算法及代码的简单理解(Coherent Point Drift)
  20. MaskRNN Instance Level Video Object Segmentation 论文翻译

热门文章

  1. MOOC Web前端笔记(三):CSS样式
  2. virtualbox虚拟机上播放器白屏问题
  3. 手写FSM实现小怪状态管理
  4. PowerPivot的DAX函数实战
  5. Xen network Linux
  6. 稳定学习相关工作及介绍
  7. python电商案例分析项目
  8. python爬虫项目讲解(scrapy-re)
  9. JSP URL 中文乱码 解决方式
  10. c语言找字符串的位置,C语言开发中查找字符串位置的方法