`
wyf
  • 浏览: 435601 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

sqlserver in 和Exists 用法

    博客分类:
  • SQL
 
阅读更多

例子如下(即exists返回where后2个比较的where子句中相同值,not exists则返回where子句中不同值):

exists (sql 返回结果集为真)
    not exists (sql 不返回结果集为真)

 

如下:
表A

ID  NAME
A1
A2
A3


表B
ID AID NAME
1  1   B1
2  2   B2
3  2   B3

表A和表B是一对多的关系 A.ID --> B.AID

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID = B.AID)

 
执行结果为
1 A1
2 A2
原因可以按照如下分析

SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 1)
-->SELECT * FROM B WHERE B.AID = 1有值返回真所以有数据
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 2)
-->SELECT * FROM B WHERE B.AID = 2有值返回真所以有数据
SELECT ID , NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID = 3)
-->SELECT * FROM B WHERE B.AID = 3无值返回真所以没有数据

 

NOT EXISTS 就是反过来

SELECT ID , NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID = B.AID)

 
执行结果为
3 A3
 
sql in与exists区别
IN
确定给定的值是否与子查询或列表中的值相匹配。
EXISTS
指定一个子查询,检测行的存在。
比较使用 EXISTS 和 IN 的查询
这个例子比较了两个语义类似的查询。第一个查询使用 EXISTS 而第二个查询使用 IN。注意两个查询返回相同的信息。

USE pubs
GO
SELECT DISTINCT pub_name
FROM publishers
WHERE EXISTS
(SELECT *
FROM titles
WHERE pub_id = publishers.pub_id
AND type = 'business')
GO
-- Or, using the IN clause:
USE pubs
GO
SELECT distinct pub_name
FROM publishers
WHERE pub_id IN
(SELECT pub_id
FROM titles
WHERE type = 'business')
GO

 
下面是任一查询的结果集:
pub_name
----------------------------------------
Algodata Infosystems
New Moon Books
(2 row(s) affected)
 
exits 相当于存在量词:表示集合存在,也就是集合不为空只作用一个集合.例如 exist P 表示P不空时为真; not exist P表示p为空时 为真 in表示一个标量和一元关系的关系。例如:s in P表示当s与P中的某个值相等时 为真; s not in P 表示s与P中的每一个值都不相等时 为真

in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)
1:
select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;
select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的
2:
select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;
select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。

not in 和not exists
如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;
而not extsts 的子查询依然能用到表上的索引。
所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

作者“little-paper”

分享到:
评论

相关推荐

    sql server2005 exists使用方法

    ### SQL Server 2005 EXISTS 使用方法详解 #### 一、EXISTS 子句概述 在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` ...

    sqlserver exists,not exists的用法

    在SQL Server中,`EXISTS` 和 `NOT EXISTS` 是两个非常重要的子查询操作符,它们用于检查子查询是否返回任何行。理解这两个操作符的用法对于编写高效的查询至关重要。 1. `EXISTS` 操作符: `EXISTS` 用于测试子...

    SQL中in参数化的用法

    SQL 中 IN 参数化的用法详解 在 SQL 中,对于 IN 操作符的使用是非常常见的,特别是在 WHERE 子句中规定多个值时。如:select * from A where ID in (1,2,3,4)。但是在实际开发中,我们不可避免地需要处理大量的...

    数据库sqlserver攻关

    NOT IN和NOT EXISTS都用于在SQL查询中排除特定条件的数据行。NOT IN子句用于排除那些在指定列表中的行。NOT EXISTS用于排除子查询返回的行。 ### 字符串截取问题 字符串截取在SQL Server中可以通过多种函数来实现...

    sql server 数据库 语句50条

    根据给定的SQL Server数据库语句,我们可以深入探讨与这些查询相关的知识点,这些知识点涵盖了SQL的基本操作、数据关联、聚合函数、子查询以及条件筛选等多个方面。以下是对这些语句涉及的重要知识点的详细解析: #...

    SQL server2005的高级查询

    本篇文章将深入探讨`UNION`,`GROUP BY`和`EXISTS`这三个关键概念,以及它们在实际应用中的用法。 首先,`UNION`操作符用于合并两个或多个`SELECT`语句的结果集,但会去除重复的行。例如,如果你有两个表,一个是`...

    sql语言的高级用法

    - 使用`EXISTS`和`NOT EXISTS`代替IN或=ANY比较操作符,可以提高查询性能,特别是在大型数据集上,因为它们只需要检查是否存在满足条件的行,而不是返回实际的数据行。 #### 五、连接查询多个表中的数据 连接查询...

    SQL Server 高级sql总结

    在SQL Server中,掌握高级SQL语句是提升数据库管理和数据分析能力的关键。以下是对标题和描述中所述知识点的详细解释: 1. **查询表中的数据**: - `SELECT * FROM 表名`:用于获取表中的所有列和行。 - `SELECT ...

    数据库—SQL Server 2005 查询管理习题集

    【SQL Server 2005查询管理习题集】提供了多方面关于数据库操作的实践练习,涉及到了SQL语言中的SELECT语句、JOIN操作、子查询、聚合函数、INSERT、DELETE和UPDATE等基本操作。以下是对这些习题所涵盖知识点的详细...

    数据库面试题SQL SERSVER

    4. 子查询:理解嵌套查询和关联子查询,以及IN、EXISTS子查询的差异。 三、数据库设计与规范 1. 第三范式(3NF):了解关系数据库设计的基本原则,确保数据冗余最小化,避免更新异常和插入异常。 2. 视图:创建和...

    sqlsever2012

    4. **子查询**:了解嵌套查询的运用,以及IN、EXISTS、ANY和ALL关键字的用法。 5. **视图与存储过程**:创建和使用视图简化查询,编写存储过程以封装复杂逻辑。 6. **事务与并发控制**:理解事务的概念,掌握COMMIT...

    SQL Server 数据库实用SQL语句

    在SQL Server数据库中,了解和熟练运用SQL语句是管理和操作数据的关键。下面将详细解析提供的实用...以上就是SQL Server中涉及的一些实用SQL语句及其背后的原理和用法,掌握这些技巧能更高效地进行数据库操作和管理。

    sql课件sql课件sql课件

    2. 子查询:掌握嵌套查询,以及IN、EXISTS、ANY、ALL等子查询的用法。 3. 分区与窗口函数:利用PARTITION BY进行数据分区,使用RANK、DENSE_RANK、ROW_NUMBER等窗口函数进行排名和计算。 4. 视图与存储过程:创建和...

    SQL2005经典解析

    3. **子查询**:掌握嵌套查询的用法,包括在WHERE子句中使用子查询,以及使用IN、NOT IN、EXISTS和NOT EXISTS等子查询条件。 4. **插入、更新与删除**:学习INSERT、UPDATE和DELETE语句,掌握如何向表中添加新数据...

    百万数据查询优化技巧三十则

    #### 知识点十三:优化 `EXISTS` 和 `IN` 用法 - **区别**:使用 `EXISTS` 代替 `IN` 可以提高查询效率,特别是在子查询返回大量行时更为明显。 - **应用**:例如,将 `SELECT num FROM a WHERE num IN (SELECT num ...

    经典SQL语句大全

    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后...

    SQL语句大全

    备份SQL Server** - **创建备份设备**: ```sql USE master; EXEC sp_addumpdevice 'disk', 'testBack', 'C:\mssql7backup\MyNwind_1.dat'; ``` - **执行备份**: ```sql BACKUP DATABASE pubs TO testBack; ...

    SQL语句经典用法,最常用的且最技巧

    根据给定的文件信息,以下是对SQL语句经典用法的详细解读,涵盖了数据库管理、表操作、数据查询与更新等多个方面,旨在提供一个全面深入的SQL知识框架。 ### 数据库管理 #### 创建数据库 使用`CREATE DATABASE ...

    常用SQL 语句大全

    本篇文章将全面介绍SQL的基础、提升和技巧,适用于SQL Server、MySQL等数据库管理系统。 **第一部分、基础** 1. **创建数据库**: 使用`CREATE DATABASE`语句创建新的数据库,例如 `CREATE DATABASE MyDatabase;` ...

Global site tag (gtag.js) - Google Analytics