SQL 语句基础学习 子选择如何来合并查询
你是否曾经为了得到所需要的信 息而反复查询?子选择,也被称为子查询,也许正
是你在寻找的。SQL 的这项功能使你可以在一组结果中查询,创造性地给结果组加以限定,
或是在向数据库的单 一调用中将结果与一个无关系的查询做相关。这篇文章中我将给出几
个子选择的例子并就何时使用他们进行讨论。
在一个结果组中搜索
子选择的理念很简单:一个选择查询安置在另一个查询内部,创建一个在单一声明搜
索中不可用的资源。子选择允许查询的合并,结果组比较的责任落到了数据库中而不是应
用软件代码中。
使用这个功能的一个途径是对两个表格中的可比数据专栏中的值进行定位。例如,我
的一个数据库有两个表格,Album 和 Lyric。我可以很容易地通过下面的子查询声明来找
到每一个 Metallica 的歌曲中包含“justice”的歌名:
SELECT song_name FROM Album
WHERE band_name = ‘Metallica’
AND song_name IN
(SELECT song_name FROM Lyric
WHERE song_lyric LIKE ‘%justice%’);
这个例子是很简单的,我从 Album 表格中选择了所有 Metallica 的歌曲,接着,我
在 lyric 表格中选择所有包含“justice”的歌曲,最后,我使用 IN 关键字来从 Lyric 表格结
果组中显示的 Album 表格中返回歌曲名称。
我使用 Lyric 表格结果组来给 Album 表格中的结果做限定。WHERE 子句中的 子选
择部分是完全自包含的,因此我不需要使用例如 Album.song_name 和
Lyric.song_name 等完整的专栏名称。我没有从最终结果组 的 Lyric 表格中返回任何值,
如果我需要歌曲的 Lyric,我会使用一个 JOIN 声明。
使用 NOT IN 排除结果
你可以使用 NOT IN 关键字来获得明确地不被包含在另一个结果组中的结果。例如,
我想要通过下面的代码来返回 Metallica 在“And Justice for All”专辑中不包含单词
“justice”的歌曲:
SELECT song_name FROM Album
WHERE album_name = ‘And Justice for All’
AND band_name = ‘Metallica’
AND song_name NOT IN
(SELECT song_name FROM Lyric
评论0
最新资源