EXISTS结构是一个TSQL函数,这个函数会就圆括号中的子查询返回一个布尔变量。如果子查询返回了任意行的话,这个结构就返回真;否则,它就返回假。这个结构特别适用于查询表中是否存在某些记录。它也非常适合来决定是否在表中运行更新或者插入语句(在这篇文章中,随后我将向大家介绍)。 Listing A中创建了一个表并插入了一些数据,这样你就可以利用这张表来看看EXISTS结构是如何工作的了。Listing B中的脚本使用EXISTS结构在SalesHistory表中检查每一行,并根据已存在的行得到一个变量。这个脚本将返回1(真),这意味着SalesHistory表包含你所要查询的行。在这种情况下,一旦在SalesHistory表中找到了一条记录,EXISTS结构就不会继续查找,并马上返回1。使用EXISTS结构额外的好处就是,一旦它找到满足条件的记录,就会立即返回。Listing C与上面的脚本类似,但是它的返回值是0,因为在这个条件下,EXISTS条件不满足。由于EXISTS结构的工作原理,所以下面的语句所实现的功能是一样的。SELECT * FROM SalesHistoryWHERE EXISTS(SELECT NULL)SELECT * FROM SalesHistoryWHERE 1 = 1SELECT * FROM SalesHistoryWHERE EXISTS(SELECT 1)在刚才的脚本中,你可能会对下面的语句感到迷惑:SELECT * FROM SalesHistoryWHERE EXISTS(SELECT NULL)因为NULL在数据库中是一个值(它是一个未知的值),在出现NULL值的地方EXISTS结构都将返回真。开发者很少使用EXISTS对子查询进行操作。下面的查询将返回同样的结果集,虽然它们的结构不同。第一个查询使用了EXISTS的相关子查询,第二查询在SalesHistory表中,将SalePrice字段与该字段的总平均值进行比较。SELECT * FROM SalesHistory shWHERE EXISTS( SELECT AVG(SalePrice) FROM SalesHistory shi HAVING AVG(SalePrice) > sh.SalePrice) SELECT * FROM SalesHistory shWHERE SalePrice <( SELECT AVG(SalePrice) FROM SalesHistory shi)你可以使用EXISTS操作来决定,是否对某一个单独的记录使用UPDATE或者INSERT语句,就像下面的例子一样:IF EXISTS( SELECT * FROM SalesHistory WHERE SaleDate = '1/1/2001' AND Product = 'Computer' AND SalePrice = 1000) UPDATE TOP(1) SalesHistory SET SalePrice = 1100 WHERE SaleDate = '1/1/2001' AND Product = 'Computer' AND SalePrice = 1000ELSE INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('Computer', '1/1/2001', 1100)虽然在实际的环境中,你可能不会用到这里所介绍的例子,但是它们给你演示了如何利用EXISTS结构来决定使用哪种DML类型。给它一个机会下次,当你写查询语句的时候,请记住要使用EXISTS结构。它很容易掌握,使用也很方便,并且能在程序中给你提供很多便利。******************************************************** 列表A IF OBJECT_ID('SalesHistory','U')>0 DROP TABLE SalesHistory GO CREATE TABLE SalesHistory ( SaleID INT IDENTITY(1,1), Product VARCHAR(30), SaleDate DATETIME, SalePrice MONEY )DECLARE @i SMALLINT SET @i = 1WHILE (@i <= 100)BEGIN INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('Computer', DATEADD(mm, @i, '3/10/2006'), DATEPART(ms, GETDATE()) + (@i + 57) ) INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('BigScreen', DATEADD(mm, @i, '3/2/2006'), DATEPART(ms, GETDATE()) + (@i + 13) ) INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('PoolTable', DATEADD(mm, @i, '2/11/2007'), DATEPART(ms, GETDATE()) + (@i + 29) ) SET @i = @i + 1END GO×××××××××××××××××××××××××××××××××××××××××××列表BDECLARE @TablePopulated BIT SET @TablePopulated = CASE WHEN EXISTS(SELECT * FROM SalesHistory) THEN 1 ELSE 0 END SELECT @TablePopulated
××××××××××××××××××××××××××××××××××××××××××××××××× 列表C DECLARE @TablePopulated BIT SET @TablePopulated = CASE WHEN EXISTS(SELECT * FROM SalesHistory WHERE Product = 'Chair') THEN 1 ELSE 0 END SELECT @TablePopulated
IN:确定给定的值是否与子查询或列表中的值相匹配。 IN 关键字使您得以选择与列表中的任意一个值匹配的行。 当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询: SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR 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)
select * from t1 where exists (select 1 from t2 where id=t1.id); 刚看别的帖子里发的连2表的语句; 为啥不写成select * from t1,t2 where t1.id=t2.id);还有就是 select 1 这样写是什么意思?
exists 是用来判断的,跟它子查询输出没任何关系
那select * from t1 where exists (select 1 from t2 where id=t1.id); 不就相当于与select * from t1 where true/false 那个这个语句是啥意思
exists 表示结果集存在。 not exists 子查询不存在。
select 1 from table;与select anycol(目的表集合中的任意一行) from table;与select * from table 从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。select 1 from 中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
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) 下面是普通的用法: SQL 中IN,NOT IN,EXISTS,NOT EXISTS 的用法和差别: IN:确定给定的值是否与子查询或列表中的值相匹配。 IN 关键字使您得以选择与列表中的任意一个值匹配的行。 当要获得居住在California、Indiana 或Maryland 州的所有作者的姓名和州的列表时, 就需要下列查询: SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR 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 中有关子查询的讨论。 结果类型:Boole an 结果值:如果子查询包含行,则返回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 clause: 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 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 表示不存在
列表A
IF OBJECT_ID('SalesHistory','U')>0 DROP TABLE SalesHistory
GO
CREATE TABLE SalesHistory
( SaleID INT IDENTITY(1,1), Product VARCHAR(30), SaleDate DATETIME, SalePrice MONEY
)DECLARE @i SMALLINT
SET @i = 1WHILE (@i <= 100)BEGIN INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('Computer', DATEADD(mm, @i, '3/10/2006'), DATEPART(ms, GETDATE()) + (@i + 57) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('BigScreen', DATEADD(mm, @i, '3/2/2006'), DATEPART(ms, GETDATE()) + (@i + 13) )
INSERT INTO SalesHistory (Product, SaleDate, SalePrice) VALUES ('PoolTable', DATEADD(mm, @i, '2/11/2007'), DATEPART(ms, GETDATE()) + (@i + 29) )
SET @i = @i + 1END
GO×××××××××××××××××××××××××××××××××××××××××××列表BDECLARE @TablePopulated BIT
SET @TablePopulated = CASE WHEN EXISTS(SELECT * FROM SalesHistory) THEN 1 ELSE 0 END
SELECT @TablePopulated
×××××××××××××××××××××××××××××××××××××××××××××××××
列表C
DECLARE @TablePopulated BIT
SET @TablePopulated = CASE WHEN EXISTS(SELECT * FROM SalesHistory WHERE Product = 'Chair') THEN 1 ELSE 0 END
SELECT @TablePopulated
IN 关键字使您得以选择与列表中的任意一个值匹配的行。
当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR 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)
select *
from t1
where exists (select 1 from t2 where id=t1.id);
刚看别的帖子里发的连2表的语句;
为啥不写成select *
from t1,t2
where t1.id=t2.id);还有就是 select 1 这样写是什么意思?
那select *
from t1
where exists (select 1 from t2 where id=t1.id);
不就相当于与select * from t1 where true/false
那个这个语句是啥意思
not exists 子查询不存在。
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)
下面是普通的用法:
SQL 中IN,NOT IN,EXISTS,NOT EXISTS 的用法和差别:
IN:确定给定的值是否与子查询或列表中的值相匹配。
IN 关键字使您得以选择与列表中的任意一个值匹配的行。
当要获得居住在California、Indiana 或Maryland 州的所有作者的姓名和州的列表时,
就需要下列查询:
SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1
OR CategoryID = 4 OR 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 中有关子查询的讨论。
结果类型:Boole an
结果值:如果子查询包含行,则返回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 clause:
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
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