where in的用法 SQL 数据查询
使用
IN
的子查询
通过
IN(或
NOT
IN)引入的子查询结果是一列零值或更多值。子查询返回结果之后,外部查询将利用这些结果。
下列查询会找到所有曾出版过商业书籍的出版商的名称。
USE
pubs
SELECT
pub_name
FROM
publishers
WHERE
pub_id
IN
(SELECT
pub_id
FROM
titles
WHERE
type
=
'business')
下面是结果集:
pub_name
----------------------------------------
Algodata
Infosystems
New
Moon
Books
(2
row(s)
affected)
该语句分两步进行评估。首先,内部查询返回出版过商业书籍的出版商的标识号(1389
和
0736)。然后,这些值被代入外部查询中,在
publishers
中查找与上述标识号相配的名字。
USE
pubs
SELECT
pub_name
FROM
publishers
WHERE
pub_id
in
('1389',
'0736')
使用联接而不使用子查询处理该问题及类似问题的一个不同之处在于,联接使您可以在结果中显示多个表中的列。例如,如果要在结果中包括商业书籍的书名,就必须使用联接来查询。
USE
pubs
SELECT
pub_name,
title
FROM
publishers
INNER
JOIN
titles
ON
publishers.pub_id
=
titles.pub_id
AND
type
=
'business'
下面是结果集:
pub_name
title
----------------------
-------------------------------------------------
Algodata
Infosystems
The
Busy
Executive's
Database
Guide
Algodata
Infosystems
Cooking
with
Computers:
Surreptitious
Balance
Sheets
New
Moon
Books
You
Can
Combat
Computer
Stress!
Algodata
Infosystems
Straight
Talk
About
Computers
(4
row(s)
affected)
该查询显示出联接产生四行,而不是像前面的子查询那样产生两行。
下面是查询的另一个示例,它既可用子查询亦可用联接来表达。该查询查找所有住在
California,并且收到的某本书的版税低于
30
%
的第二作者的姓名。
USE
pubs
SELECT
au_lname,
au_fname
FROM
authors
WHERE
state
=
'CA'
AND
au_id
IN
(SELECT
au_id
FROM
titleauthor
WHERE
royaltyper
<
30
AND
au_ord
=
2)
下面是结果集:
au_lname
au_fname
----------------------------------------
--------------------
MacFeather
Stearns
(1
row(s)
affected)
评估内部查询后,产生符合子查询限定条件的三个作者的
ID
号。然后评估外部查询。注意,在内部和外部查询的
WHERE
子句中,都可以包括多个条件。
使用联接,同一查询可以用如下方式表示:
USE
pubs
SELECT
au_lname,
au_fname
FROM
authors
INNER
JOIN
titleauthor
ON
authors.au_id
=
titleauthor.au_id
WHERE
state
=
'CA'
AND
royaltyper
<
30
AND
au_ord
=
2
联接总是可以表示为子查询。子查询经常(但不总是)可以表示为联接。这是因为联接是对称的:可以以任意顺序将表
A
联接到表
B,而且会得到相同的答案。而对子查询来说,情况则并非如此。