|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL部署迅速,因此移植过程不会导致生产中断。而且,较短的学习曲线可以让你的系统管理员迅速掌握它的运行和维护。而且,MySQL的易于维护和管理意味着目前的职员可以处理目前的工作。你是不是已经为了失掉所必要的信息而重复查询?子选择,也被称为子查询,大概恰是你在寻觅的。SQL的这项功效使你能够在一组了局中查询,制造性地给了局组加以限制,或是在向数据库的单一挪用中将了局与一个有关系的查询做相干。这篇文章中我将给出几个子选择的例子并就什么时候利用他们举行会商。
在一个了局组中搜刮
子选择的理念很复杂:一个选择查询安装在另外一个查询外部,创立一个在单一声明搜刮中不成用的资本。子选择同意查询的兼并,了局组对照的义务落到了数据库中而不是使用软件代码中。
利用这个功效的一个路子是对两个表格中的可比数据专栏中的值举行定位。比方,我的一个数据库有两个表格,Album和Lyric。我能够很简单地经由过程上面的子查询声明来找到每个Metallica的歌曲中包括“justice”的歌名:
SELECTsong_nameFROMAlbum
WHEREband_name=‘Metallica’
ANDsong_nameIN
(SELECTsong_nameFROMLyric
WHEREsong_lyricLIKE‘%justice%’);
这个例子是很复杂的,我从Album表格当选择了一切Metallica的歌曲,接着,我在lyric表格当选择一切包括“justice”的歌曲,最初,我利用IN关头字来从Lyric表格了局组中显现的Album表格中前往歌曲称号。
我利用Lyric表格了局组来给Album表格中的了局做限制。WHERE子句中的子选择部分是完整自包括的,因而我不必要利用比方Album.song_name和Lyric.song_name等完全的专栏称号。我没有从终极了局组的Lyric表格中前往任何值,假如我必要歌曲的Lyric,我会利用一个JOIN声明。
利用NOTIN扫除了局
你可使用NOTIN关头字来取得明白地不被包括在另外一个了局组中的了局。比方,我想要经由过程上面的代码来前往Metallica在“AndJusticeforAll”专辑中不包括单词“justice”的歌曲:
SELECTsong_nameFROMAlbum
WHEREalbum_name=‘AndJusticeforAll’
ANDband_name=‘Metallica’
ANDsong_nameNOTIN
(SELECTsong_nameFROMLyric
WHEREsong_lyricLIKE‘%justice%’);
在后面的SQL代码中,我选择了Metallica的“AndJusticeforAll,”专辑中的一切歌曲,接着是带有歌词中带有“justice”一切歌曲,最初从在Lyric了局组中没有呈现的Album了局组前往了一切歌曲。较之于前往两个查询并利用代码来对照数组,你经由过程一个独自的声明就能够失掉切实的了局。
利用EXISTS来相干了局
偶然你能够经由过程多种路子来会见不异的数据,并且你必要对你的了局举行婚配(或相干)来失掉值的交织区。比方,我能够经由过程搜刮Album表格来失掉Metallica的歌曲列表,但是,我也能够从我的Cover表格中失掉由Damage,Inc扮演的Metallica的歌曲的列表,我能够在两个表格中间接对照查询了局来对值作相干。
SELECTAlbum.song_nameFROMAlbum
WHEREAlbum.band_name=‘Metallica’
ANDEXISTS
(SELECTCover.song_nameFROMCover
WHERECover.band_name=‘Damage,Inc.’
ANDCover.song_name=Album.song_name);
在SQL代码中,我利用完全的专栏称号,这是由于我间接对两个表格作对照,而不单单是将了局组作为一个主动资本来利用。我其实不从Cover表格中前往了局。一些数据库撑持NOTEXISTS关头字来确保你并没有婚配。
利用算计函数来对照
除利用子选择在相干的表格中反省数据,你还能够在一个WHERE子选择中利用算计函数来断定主了局组。比方,我想要核实每个Metallica歌曲在Album表格中的条目。并且,我还想前往短少歌曲的专辑的称号。很便利地,AlbumInfo表格包括的一个专栏(album_tracks)给出了应当有几首歌曲方面的信息。
SELECTAlbumInfo.album_nameFROMAlbumInfo
WHEREAlbumInfo.band_name=‘Metallica’
ANDalbum_tracks
(SELECTCOUNT(*)FROMAlbum
WHEREAlbum.album_name=AlbumInfo.album_name);
如今我已乐成地前往了一切Metallica的专辑中,应有的曲目数目与Album表格中实践的歌曲条目数目不符的专辑称号。
前往子选择了局
假如我仍是体贴每张专辑的曲目数目并必要失掉一个对照呈报怎样办?你能够将一个子选择的了局作为终极了局组的一部分来前往。这个功效常常被算计函数所利用。一般地,对其他表格的会见能够作为你的查询的一部分。下一个例子将前往每张Metallica的专辑,应当包含的曲目数目和在Album表格中包含的条目数目:
SELECTAlbumInfo.album_name,album_tracks,
(SELECTCOUNT(*)FROMAlbum
WHEREAlbum.album_name=AlbumInfo.album_name)
FROMAlbumInfo
WHEREAlbumInfo.band_name=‘Metallica’;
另外一个强无力的例子触及了在AlbumInfo表格中将album_tracks值改动为在Album表格中实践的条目数目:
UPDATEAlbumInfoSETalbum_tracks=
SELECTCOUNT(*)FROMAlbum
WHEREAlbumInfo.album_name=Album.album_name)
WHEREAlbumInfo.band_name=‘Metallica’;
在上两个例子中的子选择声明被看做一个自包括单元来实行。
子选择对照关头字(ALL,SOME,ANY)
除利用尺度查询功效,另有三个关头字可使你将一个表达式值和一个单栏子选择声明了局组作对照,这些关头字前往TRUE或FALSE的Boolean值。ALL关头字请求子选择中一切值都恪守对照运算符。SOME和ANY关头字则请求最少一对。这里是ALL关头字的一个复杂实例。
SELECT*FROMAlbumSales
WHEREalbum_gross>
ALL(SELECTalbum_costsFROMAlbumProduction);
下面的例子将从AlbumSales表格前往在AlbumProduction表格内里支付总额年夜于本钱而临盆最高贵的专辑的一切纪录。假如用ANY替换ALL,声明将前往一切支付总额年夜于最低专辑本钱的专辑纪录。声明=ANY与IN关头字意义是不异的。声明ALL与NOTIN关头字是对等的。关头字ANY和SOME也是同等的。数据库临盆商中对这些关头字的撑持情形是分歧的,因而在呈现成绩时要信任查阅临盆商方面的材料。
谁对尺度化数据布局有疑问?
子选择查询句法是复杂易懂的,而明白什么时候利用它倒是一个难点。假如你已经在尺度化数据布局方面呈现成绩,子选择声明将匡助你取得更深切的懂得。
DBaaS向客户提供了许多与其他云服务相类似的优势:一个灵活的、可扩展的MySQL学习教程、按需服务的平台,它以自助服务和便捷管理为导向,可以对环境中的资源进行调配。 |
|