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也是等同的。資料庫生產商中對這些關鍵字的支援情況是不同的,因此在出現問題時要相信查閱生產商方面的資料。
誰對標準化資料結構有疑問?
子選擇查詢句法是簡單易懂的,而懂得何時使用它卻是一個難點。如果你曾經在標準化資料結構方面出現問題,子選擇宣告將幫助你獲得更深入的瞭解。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-580355/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MSSQL基礎教程:多表格查詢SQL
- SQL語言基礎(子查詢)SQL
- 【學習】SQL基礎-007-子查詢SQL
- MSSQL基礎教程:SELECT語句選項SQL
- 合併查詢
- SQL的基礎查詢案例SQL
- MySQL資料庫基礎——多表查詢:子查詢MySql資料庫
- Sql介紹 與 Sql基礎查詢SQL
- sql子查詢SQL
- mysql求交集:UNION ALL合併查詢,inner join內連線查詢,IN/EXISTS子查詢MySql
- 【SQL】Oracle查詢轉換之檢視合併SQLOracle
- 查詢策略選擇:使用 JOIN 還是多條 SQL 語句SQL
- T-SQL進階:超越基礎 Level 2:編寫子查詢SQL
- SQL Server調優系列基礎篇(子查詢運算總結)SQLServer
- SQL查詢的:子查詢和多表查詢SQL
- SQL--子查詢SQL
- SQL -- 使用聯結還是子查詢?SQL
- MySQL學習(三) SQL基礎查詢MySql
- SQL語言基礎(高階查詢)SQL
- 多表聯合查詢 - 基於註解SQLSQL
- MySQL 合併查詢union 查詢出的行合併到一個表中MySql
- Sql Server系列:子查詢SQLServer
- git合併分支,如果選擇性的合併檔案?Git
- 使用子查詢
- OCP課程8:SQL之使用子查詢SQL
- MySQL 合併查詢join 查詢出的不同列合併到一個表中MySql
- SQL基礎的查詢語句烈鉍SQL
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- sql語法相關子查詢與非相關子查詢SQL
- Python基礎教程05 - 縮排和選擇Python
- 水煮oracle31----連線查詢&合併查詢Oracle
- 史上最簡單MySQL教程詳解(基礎篇)之多表聯合查詢MySql
- MySQL全面瓦解11:子查詢和組合查詢MySql
- jsoup Java HTML解析器:使用選擇器語法來查詢元素JSJavaHTML
- sql遞迴查詢子級SQL遞迴
- Mysql基礎+select5種子句 + 子查詢MySql
- 使用並查集處理集合的合併和查詢問題並查集
- SQL 三表聯合查詢SQL