oracle中的exists和notexists用法

更新时间:2023-06-19 07:33:23 阅读: 评论:0

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只执⾏⼀次后⾯的⼤表的扫描,每次扫描为真时就返回,继续往下⾛!所以在数据量很⼤时这个效率的差距也是惊⼈的!

本文发布于:2023-06-19 07:33:23,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1045264.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:查询   返回   查找   结果   集合   出版   作者
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图