1. 程式人生 > >left join 和 left outer join 的區別 ,full outer join

left join 和 left outer join 的區別 ,full outer join

 通俗的講:  
  A   
leftjoin   B   的連線的記錄數與A表的記錄數同  
  A   
rightjoin   B   的連線的記錄數與B表的記錄數同    
  A   
leftjoin   B   等價B   rightjoin   A  
   
   
  
table   A:  
Field_K,   Field_A  
  1                       a  
  
3                       b  
  
4                       c  
   
  
table   B:  
  Field_K,   Field_B  
  
1                       x  
  
2                       y  
  
4                       z  
   
  
select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B  
  
from   a   leftjoin   b   on   a.Field_K=b.Field_K  
   
  Field_K         Field_A         Field_K         Field_B          
  
----------   ----------   ----------   ----------    

1                     a                     1                     x                    
  
3                     b                     NULLNULL  
  
4                     c                     4                     z                    
   
  
select   a.Field_K,   a.Field_A,   b.Field_K,   b.Field_B  
  
from
   a   rightjoin   b   on   a.Field_K=b.Field_K  
   
  Field_K         Field_A         Field_K         Field_B          
  
----------   ----------   ----------   ----------    
1                     a                     1                     x                    
  
NULLNULL2                     y                    
  
4                     c                     4                     z       -- 舉個例子:  
  假設a表和b表的資料是這樣的。  
  a                         b    
  id     name  id     stock   
  
1  a             115  
  
2         b             250  
  
3         c                  
   
  
select*from   a   innerjoin   b   on   a.id=b.id  
  這個語法是連線查詢中的內連線,它產生的結果是  
  兩個表相匹配的記錄出現在結果列表中。  
  根據上面的表,出現的結果是這樣的  
  a.id     name     b.id     stock  
  
1       a             115  
  
2             b             250  
  
----------------------------  
select*from   a,b   where   a.id=b.id  
  這個語法是內連線的另外一種寫法,其執行結果與inner   
join   一樣  
   
  
--------------------------------    
   
  
select*from   a   left/rightjoin   b   on   a.id=b.id  
  這個是外連線語法中的左外連線或右外連線  
  如果是左外連線的話,它將顯示a表的所有記錄,  
  
select   a.*,b.*from   a   leftjoin   b   on   a.id=b.id  
  查詢的結果是這樣的:  
  a.id     name     b.id     stock  
  
1         a         115  
  
2               b         250  
  
3               c       nullnull   
  
--------------------------------------------  
  如果是右外連線的話,它將顯示b表的所有記錄,  
  
select   a.*,b.*from   a   rightjoin   b   on   a.id=b.id  
  查詢的結果是這樣的:  
  a.id     name     b.id     stock  
  
1         a         115  
  
2               b         250


--

select   a.*,b.*from   a   leftjoin   b   on   a.k   =   b.k    
  
select   a.*,b.*from   a   leftouterjoin   b   on   a.k   =b.k  
  
----------上面兩種一樣left   join是left   outer   join的簡寫  
select   a.*,b.*from   a   leftinnerjoin   b   on   a.k   =   b.k    
  沒有這種寫法,錯誤的語句.


--

在你要使用多個left   join的時候  
  比如說10個  
  我們把10個全都寫成left   join的形式  
  然後再SQL讓他自動執行一下,它會把最後一次出現的left   join變成left   
outerjoin  
  所以依此推理,最後一個left   join會以left   
outer   join的形式存在  
  當然,不管變不變對結果的顯示沒有任何影響  
  希望我的實驗能對你有所幫助   


--

使用關係代數合併資料
1 關係代數
合併資料集合的理論基礎是關係代數,它是由E.F.Codd於1970年提出的。
在關係代數的形式化語言中:
        用表、或者資料集合表示關係或者實體。
        用行表示元組。
        用列表示屬性。
關係代數包含以下8個關係運算符
        選取――返回滿足指定條件的行。
        投影――從資料集合中返回指定的列。
        笛卡爾積――是關係的乘法,它將分別來自兩個資料集合中的行以所有可能的方式進行組合。
        並――關係的加法和減法,它可以在行的方向上合併兩個表中的資料,就像把一個表壘在另一個表之上一樣。
        交――返回兩個資料集合所共有的行。
        差――返回只屬於一個數據集合的行。
        連線――在水平方向上合併兩個表,其方法是:將兩個表中在共同資料項上相互匹配的那些行合併起來。
        除――返回兩個資料集之間的精確匹配。
此外,作為一種實現現代關係代數運算的方法,SQL還提供了:
        子查詢――類似於連線,但更靈活;在外部查詢中,方式可以使用表示式、列表或者資料集合的地方都可以使用子查詢的結果。
本章將主要講述多種型別的連線、簡單的和相關的子查詢、幾種型別的並、關係除以及其他的內容。
2 使用連線
2.1 連線型別
在關係代數中,連線運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個資料集合的乘運算,然後對生成的結果集合進行選取運算,確保只把分別來自兩個資料集合並且具有重疊部分的行合併在一起。連線的全部意義在於在水平方向上合併兩個資料集合(通常是表),併產生一個新的結果集合,其方法是將一個數據源中的行於另一個數據源中和它匹配的行組合成一個新元組。
SQL提供了多種型別的連線方式,它們之間的區別在於:從相互交疊的不同資料集合中選擇用於連線的行時所採用的方法不同。
連線型別        定義
內連線        只連線匹配的行
左外連線        包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連線        包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
全外連線        包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
(H)(theta)連線        使用等值以外的條件來匹配左、右兩個表中的行
交叉連線        生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配
在INFORMIX中連線表的查詢
如果FROM子句指定了多於一個表引用,則查詢會連線來自多個表的行。連線條件指定各列之間(每個表至少一列)進行連線的關係。因為正在比較連線條件中的列,所以它們必須具有一致的資料型別。
SELECT語句的FROM子句可以指定以下幾種型別的連線
FROM子句關鍵字        相應的結果集
CROSSJOIN        笛卡爾乘積(所有可能的行對)
INNERJOIN        僅對滿足連線條件的CROSS中的列
LEFTOUTERJOIN        一個表滿足條件的行,和另一個表的所有行
RIGHTOUTERJOIN        與LEFT相同,但兩個表的角色互換
FULLOUTERJOINLEFTOUTER 和 RIGHT OUTER中所有行的超集

2.2 內連線(InnerJoin
內連線是最常見的一種連線,它頁被稱為普通連線,而E.FCodd最早稱之為自然連線。
下面是ANSI SQL-92標準
select*
from  t_institution i
innerjoin t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略。
等價於早期的連線語法
select*
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

2.3 外連線
2.3.1        左外連線(LeftOuter Jion)
select*
from  t_institution i
leftouterjoin t_teller t
on i.inst_no = t.inst_no
其中outer可以省略。
2.3.2        右外連線(Rigt Outer Jion)
select*
from  t_institution i
rightouterjoin t_teller t
on i.inst_no = t.inst_no
2.3.3        全外連線(FullOuter)
全外連線返回參與連線的兩個資料集合中的全部資料,無論它們是否具有與之相匹配的行。在功能上,它等價於對這兩個資料集合分別進行左外連線和右外連線,然後再使用消去重複行的並操作將上述兩個結果集合併為一個結果集。
在現實生活中,參照完整性約束可以減少對於全外連線的使用,一般情況下左外連線就足夠了。在資料庫中沒有利用清晰、規範的約束來防範錯誤資料情況下,全外連線就變得非常有用了,你可以使用它來清理資料庫中的資料。
select*
from  t_institution i
fullouterjoin t_teller t
on i.inst_no = t.inst_no
2.3.4        外連線與條件配合使用
當在內連線查詢中加入條件是,無論是將它加入到join子句,還是加入到where子句,其效果是完全一樣的,但對於外連線情況就不同了。當把條件加入到 join子句時,SQL Server、Informix會返回外連線表的全部行,然後使用指定的條件返回第二個表的行。如果將條件放到where子句中,SQL Server將會首先進行連線操作,然後使用where子句對連線後的行進行篩選。下面的兩個查詢展示了條件放置位子對執行結果的影響:
條件在join子句
select*
from  t_institution i
leftouterjoin t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801
結果是:
inst_no    inst_name            inst_no    teller_no  teller_name
5801       天河區               58010001       tom
5801       天河區               58010002       david
5802       越秀區
5803       白雲區
條件在where子句
select*
from  t_institution i
leftouterjoin t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801
結果是:
inst_no    inst_name            inst_no    teller_no  teller_name
5801       天河區               58010001       tom
5801       天河區               58010002       david

2.4 自身連線
自身連線是指同一個表自己與自己進行連線。這種一元連線通常用於從自反關係(也稱作遞迴關係)中抽取資料。例如人力資源資料庫中僱員與老闆的關係。
下面例子是在機構表中查詢本機構和上級機構的資訊。
select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no

結果是:
superior_inst sup_inst_name        inst_no    inst_name
800           廣州市               5801       天河區
800           廣州市               5802       越秀區
800           廣州市               5803       白雲區

2.5 交叉(無限制) 連線
交叉連線用於對兩個源表進行純關係代數的乘運算。它不使用連線條件來限制結果集合,而是將分別來自兩個資料來源中的行以所有可能的方式進行組合。資料集合中一的每個行都要與資料集合二中的每一個行分別組成一個新的行。例如,如果第一個資料來源中有5個行,而第二個資料來源中有4個行,那麼在它們之間進行交叉連線就會產生20個行。人們將這種型別的結果集稱為笛卡爾乘積。
大多數交叉連線都是由於錯誤操作而造成的;但是它們卻非常適合向資料庫中填充例子資料,或者預先建立一些空行以便為程式執行期間所要填充的資料保留空間。
select*
from  t_institution i
crossjoin t_teller t
在交叉連線中沒有on條件子句

3 APPENDIX
3.1 A 參考資料與資源
        《Microsoft SQL Server 
2000 Bile》Paul Nielsen
        Paul Nielsen的Web站點
[url]www.isnotnull.com[/url]

相關推薦

left join left outer join區別 full outer join

 通俗的講:    A   leftjoin   B   的連線的記錄數與A表的記錄數同    A   rightjoin   B   的連線的記錄數與B表的記錄數同      A   leftjoin   B   等價B   rightjoin   A          

left join left outer join區別---其他功能(inner join 等價於直接,==條件)(左右代表依著一邊的資料條數)

使用關係代數合併資料1 關係代數合併資料集合的理論基礎是關係代數,它是由E.F.Codd於1970年提出的。在關係代數的形式化語言中:        用表、或者資料集合表示關係或者實體。        用行表示元組。        用列表示屬性。關係代數包含以下8個關係運算符        選取――返

★★★ oracle外連線,Oracle中Left Outer Join外關聯(+)的區別

【原】Oracle中Left Outer Join和外關聯(+)的區別 2008-03-23 16:22:37 Oracle的left join中on和where的區別 2009-09-28 15:20 今天遇到一個求某月所有天數的統計結果,如果某日的結果是0

很簡單的例子讓你記住inner joinleft joinright那點區別

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結欄位相等的記錄  right join(右聯接) 返回包括右表中的所有記錄和左表中聯結欄位相等的記錄 inner join(等值連線) 只返回兩個表中聯結欄位相等的行 舉例如下:  -----------

SparkSql中join的實現( inner joinleft outer joinright outer joinfull outer join

Join是SQL語句中的常用操作,良好的表結構能夠將資料分散在不同的表中,使其符合某種正規化,減少表冗餘、更新容錯等。而建立表和表之間關係的最佳方式就是Join操作。 SparkSQL作為大資料領域的SQL實現,自然也對Join操作做了不少優化,今天主要看一下在SparkS

left join left outer join (可解決多個表left join的問題)

使用關係代數合併資料1 關係代數合併資料集合的理論基礎是關係代數,它是由E.F.Codd於1970年提出的。在關係代數的形式化語言中:        用表、或者資料集合表示關係或者實體。        用行表示元組。        用列表示屬性。關係代數包含以下8個關係運算符        選取――返

資料庫優化SQL優化之SELECT優化 ——JOINLEFT JOIN RIGHT JOIN

         在資料庫的應用中,我們經常需要對多表進行連表操作來獲得關係型的資料,因此,應該更加的掌握好 SQL語句的join原理,因為,可以稍一不慎,可能一個不好的join導致資料庫的全表掃描,查詢出大量的 無用的資訊,並且對資料庫效能影響極大。          資

針對於多個inner join或者left join多條件查詢的時候各個inner join 的指向問題

先看一段程式碼吧: <span style="font-size:18px;">SELECT * FROM GOODS1 FR LEFT JOIN GOODS2 MH ON

mysql join left join 對於索引的問題

今天遇到一個left join優化的問題,搞了一下午,中間查了不少資料,對MySQL的查詢計劃還有查詢優化有了更進一步的瞭解,做一個簡單的記錄: select c.* from hotel_info_original c left join hotel_info_colle

INNER JOINLEFT JIONRITHT JION怎樣理解?

declare @a table(cA1 int,cA2 int)declare @b table(cB1 int,cB2 int)insert @a values(1,1)insert @a values(2,2)insert @b values(1,1)insert @b

node的path.join path.resolve的區別

body resolve pos 連接 div img bubuko 技術分享 src 直接上圖: join resolve 明顯可以看出,join只會幫你把路徑連接起來,而resolve會以當前路徑為父路徑來把你提供的路徑連接起來node的path.join 和 pa

path.join()path.resolve()的區別

一級目錄 stat web 串合並 comm 都是 文件絕對路徑 ole 字符 現在寫代碼的時候有時候使用path.join(__dirname,‘dist‘)有時候用path.resolve(__dirname,‘dist‘),都是能拼接處來一個絕對路徑,但是具體有什麽區

SQL關聯查詢 直接join 子查詢的區別

SQL語句執行的時候是有一定順序的。 1.from先選擇一個表,構成一個結果集。 2.where對結果集進行篩選,篩選出需要的資訊形成新的結果集。 3.group by對新的結果集分組。 4.having篩選出想要的分組。 5.select選擇列。 6.order by當所有的條件都弄完了。最後排

SQL關聯查詢 直接join 子查詢的區別

proc 認證 ado con pan exp type rip 圖片 SQL語句執行的時候是有一定順序的。 1.from先選擇一個表,構成一個結果集。 2.where對結果集進行篩選,篩選出需要的信息形成新的結果集。 3.group by對新的結果集分組。 4.havin

path的joinresolve的使用區別

eve join() 例如 dirname image gen dir www. ons 文章目錄 1.連接路徑:path.join([path1][, path2][, ...]) 2.路徑解析:path.resolve([from ...], to) 3.

普通集合泛型集合的區別哈希表字典表的區別隊列堆棧的區別以及堆棧的區別

ear 釋放內存 main 廣泛 棧內存 節點 except {0} 常數 普通集合和泛型集合的區別: 泛型集合與傳統集合相比 類型更安全. 泛型集合無需裝箱拆箱操作. 泛型的重要性. 泛型是未來五年的主流技術 ...通常情況下,建議您使用泛型集合,因為這樣可以獲得類型安全

Java程式設計師月薪3K月薪30K的區別為什麼我只能找到月薪3K?

最近會有這些問題出現在各位程式設計師的眼中:“是不是Java程式設計師已經飽和了,為什麼我月薪3K而有些畢業出去就能拿到月薪3W?”今天我們拋開工作經驗,專案經驗,學歷背景,單從技術點分析,哪些方面判斷憑啥人家月薪30000,你月薪3000? 月薪3K的Java程式設計師 月薪3K的J

JS檔案的**.js**.min.js的區別以及js函式執行的順序

①**.js和**.min.js的區別 引用 Q: .js和.min.js檔案分別是什麼? A: .js是JavaScript 原始碼檔案, .min.js是壓縮版的js檔案。 Q:為什麼要壓縮為.min.js檔案? 減小體積 .min.js檔案經過壓縮,相對編譯前的js檔案體積較小

Verilog HDL 初級入門知識簡單講解(wire reg 型別的區別 always assign 的區別“阻塞”賦值 “非阻塞賦值”的區別

本文轉載自原作者:姚紀元,原文地址已失效        很多剛學Verilog HDL (硬體描述語言)的朋友肯定會對阻塞賦值和非阻塞賦值比較疑惑,那我們就一起來拋開這層迷霧吧。首先我們要理解兩種變數型別 Net Type(連線型)和 

【ROS】cd命令roscd命令的區別並解決環境變數問題

cd命令和roscd命令都是切換到指定目錄的命令。不同的是,cd是Linux系統的命令,在使用時必須指定目標目錄的完整路徑;而roscd是ros系統中的命令,它可以直接切換到指定目錄(ros系統中的軟體包),而不需要輸入冗長的完整路徑。 例如,要切換到roscpp這個軟體包,兩個命令的格式分