`
favor
  • 浏览: 141887 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

sql查询关建字之-exists, in. all, any, some

阅读更多
SQL中exists和in的区别

两张表——用户表TDefUser(userid,address,phone)和消费表TAccConsume(userid,time,amount),需要查消费超过5000的用户记录。
用exists:
select * from TDefUser
where exists (select 1 from TAccConsume where TDefUser.userid=TAccConsume.userid and TAccConsume.amount>5000)
用in:
select * from TDefUser
where userid in (select userid from TAccConsume where TAccConsume.amount>5000)

通常情况下采用exists要比in效率高。

exists()后面的子查询被称做相关子查询 他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是"select 1"的原因,换成"select 6"完全一样,当然也可以select字段,但是明显效率低些)
其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询.

in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.

比如用户表TDefUser(userid,address,phone),消费表TAccConsume(userid,time,amount)数据如下:

消费表聚集索引是userid,time
数据(注意因为有聚集索引,实际存储也是按以下次序的)
1    2006-1-1   200
1    2006-1-2   300
1    2006-1-2   500
1    2006-1-3   2000
1    2006-1-3   2000
1    2006-1-4   400
1    2006-1-5   500
2    2006-1-1   200
2    2006-1-2   300
2    2006-1-2   500
2    2006-1-3   2000
2    2006-1-3   6000
2    2006-1-4   400
2    2006-1-5   8000
3    2006-1-1   7000
3    2006-1-2   30000
3    2006-1-2   50000
3    2006-1-3   20000

语句:
select * from TDefUser
where exists (select 1 from TAccConsume where TDefUser.userid=TAccConsume.userid and TAccConsume.amount>5000)

对于userid=1,需要找所有记录,才返回false,与第二个语句的效率差不多
对于userid=2,找到2006-1-3的记录,就返回true,比第而个语句的效率高
对于userid=3,第一条记录就返回true,比第二个语句的效率高

语句
select * from TDefUser
where userid in (select userid from TAccConsume where TAccConsume.amount>5000)

返回空记录集
2
2
3
3
3
3

再判断

语句
select * from TDefUser
where userid in (select userid from TAccConsume where userid=TDefUser.userid and amount>5000)

对于userid=1,需要找所有记录,返回空记录集,比较判断
对于userid=2,需要找所有记录,返回记录集
2
2
,比较判断
对于userid=3需要找所有记录,返回记录集
3
3
3
3
,比较判断

表中如果没有聚集索引,对exists每个userid查找的条数都不同,但都是<=第三个语句需要扫描的条数,极端的(比如>5000的都是在最后)与第三个语句效率相似,一般的比第二个语句快,所以说,“一般”exists比in效率高


all, any, some的区别

1.All

对所有数据都满足条件,整个条件才成立
select *
from A
where 5>All(select id from A) --所有的值都要大于5


2.Any

只要有任一条数据满足条件,整个条件成立
select *
from A
where 3>any(select id from A) --当结果中只要有一个值小于3条件就可成立
go


3.Some和Any一样表示的限制相同
分享到:
评论

相关推荐

    T-SQL高级查询

    # some、any、all子句查询示例 查询班级的学生年龄大于班级的学生的年龄的信息 select * from student where cid = 5 and age &gt; all ( select age from student where cid = 3 ); select * from student where ...

    微软内部资料-SQL性能优化5

    In SQL Server 2000, all clustered indexes are unique. If you build a clustered index without specifying the unique keyword, SQL Server forces uniqueness by adding a uniqueifier to the rows when ...

    【3.16数据库作业7】SQL练习4 – SELECT(连接查询、嵌套查询)

    3.带有ANY(SOME)或ALL谓词的子查询 4.带有EXISTS谓词的子查询(重点、难点) ①:连接查询—-中级 1.等值与非等值连接查询 连接查询:同时涉及两个以上的表的查询 连接条件:用来连接两个表的条件 [.] [.] ...

    微软内部资料-SQL性能优化2

    In this module we will discuss Microsoft® SQL Server™ interaction with the operating system and methodology of troubleshooting server-based problems. At the end of this module, you will be able to:...

    win 3.11 for workgroup tcpip支持

    as 'not resolved' even if the name exists in LMHOSTS file &#40;since the driver wasn't even allowed to open LMHOSTS file&#41;. The workaround for such conditions is to put a #PRE against the name in ...

    程序员的SQL金典.rar

    轻举技术之“纲”,张合用之“目”,锻造SQL高可用性数据库应用指南从理论到实践,凝聚SQL主流数据库最前沿的技术要领,本书将深入浅出讨论。  本书特色:主要介绍SQL的语法规则及在实际开发中的应用,并且对SQL在...

    MYSQL常用命令大全

    mysql&gt; LOAD DATA LOCAL INFILE "D:/mysql.txt" INTO TABLE MYTABLE; 9:导入.sql文件命令(例如D:/mysql.sql) mysql&gt;use database; mysql&gt;source d:/mysql.sql; 10:删除表 mysql&gt;drop TABLE MYTABLE; 11:清空表 ...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    查询数据指从数据库中获取所需要的数据。查询数据是数据库操作中最常用,也是最重要的操作。用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句...

    程序员的SQL金典4-8

     8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他类型SQL语句中的子查询应用  8.5.1 子查询在INSERT语句中的应用  8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中...

    VBA与数据库

    •实例3-37 多表查询(子查询WHERE,ANY,SOME) 103 •实例3-38 多表查询(子查询EXISTS,NOT EXISTS) 105 •实例3-39 从两个数据表中查询出都存在的记录 106 •实例3-40 从两个数据表中查询出只存在于某个数据表...

    程序员的SQL金典6-8

     8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他类型SQL语句中的子查询应用  8.5.1 子查询在INSERT语句中的应用  8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中...

    程序员的SQL金典7-8

     8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他类型SQL语句中的子查询应用  8.5.1 子查询在INSERT语句中的应用  8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中...

    程序员的SQL金典3-8

     8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他类型SQL语句中的子查询应用  8.5.1 子查询在INSERT语句中的应用  8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中...

    浅析被遗忘的SQLServer比较运算符修饰词

    SQLServer中有三个关键字可以修改比较运算符:All、Any和Some,其中Some和Any等价。官方的参考文档http://technet.microsoft.com/zh-cn/library/ms187074(SQL.90).aspx 他们作用于比较运算符和子查询之间,作用类似...

    MySQL命令大全

    mysql&gt; LOAD DATA LOCAL INFILE “D:/mysql.txt”INTO TABLE MYTABLE; 9:导入.sql文件命令(例如D:/mysql.sql) mysql&gt;use database; mysql&gt;source d:/mysql.sql; 10:删除表 mysql&gt;drop TABLE MYTABLE; 11:...

    BobBuilder_app

    In this version I have done away with the b+tree and hash index in favor of my own MGIndex structure which for all intents and purposes is superior and the performance numbers speak for themselves....

    Excel VBA与数据库整合应用范例精讲

    实例3-37 多表查询(子查询WHERE,ANY,SOME) 实例3-38 多表查询(子查询EXISTS,NOT EXISTS) 实例3-39 从两个数据表中查询出都存在的记录 实例3-40 从两个数据表中查询出只存在于某个数据表的记录 实例3-41...

    Excel VBA与数据库整合应用范例精讲书及源代码

    实例3-37 多表查询(子查询WHERE,ANY,SOME) 实例3-38 多表查询(子查询EXISTS,NOT EXISTS) 实例3-39 从两个数据表中查询出都存在的记录 实例3-40 从两个数据表中查询出只存在于某个数据表的记录 实例3-41...

Global site tag (gtag.js) - Google Analytics