关于SQL sql中的existsS的

您的位置: >
SQL中Exists的用法
学习标签:
本文导读:EXISTS 是SQL子查询中应用的比较多的,和SQL中的 In 子查询类似,EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS subquery
是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见 Select 中有关子查询的讨论。
如果子查询包含行,则返回 TRUE。
EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT ... FROM...), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
Exists是子查询的一种条件形式,通过判断Exists的选择表达式(括号内的部分)的结果,如果存在一行或多行结果记录,则Exists整个子查询结果为真,否则为假。由于我们采用Exists来实现子查询,只需要关心是否存在满足条件的记录,所以选择表达式的选择列表采用*来实现,当然,你也可以在选择列表指明具体的某些列,但这些列将在整个搜索过程中被忽略。
Exists实例
SQL 代码 &&复制
dbo.Res_Coach
EXISTS (select * from
查询原理:
遍历dbo.Res_Coach每一条,同时处理where条件(EXISTS (select * from Res_Coach where Resc_id=0) 判断结果为true或者false),为true时拿出该条,false时,放弃该条记录。
SQL 代码 &&复制
where条件中的子查询和主查询没关系
dbo.Res_Coach
EXISTS (select
dbo.Res_Excellent
where条件中得子查询和主查询有关系
dbo.Res_Coach
EXISTS (select
dbo.Res_Coach
实例备注:不管where条件中得子查询和主查询有没有关系,遍历主查询中得每一条时,判断where条件,exists结果为真,where条件返回true,拿出该条记录,where条件返回false, 不返回该记录。
Exists 和 In 的选择
如果查询的两个表大小相当,那么用in和exists差别不大。如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in
您可能感兴趣
一月好评排行榜转 sql exists和not exists用法
转 sql exists和not exists用法
3:34:00来源:
exists (sql 返回结果集,为真)
not exists (sql 不返回结果集,为真) 如下: 表A ID NAME
1 A1 2 A2 3 A3 表B ID AID NAME 1 1 B1 2 2 B2
3 2 B3 表A和表B是1对多的关系 A.ID =& B.AID SELECT ID,NAME FROM A WHERE EXIST (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 =========================================================================== EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因 SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B) NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别 SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)?????UNION与EXISTS简单用法关键词: UNION:UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 Select DISTINCT)。 union只是将两个结果联结起来一起显示,并不是联结两个表………… UNION 的语法如下: [SQL 语句 1]UNION[SQL 语句 2]UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]UNION ALL[SQL 语句 2]现在以实例来说明SQL Union的用法:(SQL Union All的用法是一样的。只是SQL Union All不会考虑记录是否有重复。)比如:在一个会员表Users中有会员类型有两种,一种为VIP会员,另一种为普通会员,为VIP会员的在VIP字段中为yes,普通会员的在VIP字段为no。要在前台显示10笔会员记录,其中五个最早注册的VIP会员和五个最早注册的普通会员,最早注册的VIP要排在最早注册的普通会员的前面。SQL语句如下:select top 10 * from (select top 5 * from users where vip="yes"?order by id desc union select top 10 * from users where vip="no"?order by id desc) as usersEXISTS:系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists?修改方法如下:in的SQL语句SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime FROM tab_oa_pub WHERE is_check=1 and category_id in (select id from tab_oa_pub_cate where no='1') order by begintime desc修改为exists的SQL语句SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime FROM tab_oa_pub WHERE is_check=1 and exists (select id from tab_oa_pub_cate where tab_oa_pub.category_id=convert(int,no) and no='1') order by begintime desc
南通seo_南通网站开发_这样一个适用ASP.NET的SQL触发器有人会写吗
[转载]sql 数据与excel,acess数据互相导入(已测试)
SQL学习心得---从金蝶的账套文件中学习你真的会玩SQL吗?EXISTS和IN之间的区别 - 文章 - 伯乐在线
& 你真的会玩SQL吗?EXISTS和IN之间的区别
此文是继文章
而补充的,那来探讨下为什么有人会建议有些地方用EXISTS代替in
EXISTS和IN之间的区别
1.EXISTS只返回TRUE或FALSE,不会返回UNKNOWN。
2.IN当遇到包含NULL的情况,那么就会返回UNKNOWN。
当查询的列包含NULL时,NOT EXISTS正常返回TRUE或FALSE。
而NOT IN可能返回空集,如下
1:val IN(val1,val2,…,NULL),永远不会返回FALSE,而是返回TRUE或UNKNOWN。
2:val NOT IN(val1,val2,…,NULL),永远不会返回TRUE,而是返回NOT TRUE或NOT UNKNOWN。
看个示例:
select t.[name] from Test as t
exists (select t1.orderid from Test1 as t1 where t1.[name]=t.[name])
返回 aaa,ccc,ddd
select t.[name] from Test as t
t.[name] in
(select t1.[] from Test1 as t1)
返回 aaa,ccc,ddd
select t.[name] from Test as t
not exists (select t1.orderid from Test1 as t1 where t1.[name]=t.[name])
select t.[name] from Test as t
t.[name] not in
(select t1.[name] from Test1 as t1)
以下对就返回哪三值?
用例数据库文件
/*写一条查询语句,返回在2007年下过订单,而在2008年没有下过订单的客户。
涉及的表:Sales.Customers表和Sales.Orders表。用exists
期望的输出:*/
companyname
----------- ----------------------------------------
Customer KIDPX
Customer WVFAF
Customer FVXPQ
Customer LVJSO
Customer UISOJ
Customer PVDZC
Customer ENQZT
123456789101112
/*写一条查询语句,返回在2007年下过订单,而在2008年没有下过订单的客户。涉及的表:Sales.Customers表和Sales.Orders表。用exists期望的输出:*/custid&&&&&&companyname----------- ----------------------------------------21&&&&&&&&&&Customer KIDPX23&&&&&&&&&&Customer WVFAF33&&&&&&&&&&Customer FVXPQ36&&&&&&&&&&Customer LVJSO43&&&&&&&&&&Customer UISOJ51&&&&&&&&&&Customer PVDZC85&&&&&&&&&&Customer ENQZT
select custid, companyname
from Sales.Customers as C
where EXISTS
from Sales.Orders as O
where O.custid = C.custid
and O.orderdate &= ''
and O.orderdate
and not EXISTS
from Sales.Orders as O
where O.custid = C.custid
and O.orderdate &= ''
and O.orderdate
1.先处理外层查询,从Sales.Customers表别名C中取出一个元组,将元组相关列值custid传给内层查询
2.执行第一层内层查询,Sales.Orders表别名O,应用where子句返回满足条件O.custid = C.custid和orderdate在2007年至2008年
3.执行第二层内层查询,Sales.Orders表别名O应用where子句返回满足条件O.custid = C.custid和orderdate在2008年至2009年的值
4.执行not EXISTS,外查询根据子查询返回的结果集得到满足条件的行
123456789101112131415161718192021
--answer:select custid, companynamefrom Sales.Customers as Cwhere EXISTS&&(select *&& from Sales.Orders as O&& where O.custid = C.custid&&&& and O.orderdate &= ''&&&& and O.orderdate&&'')&&and not EXISTS&&(select *&& from Sales.Orders as O&& where O.custid = C.custid&&&& and O.orderdate &= ''&&&& and O.orderdate&&'');/*1.先处理外层查询,从Sales.Customers表别名C中取出一个元组,将元组相关列值custid传给内层查询2.执行第一层内层查询,Sales.Orders表别名O,应用where子句返回满足条件O.custid = C.custid和orderdate在2007年至2008年3.执行第二层内层查询,Sales.Orders表别名O应用where子句返回满足条件O.custid = C.custid和orderdate在2008年至2009年的值4.执行not EXISTS,外查询根据子查询返回的结果集得到满足条件的行*/
关于作者:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线SQL中EXISTS的用法
SQL中EXISTS的用法
问题:查询学过编号为&01&并且也学过编号为&02&的课程的同学的信息
select&Student.*&from&Student&,&SC&where&Student.S#&=&SC.S#&and&SC.C#&=&'01'&and&exists&(Select&1&from&SC&SC_2&where&SC_2.S#&=&SC.S#&and&SC_2.C#&=&'02')&order&by&Student.S#&&
EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
例表A:TableIn
例表B:TableEx
(二). 比较使用 EXISTS 和 IN 的查询。注意两个查询返回相同的结果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME in(select BNAME from TableEx)
(三). 比较使用 EXISTS 和 = ANY 的查询。注意两个查询返回相同的结果。
select * from TableIn where exists(select BID from TableEx where BNAME=TableIn.ANAME)
select * from TableIn where ANAME=ANY(select BNAME from TableEx)
NOT EXISTS 的作用与 EXISTS 正好相反。如果子查询没有返回行,则满足了 NOT EXISTS 中的 WHERE 子句。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。
EXISTS与IN的使用效率的问题,通常情况下采用exists要比in效率高,因为IN不走索引,但要看实际情况具体使用:
IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'Mysql数据库中的EXISTS和NOT EXISTS - 推酷
Mysql数据库中的EXISTS和NOT EXISTS
我们先介绍下使用的3个数据表:
student数据表:
course数据表:
sc数据表:
EXISTS代表存在量词?。带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或者逻辑假值“false”。
一个例子1.1:
要求:查询选修了课程”操作系统“的同学
SELECT Sname FROM student
WHERE EXISTS
(SELECT * FROM sc,course WHERE Sno=student.Sno o ame=&操作系统&)
使用存在量词EXISTS后,若内层查询结果为非空,则外层的WHERE子句返回值为真,否则返回值为假。
在本例中,首先分析最内层的语句:
SELECT * FROM sc,course WHERE Sno=student.Sno o ame=&操作系统&
本例中的子查询的查询条件依赖于外层父查询的某个属性值(本例中的是Student的Sno值),这个相关子查询的处理过程是:
首先取外层查询中(student)表的第一个元组,根据它与内层查询相关的属性值(Sno值)处理内层查询,若外层的WHERE返回为真,则取外层查询中该元组的Sname放入结果表;
然后再取(student)表的下一组,重复这一过程,直至外层(Student)表全部检查完毕。
查询结果表:
NOT EXISTS
与EXISTS谓词相对的是NOT EXISTS谓词。使用存在量词NOT EXISTS后,若对应查询结果为空,则外层的WHERE子语句返回值为真值,否则返回假值。
要求:查询没有选修课程”操作系统“的同学
SELECT Sname FROM student
WHERE NOT EXISTS
(SELECT * FROM sc,course WHERE Sno=student.Sno o ame=&操作系统&)
使用NOT EXISTS之后,若内层查询结果为非空,则对应的NOT EXISTS不成立,所以对应的WHERE语句也不成立。
在例子1.1中李勇同学对应的记录符合内层的select语句的,所以返回该记录数据,但是对应的NOT EXISTS不成立,WHERE语句也不成立,表示这不是我们要查询的数据。
查询结果表:
例子2.2(这是一个用NOT EXISTS表示全称量词的例子):
要求:查询选修了全部课程的学生姓名。
SELECT Sname
FROM Student
WHERE NOT EXISTS
(SELECT * FROM Course WHERE NOT EXISTS
(SELECT * FROM SC WHERE Sno=Student.Sno AND o)
这个算是一个比较复杂的sql语句了,两个EXISTS和三个WHERE。
这个sql语句可以分为3层,最外层语句,最内层语句,中间层语句。
我们很关心最外层语句,因为结果表中的数据都是最外层的查询的表中的数据,我们更关心最内层的数据,因为最内层的数据包含了全部的判断语句,决定了student表中的那一条记录是我们查询的记录。
我们由内而外进行分析:
最外层的student表中的第一条记录是李勇同学对应的记录,然后中间层的course表的第一条记录是数据库对应的记录,然后对该数据进行判断(最内层的WHERE语句),结果返回真,则内层的NOT EXISTS为假,
然后继续对course表中的下一条记录进行判断,返现NOT EXISTS的值也为假,直到遍历完course表中的所有的数据,内层的NOT EXISTS的值一直都是假,所以中间层的WHERE语句的值也一直都是假。
对应student的李勇记录,course表中的所有的记录对应的中间层的返回值为假,所以最外层的NOT EXISTS对应的值为真,最外层的WHERE的值也为真,则李勇对应的记录符合查询条件,装入结果表中。
然后继续对student表中的下一条记录进行判断,直达student表中的所有数据都遍历完毕。
查询结果表:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 sql exists用法 的文章

 

随机推荐