left join 和 left outer join 有什么区别
left join 是left outer join的簡寫,left join默認是outer屬性的。
Inner Join 邏輯運算符返回滿足第一個(頂端)輸入與第二個(底端)輸入聯(lián)接的每一行。這個和用select查詢多表是一樣的效果,所以很少用到;
outer join則會返回每個滿足第一個(頂端)輸入與第二個(底端)輸入的聯(lián)接的行。它還返回任何在第二個輸入中沒有匹配行的第一個輸入中的行。關(guān)鍵就是后面那句,返回的多一些。所以通常意義上的left join就是left outer join
在一個正規(guī)化的數(shù)據(jù)庫環(huán)境中, 我們常會碰到這款情形: 所需的資料并不是放在同一個資料表中, 在這個時候, 你就要用到 Join。
當然 Join 如何將不同的數(shù)據(jù)庫的資料結(jié)合, 還要看你如何使用它, 一共有四種不同的 Join 的方式, 在這篇文章中我們將為你介紹 Inner Join 及 Outer Join 以及其應(yīng)用。
Inner Join
Inner Join 應(yīng)該是最常用的 Join 方式, 它只會傳回符合 Join 規(guī)則的紀錄, 還是先來看看語法:
Select <要選擇的字段> From <主要資料表> <Join 方式> <次要資料表> [On <Join 規(guī)則>]
現(xiàn)在我們利用 MS SQL 內(nèi)建的北風(fēng)數(shù)據(jù)庫來實際練習(xí)一下! 想多了解 MS SQL 的內(nèi)建數(shù)據(jù)庫, 你可以看看 SQL Server 的內(nèi)建數(shù)據(jù)庫這篇文章。
請打開 QA (Query Analyzer), 為了使用北風(fēng)數(shù)據(jù)庫, 請先執(zhí)行 Use Northwind, 然后執(zhí)行
Select ProductId, ProductName, SupplierId From Products
從 Products 產(chǎn)品資料表中取出三個字段, 分別是產(chǎn)品代碼, 產(chǎn)品名稱, 供貨商代碼, 但查詢出來的結(jié)果保證讓你的老板很不滿意, 因為供貨商代碼對于人類實在是無什么意義, 這個時候 Join 就可以幫上忙了, 藉由 Join Suppliers 這個資料表我們便可以查詢到供貨商名稱
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Inner Join Suppliers on
Products.SupplierId= Suppliers.SupplierId
這款的查詢結(jié)果是不是清楚呢! Inner Join 的主要精神就是 exclusive , 叫它做排他性吧! 就是講 Join 規(guī)則不相符的資料就會被排除掉, 譬如講在 Product 中有一項產(chǎn)品的供貨商代碼 (SupplierId), 沒有出現(xiàn)在 Suppliers 資料表中, 那么這筆記錄便會被排除掉
Outer Join
這款的 Join 方式是一般人比較少用到的, 甚至有些 SQL 的管理者也從未用過, 這真是一件悲哀的代志, 因為善用 Outer Join 是可以簡化一些查詢的工作的, 先來看看 Outer Join 的語法
Select <要查詢的字段> From <Left 資料表> <Left | Right> [Outer] Join <Right 資料表> On <Join 規(guī)則>
語法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本質(zhì)上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查詢結(jié)果會包含所有 Left 資料表的資料, 顛倒過來講, Right Outer Join 的查詢就會包含所有 Right 資料表的資料, 接下來我們還是來做些實際操作, 仍然是使用北風(fēng)數(shù)據(jù)庫, 但要先做一些小小的修改, 才能達到我們要的結(jié)果。
首先要拿掉 Products 資料表的 Foreign Key, 否則沒有法度在 Products 資料表新增一筆 SupplierId 沒有對映到 Suppliers 資料表的紀錄, 要知影一個資料表的 Constraint 你可以執(zhí)行 SQL 內(nèi)建的 sp_helpconstraint , 在 QA 執(zhí)行
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')
現(xiàn)在我們再執(zhí)行頭前的查詢, 只是將 Inner Join 改為 Left Outer Join
Select ProductId, ProductName, Suppliers.SupplierId
From Products
Left Outer Join Suppliers
Products.Suppliers = Suppliers.SupplierId
比較一下兩種 Join 方式的查詢結(jié)果, 你應(yīng)該就會知影其中的差別!
再來看看 Right Outer Join, 請新增下底這筆記錄
Insert Into Suppliers (CompanyName)
values ('LearnASP')
現(xiàn)在請使用 Right Out Join 來作查詢, 比較看看查詢的結(jié)果和 Inner Join 有什么不同!
尋找不相符紀錄
這里我們來看看如何使用 Out Join 來找不相符紀錄, 可能是有子紀錄卻沒有父紀錄或是顛倒過來
Select Suppliers.CompanyName From Products
Right Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Products.SupplierId is Null
執(zhí)行結(jié)果你會找到一筆資料為 LearnASP, 該筆供貨商資料存在, 但基本上已經(jīng)沒有產(chǎn)品是來自這個供貨商, 想象一下如果不用 Outer Join 你要怎么以一個 SQL 指令完成同一查詢結(jié)果! 知道 Outer Join 的好用了吧! 再執(zhí)行
Select Products.ProductName
From Products
Left Join Suppliers
On Products.SupplierId = Suppliers.SupplierId
Where Suppliers.SupplierId is Null
這個查詢結(jié)果你會發(fā)現(xiàn) Test Product 這項產(chǎn)品竟然找不到供貨商的資料!
總結(jié)
以上是生活随笔為你收集整理的left join 和 left outer join 有什么区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows 7下Eclipse搭建A
- 下一篇: 自顶向下的数据安全