博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sql中 in 、not in 、exists、not exists 用法和差别
阅读量:5320 次
发布时间:2019-06-14

本文共 4531 字,大约阅读时间需要 15 分钟。

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
=
)
--
->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
中有关子查询的讨论。
结果类型: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 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

转载于:https://www.cnblogs.com/xrxiaolong/articles/2567148.html

你可能感兴趣的文章
IOS Layer的使用
查看>>
Android SurfaceView实战 带你玩转flabby bird (上)
查看>>
Android中使用Handler造成内存泄露的分析和解决
查看>>
android代码控制seekbar的样式
查看>>
servlet
查看>>
SSM集成activiti6.0错误集锦(一)
查看>>
linux下安装python环境
查看>>
pdnovel 看书 读书 听书
查看>>
oracle for loop 代替cursor (转载)
查看>>
Linked List Cycle II
查看>>
工作踩坑记录:JavaScript跳转被缓存
查看>>
个人作业
查看>>
XMLHttpRequest对象
查看>>
c语言选项实现
查看>>
Linux 学习
查看>>
WEB小计
查看>>
九度-题目1214:丑数
查看>>
JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值...
查看>>
python学习:缩进
查看>>
二叉树
查看>>