麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > 文庫 > 正文

SQL的合并查詢

2024-09-07 22:12:21
字體:
來源:轉載
供稿:網友

  你是否曾經為了得到所需要的信息而反復查詢?子選擇,也被稱為子查詢,也許正是你在尋找的。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也是等同的。數據庫生產商中對這些關鍵字的支持情況是不同的,因此在出現問題時要相信查閱生產商方面的資料。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美激情猛片xxxⅹ大3 | 中国老女人一级毛片视频 | 娇喘视频在线观看 | 激情福利视频 | 中文字幕在线观看亚洲 | 久久综合入口 | 91精品国产乱码久久久久久久久 | 久久久久久久久久综合 | 蜜桃视频在线观看免费 | 中文字幕在线观看免费 | av在线免费播放网站 | 爱福利视频 | 综合激情网 | 特大黑人videos与另类娇小 | 国产一级毛片高清视频 | 青草视频在线观看视频 | 久久综合久久美利坚合众国 | 久久精品国产99国产精品亚洲 | 亚洲国产资源 | 美女一级毛片 | www.91视频com| 中文字幕四区 | 伦理三区| av在线观 | 亚洲精品欧美二区三区中文字幕 | 欧美成人精品 | 国产精品久久久久久久久久妇女 | 午夜在线成人 | 毛片在哪看 | 在线成人一区 | 久久精品亚洲成在人线av网址 | 精精国产xxxx视频在线播放7 | 成年片在线观看 | 成人福利在线免费观看 | 国产成人在线观看网站 | 一级黄色影片在线观看 | 操你逼| 视频毛片| 中国hd高清xxxxvideo | 日本中文视频 | 亚洲成人高清在线观看 |