`
jjklmm
  • 浏览: 55559 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

in、exists在sql语句中的用法 ,讲的很清楚

阅读更多

exists是用来判断是否存在的,当exists(查询)中的查询存在结果时则返回真,否则返回假。not exists则相反。

exists做为where 条件时,是先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断,如果为真则输出当前这一条主查询的结果,否则不输出。

上 面这个列子,先查询出s表的结果,然后将结果代入到s.s#,然后再查询出c表中的结果,再一条一条的代入,感觉有点像for的嵌套循环,第一轮外循环 中,满足内部的not exists条件的c表中的结果集被保留,然后再判断外部的not exists,这次判断是根据内部C表中被保留的结果集的情况,如果结果集为空,则输出当前这一条S表的结果集;然后再进行第二轮大的循环,即取出s表的 第二条结果代入运算。

以上的sql还可以这样理解,最内部的 select * from sc where sc.s#=s.s# and sc.c#=c.c#是查询出所有已经选择过课程的学生及相应课程, select * from c where not exists则是所有没有被选择的课程,在这个基础上的 select sname from s where not exists 则是选取所有没有未选择课程的学生,即选择了所有课程的学员名称。

有两个简单例子,以说明 “exists”和“in”的效率问题

1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;

    T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。

2) select * from T1 where T1.a in (select T2.a from T2) ;

     T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。

exists 用法:

请注意 1)句中的有颜色字体的部分 ,理解其含义;

其中 “select 1 from T2 where T1.a=T2.a” 相当于一个关联表查询,相当于

“select 1 from T1,T2     where T1.a=T2.a”

但是,如果你当当执行 1) 句括号里的语句,是会报语法错误的,这也是使用exists需要注意的地方。

“exists(xxx)”就表示括号里的语句能不能查出记录,它要查的记录是否存在。

因此“select 1”这里的 “1”其实是无关紧要的,换成“*”也没问题,它只在乎括号里的数据能不能查找出来,是否存在这样的记录,如果存在,这 1) 句的where 条件成立。

in 的用法:

继续引用上面的例子

“2) select * from T1 where T1.a in (select T2.a from T2) ”

这里的“in”后面括号里的语句搜索出来的字段的内容一定要相对应,一般来说,T1和T2这两个表的a字段表达的意义应该是一样的,否则这样查没什么意义。

打个比方:T1,T2表都有一个字段,表示工单号,但是T1表示工单号的字段名叫“ticketid”,T2则为“id”,但是其表达的意义是一样的,而且数据格式也是一样的。这时,用 2)的写法就可以这样:

“select * from T1 where T1.ticketid in (select T2.id from T2) ”

Select name from employee where name not in (select name from student);

Select name from employee where not exists (select name from student);

第一句SQL语句的执行效率不如第二句。

通 过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行 子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。 这也就是使用EXISTS比使用IN通常查询速度快的原因。

分享到:
评论

相关推荐

    sql语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句

    SQL语句优化之用EXISTS替代IN、用NOT EXISTS替代NOT IN的语句 SQL语句优化是数据库性能优化的重要方面之一。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。在这种情况下,使用EXISTS...

    exists SQL用法详解、exists和not exists的常用示例

    exists: 括号内子查询sql语句返回结果不为空(即:sql返回的结果为真),子查询的结果不为空这条件成立,执行主sql,否则不执行。 not exists:与exists相反,括号内子查询sql语句返回结果为空(即:sql不返回的结果...

    SQL中IN和EXISTS用法的区别

    如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。 SQL中IN和EXISTS用法的区别 NOT IN sql in与exists区别

    SQL语句集锦.rar

    动态SQL语句.txt 动态语句.txt 区分大小写.txt 去掉重复的列名.txt 取n到m条记录.txt 合并字符串.txt 多列的行转列.sql 多行补充.sql 多表对多表进行统计.txt 大小写转换.txt 子查寻和内联查寻.txt 学生名次.txt ...

    经典SQL语句大全

    9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * ...

    C#ADO.NET中如何在要执行的sql语句中使用变量

    C#ADO.NET 中使用变量在 SQL 语句中的实现方法 C#ADO.NET 中如何在要执行的 SQL 语句中使用变量是非常重要的,因为它可以提高代码的安全性和可维护性。下面我们将详细介绍如何在 C#ADO.NET 中使用变量在 SQL 语句中...

    if exists 用法

    if exists用法,里面包含各种需要用到if exists的情况。

    浅析SQL中WHERE EXISTS子查询.pdf

    浅析SQL中WHERE EXISTS子查询 SQL(Structured Query Language)是一种功能强大、通用的关系数据库语言,而SQL语言的核心是SELECT语句,其中WHERE子句的条件表达式表现得灵活而复杂,和谓词DISJunctive所形成的嵌套...

    MySQL中exists关键字和in的区别有那些? SQL语句优化有那些方法? 查询速度很慢应该怎么办?

    二、SQL语句的优化方式有那些?  1. 尽量避免非操作符的使用。在索引列上用NOT,等非操作符会导致索引失效,数据库管理系统是不会使用索引的,可以将查询语句转换为可以使用索引的查询。  2. 避免对查询列的操作。...

    经典全面的SQL语句大全

     9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)  10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select *...

    关系代数中交运算与差运算的SQL语句实现.pdf

    在SQL中,实现交运算可以使用四种方法:利用交运算的定义、利用并运算、利用in谓词和利用exists谓词。 第一种方法是利用交运算的定义,直接比较两个关系中的元组各个属性值是否相同,判断这条元组是否同时出现在两...

    SQL中查询语句的优化方法.pdf

    常见的查询语句重写方法包括将子查询转换为JOIN、使用 EXISTS 或 IN 语句代替子查询、使用索引hints 等。 3. 数据类型优化 数据类型优化是指对数据类型的选择和调整,以提高查询效率。例如,使用适合的数据类型...

    精通sql结构化查询语句

    10.3.3 使用EXISTS子查询实现两表并集 10.3.4 使用NOT EXISTS的子查询 10.4 相关子查询 10.4.1 使用IN引入相关子查询 10.4.2 使用比较运算符引入相关子查询 10.4.3 在HAVING子句中使用相关子查询 10.5 UNIQUE子查询...

    SQL查询思路优化与语句优化.pdf

    本文还讨论了SQL查询思路优化的方法,包括使用EXISTS和IN代替子查询、使用索引、避免使用SELECT \*、使用合适的连接方式和避免使用OR条件等。这些方法可以提高查询速度,简化管理和提高数据库性能。 关键词:SQL...

    超实用sql语句

    9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * ...

    sql经典语句一部分

    9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * ...

    数据库实验报告 SQL查询 ,子查询组合

    实验目的和要求:,了解SQL语句的数据定义与数据更新功能,了解SQL语句的查询功能,掌握SQL中的数据定义语句的用法,熟练掌握SQL中的插入、修改和删除语句的操作,熟练掌握使用SQL语句进行数据库的简单查询、连接...

    一个查询的SQL语句请教,希望能够用一条SQL语句得到结果

    在本篇知识点中,我们将讨论如何使用SQL语句来解决一个实际的问题,即从表X中去除表Y中关键字相同的数据,再加上表Z中的数据,并对关键字相同的数据进行累计。本篇知识点将详细解释SQL语句的设计思路和实现过程。 ...

    实验4 数据库的嵌套查询实验(2学时).doc

    通过本次实验,学生掌握了在 SQL Server 查询分析器中使用 IN、比较符、ANY 或ALL 和 EXISTS 操作符进行嵌套的查询操作,掌握了 SQL 语言的嵌套查询语句的理解,并加深了对数据库管理系统的理解。

    数据库操作语句大全(sql)

    9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * ...

Global site tag (gtag.js) - Google Analytics