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,而且会得到相同的答案。而对子查询来说,情况则并非如此。
本文深入探讨了SQL数据查询中使用IN关键字的子查询与联接的区别和应用,通过实例展示了如何利用子查询筛选特定条件的数据,以及如何通过联接展示多表数据之间的关联。
3277

被折叠的 条评论
为什么被折叠?



