--近来干活时发现对同事写的用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 语句后面直接跟上要插入字段的值,即使这些值还不存在当前表中。
分享到:
相关推荐
### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...
### SQL Server 2005 EXISTS 使用方法详解 #### 一、EXISTS 子句概述 在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` ...
如果你想要查询在主表中不存在于子查询结果中的记录,使用 `NOT EXISTS` 可能比使用 `LEFT JOIN` 或 `NOT IN` 更直观。 - 使用场景:`EXISTS` 常用于检查关联或匹配的记录,而 `NOT EXISTS` 用于排除这些匹配的记录...
使用exists 判断ERP系统中单据分录中物料是否符合某种条件,否则不予保存。
### 经典SQL查询总结关于Exists, not Exists, IN, not IN 效率的说明 在数据库查询操作中,存在着多种方法来实现相似的功能,但不同的实现方式在性能上可能会有显著差异。本文将深入探讨 SQL 中 `EXISTS`, `NOT ...
继续使用上述表`A`和`B`的例子,如果我们想要找出表`A`中那些不在表`B`中存在的记录,可以使用`NOT EXISTS`: ```sql SELECT id, name FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.id = B.aid); ``` #### ...
exists 和 not exists的详细解释
在SQL查询语句中,Exists语句的使用方式
"EXISTS"子句通常与一个子查询一起使用,它并不关心子查询返回的具体值,而是关注子查询是否能返回至少一行数据。例如: ```sql SELECT * FROM Table1 WHERE EXISTS (SELECT 1 FROM Table2 WHERE Table1.a = Table...
EXISTS 和 IN 都是 Oracle 中的集合操作符,但它们在使用和执行效率上有所不同。本文将深入探讨 EXISTS 和 IN 的使用场景、执行机制和效率问题。 EXISTS 的使用场景和机制 EXISTS 主要用于判断子查询是否存在记录...
在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并通过实例进行解析。 首先,`EXISTS`的语法是:主查询中的条件...
ABAP read 和 line-exists 的使用方法
2. **性能考量**:尽管 `function_exists()` 的使用非常方便,但频繁地进行函数存在性的检查可能会影响程序的性能。在可以预见的情况下,建议尽可能减少这类检查。 3. **与类方法的区别**:需要注意的是,`function...
下面将详细介绍`FileExists`函数的使用方法、相关API以及其在实际开发中的应用。 `FileExists`函数的语法如下: ```delphi function FileExists(const FileName: string): Boolean; ``` 其中`FileName`参数是一个...
IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...
在理解`EXISTS`的使用时,我们需要深入探讨其工作原理、优缺点以及与其他查询操作(如`IN`、`JOIN`)的对比。 一、`EXISTS`的基本用法 `EXISTS`子句通常与子查询一起使用,形式如下: ```sql SELECT column1, ...
exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists 的基本语法为: ```sql SELECT column_name(s) FROM table_name WHERE EXISTS (subquery); ``` 其中,subquery...
虽然`EXISTS`和`IN`、`NOT IN`在很多情况下可以互换使用,但它们在性能上可能存在差异。`EXISTS`通常在处理大量数据时表现更好,因为它一旦找到匹配的记录就会停止,而`IN`和`NOT IN`则会构建并检查一个值列表。对于...
此外,考虑到数据库查询优化器的智能,有时即使代码中使用了`IN`,优化器也会自动转换为`EXISTS`的形式以提升性能。因此,理解并灵活运用这两种子句,对于提高数据库查询效率至关重要。 通过以上分析,我们不难看出...
以下是一个使用EXISTS的实例,假设我们有一个订单表`orders`和一个订单详情表`order_details`,我们想找出所有有商品A的订单: ```sql SELECT * FROM orders WHERE EXISTS ( SELECT 1 FROM order_details WHERE ...