--近来干活时发现对同事写的用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. JZOJ 1598. 文件修复
  2. Schedulerx2.0工作流支持数据传输
  3. Django 3 配置日志器,时区,修改静态文件,创建应用
  4. java final形参_求高手回答final形参问题
  5. Spring Boot 的 GraphQL 框架DGS
  6. 2017年前端该学些什么(译)
  7. 每日一词20190301——比例尺和地图比例尺
  8. 南部龙凤小学:六一文艺表演
  9. Android5.0+win8双系统平板PK苹果ipad
  10. windows操作系统基础总结
  11. 女王大学 计算机专业,女王大学计算机科学专业本科.pdf
  12. 广西大学计算机仿真实验,基于Simulink的汽车动力性仿真实验设计
  13. day38--Dijkstra 算法与 Prim 算法
  14. 【JY】YJK前处理参数详解及常见问题分析:控制信息(二)
  15. 主营女性内容生产,木棉说获A轮3000万融资
  16. 计算机应用怎样升本科,计算机应用基础模拟试卷“高职升本科”Excel教案.doc
  17. MIDI音阶与频率关系
  18. 【一周读书】《把时间当作朋友》《一个人就是一支骑兵》读书心得
  19. VC10中的C++0x特性 part 3 : 声明之类型
  20. Linux 探索 第一幕 传奇的开始(转)

热门文章

  1. 房间虚拟样板间vr制作及价格
  2. pprint 和print_求你了,别再使用 pprint 打印字典了
  3. 毛蟠桃文案:水果毛蟠桃新鲜的文案,水果毛蟠桃的销售文案
  4. 《Head First Java》读后笔记
  5. Origin学习笔记——(1)初识Origin
  6. hdu 3308 LCIS(区间合并)
  7. 迅雷极速版解决版本太旧提示问题
  8. jq ajax 读取本地文件,jquery读取本地文件
  9. 前端img不显示服务器图片,【前端】img 加上crossOrigin=”anonymous”之后导致图片无法显示...
  10. 智慧查验Vue、elementUI使用总结