當需要從不止一個表中查詢所需要的數據時,就要用到join。
最常用的join方式是inner join,其語法規則如下:
???? select 字段名 from 主要資料表 inner join 次要資料表 on <join規則>
以northwind數據庫為例,在QA中輸入如下腳本:
?????select ProductId, ProductName, Suppliers.CompanyName from Products
???????????? ?inner join Suppliers on Products.SupplierId = Suppliers.SupplierID
注意,inner join的主要精神就是?exclusive?,?叫它做排他性吧!?就是講?Join?規則不相符的資料就會被排除掉,?譬如講在?Product?中有一項產品的供貨商代碼?(SupplierId),?沒有出現在?Suppliers?資料表中,?那么這筆記錄便會被排除掉?。
Outer?Join?
這款的?Join?方式是一般人比較少用到的,?甚至有些?SQL?的管理者也從未用過,?這真是一件悲哀的代志,?因為善用?Outer?Join?是可以簡化一些查詢的工作的,?先來看看?Outer?Join?的語法?
Select?<要查詢的字段>?From?<Left?資料表>?
<Left?|?Right>?[Outer]?Join?<Right?資料表>?On?<Join?規則>?
語法中的?Outer?是可以省略的,?例如你可以用?Left?Join?或是?Right?Join,?在本質上,?Outer?Join?是?inclusive,?叫它做包容性吧!?不同于?Inner?Join?的排他性,?因此在?Left?Outer?Join?的查詢結果會包含所有?Left?資料表的資料,?顛倒過來講,?Right?Outer?Join?的查詢就會包含所有?Right?資料表的資料,?接下來我們還是來做些實際操作,?仍然是使用北風數據庫,?但要先做一些小小的修改,?才能達到我們要的結果?
首先要拿掉?Products?資料表的?Foreign?Key,?否則沒有法度在?Products?資料表新增一筆?SupplierId?沒有對映到?Suppliers?資料表的紀錄,?要知影一個資料表的?Constraint?你可以執行?SQL?內建的?sp_helpconstraint?,?在?QA?執行?
sp_helpconstraint?Products?
接下來刪除?FK_Products_Suppliers?這個?Foreign?Key?
Alter?Table?Products?
Drop?Constraint?FK_Products_Suppliers?
再來新增一筆紀錄于?Products?資料表,?SupplierId?使用?50?是因為它并沒有對映到?Suppliers?資料表中的記錄?
Insert?Into?Products?(ProductName,SupplierId,CategoryId)?
values?('Test?Product','50','1')?
現在我們再執行頭前的查詢,?只是將?Inner?Join?改為?Left?Outer?Join?
Select?ProductId,?ProductName,?Suppliers.SupplierId?
From?Products?
Left?Outer?Join?Suppliers?
Products.Suppliers?=?Suppliers.SupplierId?
比較一下兩種?Join?方式的查詢結果,?你應該就會知影其中的差別!?
再來看看?Right?Outer?Join,?請新增下底這筆記錄?
Insert?Into?Suppliers?(CompanyName)?
values?('LearnASP')?
現在請使用?Right?Out?Join?來作查詢,?比較看看查詢的結果和?Inner?Join?有什么不同!?
尋找不相符紀錄?
這里我們來看看如何使用?Out?Join?來找不相符紀錄,?可能是有子紀錄卻沒有父紀錄或是顛倒過來?
Select?Suppliers.CompanyName?From?Products?
Right?Join?Suppliers?
On?Products.SupplierId?=?Suppliers.SupplierId?
Where?Products.SupplierId?is?Null?
執行結果你會找到一筆資料為?LearnASP,?該筆供貨商資料存在,?但基本上已經沒有產品是來自這個供貨商,?想象一下如果不用?Outer?Join?你要怎么以一個?SQL?指令完成同一查詢結果!?知道?Outer?Join?的好用了吧!?再執行?
Select?Products.ProductName?
From?Products?
Left?Join?Suppliers?
On?Products.SupplierId?=?Suppliers.SupplierId?
Where?Suppliers.SupplierId?is?Null?
這個查詢結果你會發現?Test?Product?這項產品竟然找不到供貨商的資料!?