內聯接(INNER JOIN)()
該查詢從兩個表(LOCATION表和BOOKS表)中獲取數據並且僅僅獲取那些匹配的數據行使用等於操作符的INNER JOIN表示僅獲取匹配的行匹配的規則是LOCATION表中數據行的FK_BK_LOC列值必須與BOOKS表中BK_ID列的值相同
試一試從RDBMS中提取聯接的數據
下面將對LIBRARY數據庫中的圖書按照關鍵詞進行查詢目前SEARCHTAGS表中包含了所有類型的關鍵詞這些關鍵詞是在將圖書添加到數據庫中時創建的中間表SEARCH_BOOKS用於在BOOKS表和要搜索的關鍵詞之間建立關系使用一個JOIN查詢可以搜索出LIBRARY數據庫中以關鍵詞SQL標記的所有圖書下面將使用Microsoft SQL Server數據庫引擎來實現該功能對於其他任何RDBMS也可以運行這些代碼
() 打開Microsoft SQL Server Management Studio使用Windows身份驗證連接到數據庫
() 單擊位於左上角的New Query按鈕輸入下面的SQL查詢
SELECT
bk_title AS title
FROM books bk INNER JOIN search_books sb
ON bkbk_id = sbbk_id
INNER JOIN searchTags st
ON sbtag_id = sttag_id
WHERE sttag_value = SQL
() 單擊工具欄上的Execute按鈕並觀察返回的查詢結果
title
SQL Bible
Wiley Pathways: Introduction to Database Management
Microsoft SQL Server Weekend Crash Course
SQL Functions: Programmers Reference
( row(s) affected)
示例說明
該查詢具有兩個JOIN語句第一個JOIN語句從BOOKS表和SEARCH_BOOKS表聯接數據第二個JOIN語句從SEARCH_BOOKS表和SEARCHTAGS表聯接數據
該查詢將從所有表對中獲取數據並將其聯接為一個單一的結果集然後再對其應用篩選條件tag_value = SQL最後將所有滿足條件的記錄返回給客戶端
可以采用多種辦法來獲得相同的結果集下面是使用嵌套子查詢的一個例子
SELECT bk_title as title FROM books where bk_id IN
(SELECT bk_id FROM search_books WHERE tag_id IN
(SELECT tag_id FROM searchTags where tag_value = SQL))
讀者可以自行判斷哪一種代碼更容易理解是使用JOIN的代碼還是使用子查詢的代碼?筆者認為前者更好理解一些
在後面的小節中還將回到這一問題並分析在結果集中包含空的書架或者包含未放置圖書的情況下面讓我們來介紹使用相同的基本JOIN規則將更多的數據包含在最終的結果集中
JOIN語法相對較新盡管RDBMS已經認可JOIN語法很多年了但數據庫章中使用的任何查詢都可以使用WHERE子句重寫RDBMS依然能理解這樣的查詢例如
SELECT
loc_bookcase
loc_shelf
loc_position_left
bk_title
FROM location
WHERE locationfk_bk_loc = booksbk_id
使用新語法的動機是什麼呢?首先新語法已經被SQL標准委員會批准目前本書中討論的所有RDBMS都支持JOIN語法其次RDBMS僅僅是為了向後兼容而提供了對舊語法的支持在以後的版本中有可能廢棄該語法可以看到新語法增強了代碼的可讀性可以預防某些常見的SQL錯誤例如無意間產生笛卡爾積的查詢這將在本章後面討論
返回目錄SQL實戰新手入門
編輯推薦
Oracle索引技術
高性能MySQL
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/SQL/201311/16473.html