SQL中IN语句与EXISTS的区别
类型:电子教程大小:8.5M语言:中文评分:8.3标签:立即下载。先看看关于IN的帮助。
IN 操作符
IN运算符允许我们在WHERE子句中指定多个值。
SQL IN 语法
从表名中选择列名,其中列名在(值1,值2,)原始的表 (在实例中使用:)
人表:IDLAST names first NAME ADDRESS CITY 1 Adams JOHNOXFORD STREET LONDON 2 BUSH GEORGEFTH AVE NEW YORK 3 Carter HOMA SCHANGAN STREET Beijing
IN 操作符实例
现在,我们要从上表中选择姓氏为Adams和Carter的人:我们可以使用以下SELECT语句:
从姓氏在(' ADAMS ',' Carter ')
结果集:
IDLAST NAME first NAME ADDRESS CITY 1 ADAMS JOHNOXFORD Street London 3 Carter HOMA SCHANGAN Street BeijingIN
中的人员中选择*以确定给定值是否与子查询或列表中的值匹配。
语法
test_expression [ NOT ] IN(子查询|表达式[,n ])
参数
测试_表达式是任何有效的微软SQL Server表达式。
子查询
是包含一列结果集的子查询。此列必须与test_expression具有相同的数据类型。
表达式[,[n]
测试匹配的表达式列表。所有表达式必须与test_expression属于同一类型。
结果类型
布尔类型
结果值
如果test_expression等于子查询返回的任何值或逗号分隔列表中的任何表达式,则结果值为TRUE。否则,结果值为假。使用“不输入”来否定返回值。
示例
A. 对比 OR 和 IN
以下示例选择了一个姓名和州列表,其中列出了居住在加利福尼亚州、印第安纳州或马里兰州的所有作者。使用pubs选择au _ lname,来自作者的状态,其中状态=' ca '或状态=' IN '或状态=' MD '但是,您也可以使用IN获得相同的结果:
使用pubs select au _ lname,state from authors,其中state in ('ca ',' in ',' MD ')以下是上述任何查询的结果集:
au _ lname state-White CAG reen CACarson CAO ' Leary cast raight CABennet CADull cagringesby CALocksley CAYokomoto cade France INStringer CAMacF Eat Cakarsen Capanteley MD Hunter Camcbadden CA(受影响的17行)
B. 将 IN 与子查询一起使用
下面的示例在titleauthor表中查找所有版税低于50%的作者的au _ id,然后从authors表中选择au _ id与titleauthor的查询结果相匹配的所有作者的姓名。结果表明,部分作者属于版税低于50%的类别。使用pubs从au _ id所在的作者中选择au _ lname、au _ fname(从版税为50的标题作者中选择au _ id)以下是结果集:
au _ lname au _ fname-Green Marjorie O ' Leary Michael Gringlesby Burt Yokomoto Akiko macfea R Stearns ringer Anne(受影响的6行)
C. 将 NOT IN 与子查询一起使用
not in将找到那些与值列表中的项目不匹配的作者。以下示例查找至少一本书获得至少50%版税的作者姓名:使用pubs从au _ id不在的作者中选择au _ lname、au _ fname(从版税为50的标题作者中选择au _ id)以下是结果集:
au _ lname au _ fname-White Johnson Carson Cheryl street迪恩史密斯meandle Bennett Abraham Dull Ann locxley Charlene Greene morning star blot chet-Halls Reginald del Castillo Innes DeFrance Michel Stringer Dirk Karsen利维雅Panteley Sylvia hunter Sheryl mcbadden heather rINger Albert(受影响的17行)
使用 IN 的子查询
IN(或NOT IN)引入的子查询结果是一个零值或更大的列表。子查询返回结果后,外部查询将利用这些结果。下面的查询将找到所有出版过商业书籍的出版商的名字。
使用pubs从pub _ id所在的发布者中选择pub _ name(从type=' business '的标题中选择pub _ id)以下是结果集:
Pub _ name-Algo数据信息系统新月书(受影响的2行)此陈述分两步评估。首先,内部查询返回已经出版商业书籍的出版商的识别号(1389和0736)。然后,这些值被替换到外部查询中,并且在发布者中找到与上述标识号匹配的名称。
使用pubs从publishers中选择pub _ name,其中pub _ id在(' 1389 ',' 0736 ')中使用联接而不是子查询来处理此问题和类似问题的区别之一是,联接使您能够在结果中显示多个表中的列。例如,如果您想在结果中包含商业书籍的标题,则必须使用联接来查询。
使用pubs选择pub _ name,title来自publisherss内部联接publisher上的titles . pub _ id=titles . pub _ id和type=' business '以下是结果集:
pub _ name _ title-Algodata信息系统繁忙的高管数据库指南Algodata信息系统用电脑烹饪:偷偷摸摸的资产负债表新月书你可以对抗电脑压力!algo数据信息系统直接讨论计算机(受影响的4行)查询显示,连接生成4行,而不是像前面的子查询那样生成两行。
下面是查询的另一个示例,可以用子查询和联接来表示。这个查询找到了所有居住在加州的第二作者的名字,他们获得的版税不到一本书的30%。
使用pubs从作者中选择au _ lname、au _ fname,其中state=' ca '和au _ id in(从标题作者中选择au _ id,其中版税30和au _ ord=2)以下是结果集:
Au _ lname au _ fname -。然后评估外部查询。请注意,内部和外部查询的WHERE子句中都可以包含多个条件。
使用联接,相同的查询可以表达如下:
使用pubs从authors内部联接中选择au _ lname,au _ fname title author on authors . au _ id=title author . au _ id其中state=' ca '和royaltyper30以及au _ ord=2联接始终可以表示为子查询。子查询通常(但不总是)可以表示为连接。这是因为连接是对称的:你可以以任何顺序将表A连接到表B,得到相同的答案。子查询不是这样。
IN和EXISTS的区别
输入确定给定值是否与子查询或列表中的值匹配。EXISTS指定一个子查询来检测行的存在。使用EXISTS和IN比较查询本示例比较两个语义相似的查询。第一个查询使用EXISTS,第二个查询使用IN。请注意,两个查询返回相同的信息。SELECT DISTINCT pub _ name FROM publisher WHERE EXISTS(SELECT * FROM titles WHERE pub _ id=publisher . pub _ id AND type=' business ')-或者,使用IN条款: SELECT DISTINCT pub _ name FROM publisher WHERE pub _ id IN(SELECT pub _ id FROM titles WHERE type=' business ')以下是任何查询的结果集:pub _ name————————————————————————————————————Algo data infosystems new moon books不存在P表示P为空时为真,in表示标量和一元之间的关系。例如,s在P中表示当s和P中的某个值相等时为真;s不在P中意味着当s和P中的每个值不相等时,它是真的。在Oracle SQL中提取数据时,有时会使用in和exists。那么它们之间有什么区别呢?1)性能比较例如,由select * from t1执行的过程,其中x in (select y from T2)相当于: select * from t1,(select distinct y from T2) T2其中t1 . x=T2 . y;如果存在循环if(如果存在循环if(从T2选择null,其中y=x.x )),则通过从t1选择*执行的相对过程(从T2选择null,其中y=x)相当于: x in(从t1选择*)然后如果循环结束表T1不可避免地需要完全扫描,则输出记录结束。适用条件是什么?以子查询(从t2选择y)为考虑方向,如果子查询的结果集很大,需要花费很多时间,但是t1比T1快(从T2选择null,其中y=x.x)。存在更适合在这里使用。当相应子查询的结果集很小时,在。in和existsin应该用来散列外表面和内表面,而exist是循环外表面并每次查询内表面。说存在比存在更有效率是不准确的。如果查询中的两个表大小大致相同,则in和exists之间几乎没有区别。如果两个表一个小,一个大,那么大的子查询表使用的存在,而小的子查询表使用的在:例如,表A(小表),表B(大表)1:从A中选择*其中cc in(从B中选择cc)效率低,使用表A上cc列的索引;从存在的地方选择*(从B中选择cc,其中cc=a. cc)是有效的,并使用表B中cc列的索引.相反,2:从b中选择*其中cc in(从a中选择cc)是高效的,并使用b表上cc列的索引;在存在的地方从b中选择*(在cc=b.cc的地方从a中选择cc)效率低,并且使用表a中cc列的索引.Not in和not exists如果查询语句使用not in,则内外扫描整个表,不使用索引;而非extsts的子查询仍然可以用于对表进行索引。所以,不管哪个表大,用不存在比用不在快。in和=从学生中选择姓名,其中姓名在('张','王','李','赵');结果与从名为“张”或名为“李”或名为“王”或名为“赵”的学生中选择姓名的结果相同
版权声明:SQL中IN语句与EXISTS的区别是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。