熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

跟我學SQL:使用SQL子選擇來合並查詢

2013-11-15 14:40:22  來源: SQL Server 

  在一個結果組中搜索
  
  子選擇的理念很簡單一個選擇查詢安置在另一個查詢內部創建一個在單一聲明搜索中不可用的資源子選擇允許查詢的合並結果組比較的責任落到了數據庫中而不是應用軟件代碼中
  
  使用這個功能的一個途徑是對兩個表格中的可比數據專欄中的值進行定位例如我的一個數據庫有兩個表格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子句中的子選擇部分是完全自包含的因此我不需要使用例如Albumsong_name和Lyricsong_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 Albumsong_name FROM Album
  WHERE Albumband_name = Metallica
  AND EXISTS
  (SELECT Coversong_name FROM Cover
  WHERE Coverband_name = Damage Inc
  AND Coversong_name = Albumsong_name);
  
  在SQL代碼中我使用完整的專欄名稱這是因為我直接對兩個表格作比較而不僅僅是將結果組作為一個被動資源來使用我並不從Cover表格中返回結果一些數據庫支持NOT EXISTS關鍵字來確保你並沒有匹配
  使用合計函數來比較
  除了使用子選擇在相關的表格中檢查數據你還可以在一個WHERE子選擇中使用合計函數來確定主結果組例如我想要核實每一個Metallica歌曲在Album表格中的條目而且我還想返回缺少歌曲的專輯的名稱很方便地AlbumInfo表格包含的一個專欄(album_tracks)給出了應該有多少首歌曲方面的信息
  
  SELECT AlbumInfoalbum_name FROM AlbumInfo
  WHERE AlbumInfoband_name = Metallica
  AND album_tracks <>
  (SELECT COUNT(*) FROM Album
  WHERE Albumalbum_name = AlbumInfoalbum_name);
  
  現在我已經成功地返回了所有Metallica的專輯中應有的曲目數量與Album表格中實際的歌曲條目數量不符的專輯名稱
  
  返回子選擇結果
  如果我還是關心每一張專輯的曲目數量並需要得到一個比較報告怎麼辦?你可以將一個子選擇的結果作為最終結果組的一部分來返回這個功能經常被合計函數所使用通常地對其他表格的訪問可以作為你的查詢的一部分下一個例子將返回每一張Metallica的專輯應該包括的曲目數量和在Album表格中包括的條目數量
  
  SELECT AlbumInfoalbum_name album_tracks
  (SELECT COUNT(*) FROM Album
  WHERE Albumalbum_name = AlbumInfoalbum_name)
  FROM AlbumInfo
  WHERE AlbumInfoband_name = Metallica;
  
  另一個強有力的例子涉及了在AlbumInfo表格中將album_tracks值改變為在Album表格中實際的條目數量
  
  UPDATE AlbumInfo SET album_tracks =
  SELECT COUNT(*) FROM Album
  WHERE AlbumInfoalbum_name = Albumalbum_name)
  WHERE AlbumInfoband_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也是等同的數據庫生產商中對這些關鍵字的支持情況是不同的因此在出現問題時要相信查閱生產商方面的資料
  

From:http://tw.wingwit.com/Article/program/SQLServer/201311/22157.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.