SQL技巧:使用SQL子选择来合并查询

2016-01-29 15:50 6 1 收藏

SQL技巧:使用SQL子选择来合并查询,SQL技巧:使用SQL子选择来合并查询

【 tulaoshi.com - SQLServer 】

你是否曾经为了得到所需要的信息而反复查询?子选择,也被称为子查询,也许正是你在寻找的。SQL的这项功能使你可以在一组结果中查询,创造性地给结果组加以限定,或是在向数据库的单一调用中将结果与一个无关系的查询做相关。这篇文章中我将给出几个子选择的例子并就何时使用他们进行讨论。

在一个结果组中搜索

子选择的理念很简单:一个选择查询安置在另一个查询内部,创建一个在单一声明搜索中不可用的资源。子选择允许查询的合并,结果组比较的责任落到了数据库中而不是应用软件代码中。

使用这个功能的一个途径是对两个表格中的可比数据专栏中的值进行定位。例如,我的一个数据库有两个表格,Album和Lyric。我可以很容易地通过下面的子查询声明来找到每一个Metallica的歌曲中包含“justice”的歌名:

SELECT song_name FROM AlbumWHERE band_name = ‘Metallica’AND song_name IN(SELECT song_name FROM LyricWHERE 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 AlbumWHERE album_name = ‘And Justice for All’AND band_name = ‘Metallica’AND song_name NOT IN(SELECT song_name FROM LyricWHERE song_lyric LIKE ‘%justice%’);

在前面的SQL代码中,我选择了Metallica的“And Justice for All,”专辑中的所有歌曲,接着是带有歌词中带有“justice”所有歌曲,最后从在Lyric结果组中没有出现的Album结果组返回了所有歌曲。较之于返回两个查询并使用代码来比较数组,你通过一个单独的声明就可以得到确切的结果。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

使用EXISTS来相关结果

有时你可以通过多种途径来访问相同的数据,而且你需要对你的结果进行匹配(或相关)来得到值的交叉区。例如,我可以通过搜索Album表格来得到Metallica的歌曲列表,可是,我也可以从我的Cover表格中得到由Damage, Inc表演的Metallica的歌曲的列表,我可以在两个表格中直接比较查询结果来对值作相关。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

SELECT Album.song_name FROM AlbumWHERE Album.band_name = ‘Metallica’AND EXISTS(SELECT Cover.song_name FROM CoverWHERE Cover.band_name = ‘Damage, Inc.’AND Cover.song_name = Album.song_name);

在SQL代码中,我使用完整的专栏名称,这是因为我直接对两个表格作比较,而不仅仅是将结果组作为一个被动资源来使用。我并不从Cover表格中返回结果。一些数据库支持NOT EXISTS关键字来确保你并没有匹配。

使用合计函数来比较

除了使用子选择在相关的表格中检查数据,你还可以

来源:http://www.tulaoshi.com/n/20160129/1496566.html

延伸阅读
连接可以在Select 语句的FROM子句或Where子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与Where子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。 SQL-92标准所定义的FROM子句的连接语法格式为: FROM join_table join_type join_table [ON (join_condition)] ...
标签: MySQL mysql数据库
2006-10-8 表数据:tab1 id    name  num A     a         9 A     b       11 B     f         7 B     g  ...
新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。) 一、外连接 外连接可分为:左连接、右连接、完全外连接。 1、左连接  left join 或 left outer join SQL语句:select * from...
标签: SQLServer
可以使用sql-server企业管理器进行建立,注意其中的rpc及rpc out两项,也可以使用sql语句来完成定义,主要涉及到三个存储过程 sp_addlinkedserver,sp_serveroption和sp_addlinkedsrvlogin,以下是三个存储过程的语法: sp_addlinkedserver 创建一个链接的服务器,使其允许对分布式的、针对 OLE DB 数据源的异类查询进行...
标签: SQLServer
由于XML本身的诸多优点,XML技术已被广泛的使用,目前的好多软件技术同XML紧密相关,比如微软的。net 平台对xml提供了强大的支持,提供System.Xml以及其子命名空间下的类型来操作xml.Ado.net通过核心类型DataSet出色的把关系型数据库同xml进行了紧密集成。由于平常许多开发人员使用。net 来操作Sql server的到数据集后再转换成xml,所以往往忽略...

经验教程

110

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部