oracle中的exists和notexists⽤法
exists(sql 返回结果集为真)
not exists (sql 不返回结果集为真)
如下:
表A
ID NAME
1 A1
2 A2
3 A3
表B
ID AID NAME
党的团结11 B1大象英文
22 B2
32 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)
下⾯是普通的⽤法:
SQL中IN,NOT IN,EXISTS,NOT EXISTS的⽤法和差别:
IN:确定给定的值是否与⼦查询或列表中的值相匹配。
IN关键字使您得以选择与列表中的任意⼀个值匹配的⾏。
当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID =1OR CategoryID =4OR CategoryID =5
然⽽,如果使⽤IN,少键⼊⼀些字符也可以得到同样的结果:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)
IN关键字之后的项⽬必须⽤逗号隔开,并且括在括号中。
下列查询在 titleauthor 表中查找在任⼀种书中得到的版税少于50%的所有作者的 au_id,然后从 authors 表中选择 au_id 与
titleauthor 查询结果匹配的所有作者的姓名:
SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper <50)
结果显⽰有⼀些作者属于少于50%的⼀类。
NOT IN:通过NOT IN关键字引⼊的⼦查询也返回⼀列零值或更多值。
以下查询查找没有出版过商业书籍的出版商的名称。
SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type ='business')
使⽤EXISTS和NOT EXISTS引⼊的⼦查询可⽤于两种集合原理的操作:交集与差集。
发际线男孩两个集合的交集包含同时属于两个原集合的所有元素。
差集包含只属于两个集合中的第⼀个集合的元素。
EXISTS:指定⼀个⼦查询,检测⾏的存在。
本⽰例所⽰查询查找由位于以字母 B 开头的城市中的任⼀出版商出版的书名:
SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT*FROM titles WHERE pub_id = publishers.pub_id AND type = 'business')
SELECT distinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type ='business')
两者的区别:
EXISTS:后⾯可以是整句的查询语句如:SELECT*FROM titles
IN:后⾯只能是对单列:SELECT pub_id FROM titles
NOT EXISTS:
例如,要查找不出版商业书籍的出版商的名称:
SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT*FROM titles WHERE pub_id = publishers.pub_id AND type =
'business')
下⾯的查询查找已经不销售的书的名称:
爱人韩国线 下⾯的查询查找已经不销售的书的名称:
SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)
语法
EXISTS subquery
参数
subquery:是⼀个受限的SELECT语句 (不允许有COMPUTE⼦句和INTO关键字)。有关更多信息,请
参见SELECT中有关⼦查询的讨论。
结果类型:Boolean
良心少一点是什么字
结果值:如果⼦查询包含⾏,则返回 TRUE。
⽰例
A. 在⼦查询中使⽤NULL仍然返回结果集
这个例⼦在⼦查询中指定NULL,并返回结果集,通过使⽤EXISTS仍取值为 TRUE。
USE Northwind
GO
SELECT CategoryName
FROM Categories
WHERE EXISTS (SELECT NULL)
ORDER BY CategoryName ASC
GO
B. ⽐较使⽤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 clau:
天空之城口琴简谱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
C.⽐较使⽤EXISTS和=ANY的查询
本⽰例显⽰查找与出版商住在同⼀城市中的作者的两种查询⽅法:第⼀种⽅法使⽤=ANY,第⼆种⽅法使⽤EXISTS。注意这两种⽅法返回相同的信息。USE pubs
GO
SELECT au_lname, au_fname
FROM authors
WHERE exists
(SELECT*
FROM publishers
WHERE authors.city = publishers.city)
GO
-- Or, using = ANY
USE pubs
GO
GO
SELECT au_lname, au_fname
FROM authors
WHERE city =ANY
(SELECT city
FROM publishers)
GO
暖味关系D.⽐较使⽤EXISTS和IN的查询
本⽰例所⽰查询查找由位于以字母 B 开头的城市中的任⼀出版商出版的书名:
USE pubs
GO
SELECT title
FROM titles
WHERE EXISTS
(SELECT*
FROM publishers
WHERE pub_id = titles.pub_id
AND city LIKE \'B%\')
GO
-- Or, using IN:
USE pubs
GO
SELECT title
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE city LIKE \'B%\')
GO
E. 使⽤NOT EXISTS
NOT EXISTS的作⽤与EXISTS正相反。如果⼦查询没有返回⾏,则满⾜NOT EXISTS中的WHERE⼦句。本⽰例查找不出版商业书籍的出版商的名称:USE pubs
GO
SELECT pub_name
FROM publishers
WHERE NOT EXISTS
(SELECT*
FROM titles
WHERE pub_id = publishers.pub_id
AND type = \'business\')
ORDER BY pub_name
GO
not exists⽐not in速度快(在not exists⼦查询⾥的语句⽐较复杂时,有可能⽐not in慢),最好将not in 转化成not exists。另外,要注意的是,in或者not in⾥⾯都不能有null值,否则会得不到结果。
如果数据量很⼩的话,in和exists的差距是忽略不计的,但数据量很⼤时差距就很⼤了!in会在先执⾏⼀次后⾯的⼤表中的全表扫描,然后⽣成⼀个新的虚表再进⾏全表扫描,⽽exists只执⾏⼀次后⾯的⼤表的扫描,每次扫描为真时就返回,继续往下⾛!所以在数据量很⼤时这个效率的差距也是惊⼈的!