4.2使用T-SQL實現多表查詢
? ? 前面講述過的所有查詢都是基于單個數據庫表的查詢,如果一個查詢需要對多個表進行操作, 就稱為聯接查詢,聯接查詢的結果集或結果稱為表之間的聯接。
? ? ?聯接查詢實際上是通過各個表之間共同列的關聯性來查詢數據的,它是關系數據庫查詢最主要 的特征。
4.2.1表聯接類型
表聯接類型可以分為內聯接、外聯接和交叉聯接等。
1.內聯接
? ? ?內聯接(inner join)是最常用的一種聯接方式,只返回兩個數據集合之間匹配關系的行,將位 于兩個互相交叉的數據集合中重疊部分以內的數據行聯接起來。 內聯接使用比較運算符進行表間某(些)列數據的比較操作,并列出這些表中與聯接相匹配的數據行
2.外聯接
? ? 外聯接(outer join)是對內聯接的擴充,除了將兩個數據集合中重復部分以內的數據行聯接起 來之外,還可以根據要求返回左側或右側表中非匹配的數據或全部的數據
外聯接分為以下幾種。
1)左外聯接
左外聯接(left join 或 left outer join)的結果集包括左表的所有行,如果左表的某一行在右表中沒有匹配行,則右表返回空值,否則返回相應值。
2)右外聯接
右外聯接(right join 或right outer join)是左外聯接的反向聯接,將返回右表的所有行,如果右 表的某一行在左表中沒有匹配行,則左表返回空值,否則返回相應值。
3)全聯接/完整外聯接
全聯接/完整外聯接(full join 或full outer join)將返回左表和右表中的所有行,當某一行在另 一個表中沒有匹配行時,另一個表返回空值,否則返回相應值。
3.交叉聯接
? ? 交叉聯接就是表之間沒有任何關聯條件,查詢將返回左表與右表挨個聯接的所有行,就是左表 中的每行與右表中的所有行再一一組合,相當于兩個表“相乘”。
? ? 因為交叉聯接應用場合較少,所以本課程不過多進行介紹,也不要求熟練掌握,如果感興趣可 以查閱相關資料。
實驗案例二:多表查詢
實驗環境
某公司有一臺已經安裝了SQLServer 2016的服務器,class數據庫中包含products表和sales表. 表中內容分別如圖1和圖2所示。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖2
需求描述
> 在products表和sales表中查詢產品的名稱,種類、成本,銷售地點和銷售價格。
> 在products表和sales表中查詢銷往海南的產品名稱、種類、成本和銷售價格。
> 在products表和sales表中查詢銷往北京的蔬菜名稱、種類,成本和銷售價格。
實驗步驟
在products 表和 sales表中查詢產品的名稱、種類、成本,銷售地點和銷售價格。
select products.名稱 名稱products,products.種類 種類products,products.成本 成本products,sales.名稱 名稱sales,sales.銷售地點 銷售地點sales,sales.銷售價格 銷售價格salesfrom products inner join sales on products.名稱=sales.名稱
查詢結果
在products表和sales表中查詢銷往海南的產品名稱、種類、成本和銷售價格。
select products.名稱 名稱products,products.種類 種類products,products.成本 成本products,sales.名稱 名稱sales,sales.銷售地點 銷售地點sales,sales.銷售價格 銷售價格sales
from products inner join sales on products.名稱=sales.名稱
where 銷售地點='海南'
查詢結果
?在products表和sales表中查詢銷往北京的蔬菜名稱、種類,成本和銷售價格。
select products.名稱 名稱products,products.種類 種類products,products.成本 成本products,sales.名稱 名稱sales,sales.銷售地點 銷售地點sales,sales.銷售價格 銷售價格sales
from products inner join sales on products.名稱=sales.名稱
where 銷售地點='北京' and 種類='蔬菜'
查詢結果