(三)用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
where song_lyric like ‘%justice%’);
在前面的sql代码中,我选择了metallica的“and justice for all,”专辑中的所有歌曲,接着是带有歌词中带有“justice”所有歌曲,最后从在lyric结果组中没有出现的album结果组返回了所有歌曲。较之于返回两个查询并使用代码来比较数组,你通过一个单独的声明就可以得到确切的结果。
使用exists来相关结果
有时你可以通过多种途径来访问相同的数据,而且你需要对你的结果进行匹配(或相关)来得到值的交叉区。例如,我可以通过搜索album表格来得到metallica的歌曲列表,可是,我也可以从我的cover表格中得到由damage, inc表演的metallica的歌曲的列表,我可以在两个表格中直接比较查询结果来对值作相关。
select album.song_name from album
where album.band_name = ‘metallica’
and exists
(select cover.song_name from cover
where cover.band_name = ‘damage, inc.’
and cover.song_name = album.song_name);
在sql代码中,我使用完整的专栏名称,这是因为我直接对两个表格作比较,而不仅仅是将结果组作为一个被动资源来使用。我并不从cover表格中返回结果。一些数据库支持not exists关键字来确保你并没有匹配。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器