日期:2011-05-02 15:22:00 来源:本站整理
跟我学MS SQL Server(3)[MSSQL防范]
本文“跟我学MS SQL Server(3)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
(三)用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关键字来确保你并没有匹配.
利用合计函数来对比
除了利用子挑选在相关的表格中查抄数据,你还可以在一个WHERE子挑选中利用合计函数来肯定主后果组.比方,我想要核实每一个Metallica歌曲在Album表格中的条目.并且,我还想返回贫乏歌曲的专辑的名称.很便利地,AlbumInfo表格包含的一个专栏(album_tracks)给出了应当有多少首歌曲方面的信息.
SELECT AlbumInfo.album_name FROM AlbumInfo
WHERE AlbumInfo.band_name = ‘Metallica’
AND album_tracks <>
(SELECT COUNT(*) FROM Album
WHERE Album.album_name = AlbumInfo.album_name);
目前我已经成功地返回了全部Metallica的专辑中,应有的曲目数目与Album表格中实际的歌曲条目数目不符的专辑名称.
返回子挑选后果
假如我还是关心每一张专辑的曲目数目并需求得到一个对比报告怎么办?你可以将一个子挑选的后果作为终究后果组的一部份来返回.这个功效常常被合计函数所利用.普通地,对其他表格的拜候可以作为你的查询的一部份.下一个例子将返回每一张Metallica的专辑,应当包含的曲目数目和在Album表格中包含的条目数目:
SELECT AlbumInfo.album_name, album_tracks,
(SELECT COUNT(*) FROM Album
WHERE Album.album_name = AlbumInfo.album_name)
FROM AlbumInfo
WHERE AlbumInfo.band_name = ‘Metallica’;
另一个强有力的例子触及了在AlbumInfo表格中将album_tracks值改变成在Album表格中实际的条目数目:
UPDATE AlbumInfo SET album_tracks =
SELECT COUNT(*) FROM Album
WHERE AlbumInfo.album_name = Album.album_name)
WHERE AlbumInfo.band_name = ‘Metallica’;
在上两个例子中的子挑选声明被看做一个自包含单位来履行.
子挑选对比关键字(ALL, SOME, ANY)
除了利用尺度查询功效,还有三个关键字可以使你将一个表达式值和一个单栏子挑选声明后果组作对比,这些关键字返回TRUE或FALSE的Boolean值.ALL关键字要求子挑选中全部值都服从对比运算符.SOME和ANY关键字则要求至少一对.这里是ALL关键字的一个简单实例.
SELECT * FROM AlbumSales
WHERE album_gross >
ALL (SELECT album_costs FROM AlbumProduction);
上面的例子将从AlbumSales表格返回在AlbumProduction表格里面付出总额大于本钱而生产最高贵的专辑的全部记录.假如用ANY替换ALL,声明将返回全部付出总额大于最低专辑本钱的专辑记录.声明= ANY与IN关键字意义是相同的.声明<> ALL与NOT IN关键字是对等的.关键字ANY和SOME也是平等的.数据库生产商中对这些关键字的支持情形是差别的,因此在呈现问题时要相信查阅生产商方面的资料.
谁对尺度化数据构造有疑问?
子挑选查询句法是简单易懂的,而晓得什么时刻利用它倒是一个难点.假如你曾经在尺度化数据构造方面呈现问题,子挑选声明将帮忙你得到更深化的理解
以上是“跟我学MS SQL Server(3)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论