千家信息网

关于exists 的使用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,1、exists 字面意思存在。EXISTS里的子查询结果集非空,EXISTS()子句的值就是true。EXISTS里的子查询结果集为空,EXISTS()子句的值就是false。SELECT * FR
千家信息网最后更新 2026年11月03日关于exists 的使用

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 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。

查询 结果 条件 外层 子句 数据 过程 内层 表达式 实际 就是 括号 真值 语句 处理 信息 属性 示例 逻辑 x.x 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网下的科技发展 互联网金融公司科技 顺玮阁互联网科技 上海万想互联网科技 互联网科技英文翻译 四个字互联网科技公司取名 深圳前海聚择互联网科技有限公司 金融科技与互联网金融相同和不同 互联网大会黑科技排名 想开互联网科技公司怎么样 互联网在线教育科技创业 广州千川互联网科技有限公司 广州百诚互联网科技有限公司官网 半导体是互联网高科技吗 陕西云淼互联网科技公司 郑州欣桑互联网科技有限公司 兰石爱特工业互联网科技分公司 科技互联网专业工作会议发言稿 10位科技互联网大佬 现代科技的标志之一的互联网 湖南诚度互联网科技有限公司 宁夏众和广鑫互联网科技有限公司 浙江互联网科技研学营 武汉健翔互联网络科技有限公司 玉溪新华互联网科技好不好 特约风豹互联网科技为什么扣费 恒生互联网科技业指数调整周期 互联网第三次科技革命特征 数字科技和互联网金融哪个好 山东亿川互联网科技有限责任公司
0