SQL技巧 使用SQL子選擇來合併查詢

2021-04-17 05:56:08 字數 3602 閱讀 2026

你是否曾經為了得到所需要的資訊而反覆查詢?子選擇,也被稱為子查詢,也許正是你在尋找的。

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也是等同的。資料庫生產商中對這些關鍵字的支援情況是不同的,因此在出現問題時要相信查閱生產商方面的資料。

常用sql使用技巧

like用法 select first name,last name from employee where last name like all e s select first name,last name from employee where last name like any some ...

SQL 使用子查詢

sql還允許建立子查詢,巢狀再其他查詢中的查詢。下面舉幾個栗子來理解一下 現在結合1 2這兩個查詢,把第乙個查詢 返回訂單號的那乙個 變為子查詢 select cust id from orders where order num in select order num from orderitem...

10 使用子查詢 SQL

利用子查詢進行過濾 普通查詢 select order num from orderitems where prod id rgan01 輸出 order num 20007 20008 select cust id from orders where order num in 20007,2000...