日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

left join 和 left outer join 的区别【转】

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 left join 和 left outer join 的区别【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通俗的講:??
??A???
left???join???B???的連接的記錄數與A表的記錄數同??
??A???
right???join???B???的連接的記錄數與B表的記錄數同????
??A???
left???join???B???等價B???right???join???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???left???join???b???on???a.Field_K=b.Field_K??
???
??Field_K?????????Field_A?????????Field_K?????????Field_B??????????
??
----------???----------???----------???----------????
??1?????????????????????a?????????????????????1?????????????????????x????????????????????
??
3?????????????????????b?????????????????????NULL???????????????NULL??
??
4?????????????????????c?????????????????????4?????????????????????z????????????????????
???
??
select???a.Field_K,???a.Field_A,???b.Field_K,???b.Field_B??
??
from???a???right???join???b???on???a.Field_K=b.Field_K??
???
??Field_K?????????Field_A?????????Field_K?????????Field_B??????????
??
----------???----------???----------???----------????
??1?????????????????????a?????????????????????1?????????????????????x????????????????????
??
NULL???????????????NULL???????????????2?????????????????????y????????????????????
??
4?????????????????????c?????????????????????4?????????????????????z????? ? --
舉個例子:??
??假設a表和b表的數據是這樣的。??
??a?????????????????????????b????
??id?????name  id?????stock ??
??
1  a?????????????1?????????15??
??
2?????????b?????????????2?????????50??
??
3?????????c??????????????? ??
???
??
select???*???from???a???inner???join???b???on???a.id=b.id??
??這個語法是連接查詢中的內連接,它產生的結果是??
??兩個表相匹配的記錄出現在結果列表中。??
??根據上面的表,出現的結果是這樣的??
??a.id?????name?????b.id?????stock??
??
1  ?????a?????????????1?????????15??
??
2?????????????b?????????????2?????????50??
??
----------------------------??
??select???*???from???a,b???where???a.id=b.id??
??這個語法是內連接的另外一種寫法,其執行結果與inner???
join???一樣??
???
??
--------------------------------????
???
??
select???*???from???a???left/right???join???b???on???a.id=b.id??
??這個是外連接語法中的左外連接或右外連接??
??如果是左外連接的話,它將顯示a表的所有記錄,??
??
select???a.*,b.*???from???a???left???join???b???on???a.id=b.id??
??查詢的結果是這樣的:??
??a.id?????name?????b.id?????stock??
??
1  ???????a?????????1?????????????15??
??
2???????????????b?????????2?????????????50??
??
3???????????????c???????null?????????null ??
??
--------------------------------------------??
??如果是右外連接的話,它將顯示b表的所有記錄,??
??
select???a.*,b.*???from???a???right???join???b???on???a.id=b.id??
??查詢的結果是這樣的:??
??a.id?????name?????b.id?????stock??
??
1  ???????a?????????1?????????????15??
??
2???????????????b?????????2?????????????50???
-- select???a.*,b.*???from???a???left???join???b???on???a.k???=???b.k????
??
select???a.*,b.*???from???a???left???outer???join???b???on???a.k???=b.k??
??
----------上面兩種一樣left???join是left???outer???join的簡寫??
??select???a.*,b.*???from???a???left???inner???join???b???on???a.k???=???b.k????
??沒有這種寫法,錯誤的語句.

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

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

2.2?內連接(Inner?Join
內連接是最常見的一種連接,它頁被稱為普通連接,而E.FCodd最早稱之為自然連接。
下面是ANSI?SQL-92標準
select?*
from??t_institution?i
inner?join?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????????左外連接(Left?Outer?Jion)
select?*
from??t_institution?i
left?outer?join?t_teller?t
on?i.inst_no?=?t.inst_no
其中outer可以省略。
2.3.2????????右外連接(Rigt?Outer?Jion)
select?*
from??t_institution?i
right?outer?join?t_teller?t
on?i.inst_no?=?t.inst_no
2.3.3????????全外連接(Full?Outer)
全外連接返回參與連接的兩個數據集合中的全部數據,無論它們是否具有與之相匹配的行。在功能上,它等價于對這兩個數據集合分別進行左外連接和右外連接,然后再使用消去重復行的并操作將上述兩個結果集合并為一個結果集。
在現實生活中,參照完整性約束可以減少對于全外連接的使用,一般情況下左外連接就足夠了。在數據庫中沒有利用清晰、規范的約束來防范錯誤數據情況下,全外連接就變得非常有用了,你可以使用它來清理數據庫中的數據。
select?*
from??t_institution?i
full?outer?join?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
left?outer?join?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???????天河區???????????????5801???????0001???????tom
5801???????天河區???????????????5801???????0002???????david
5802???????越秀區
5803???????白云區
條件在where子句
select?*
from??t_institution?i
left?outer?join?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???????天河區???????????????5801???????0001???????tom
5801???????天河區???????????????5801???????0002???????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
cross?join?t_teller?t
在交叉連接中沒有on條件子句

3?APPENDIX
3.1?A?參考資料與資源
?????????《Microsoft?SQL?Server?
2000?Bile》Paul?Nielsen
?????????Paul?Nielsen的Web站點
[url]www.isnotnull.com[/url]
3.2?注文章所有SQL在IBM?Informix?Dynamic?Server?Version?9.40.TC2E1測試通過
-- 表A記錄如下:
aID????????aNum
1???????????a20050111
2???????????a20050112
3???????????a20050113
4???????????a20050114
5???????????a20050115

表B記錄如下:
bID????????bName
1????????????2006032401
2???????????2006032402
3???????????2006032403
4???????????2006032404
8???????????2006032408


實驗如下:
1.left?join

sql語句如下:
select?*?from?A
left?join?B
on?A.aID?=?B.bID

結果如下:
aID????????aNum???????????????????bID???????????bName
1????????????a20050111?????????1???????????????2006032401
2????????????a20050112?????????2??????????????2006032402
3????????????a20050113?????????3??????????????2006032403
4????????????a20050114?????????4??????????????2006032404
5????????????a20050115?????????NULL???????NULL
(所影響的行數為?
5?行)

結果說明:
????????
left?join是以A表的記錄為基礎的,A可以看成左表,B可以看成右表,left?join是以左表為準的.
換句話說,左表(A)的記錄將會全部表示出來,而右表(B)只會顯示符合搜索條件的記錄(例子中為:?A.aID?
=?B.bID).
B表記錄不足的地方均為NULL.

2.right?join

sql語句如下:
select?*?from?A
right?join?B
on?A.aID?=?B.bID

結果如下:
aID????????aNum???????????????????bID???????????bName
1????????????a20050111?????????1???????????????2006032401
2????????????a20050112?????????2??????????????2006032402
3????????????a20050113?????????3??????????????2006032403
4????????????a20050114?????????4??????????????2006032404
NULL????NULL???????????????????8??????????????2006032408
(所影響的行數為?
5?行)

結果說明:
????????仔細觀察一下,就會發現,和left?join的結果剛好相反,這次是以右表(B)為基礎的,A表不足的地方用NULL填充.

3.inner?join

sql語句如下:
select?*?from?A
innerjoin?B
on?A.aID?=?B.bID

結果如下:
aID????????aNum???????????????????bID???????????bName
1????????????a20050111?????????1???????????????2006032401
2????????????a20050112?????????2??????????????2006032402
3????????????a20050113?????????3??????????????2006032403
4????????????a20050114?????????4??????????????2006032404

結果說明:
????????很明顯,這里只顯示出了?A.aID?
=?B.bID的記錄.這說明inner?join并不以誰為基礎,它只顯示符合條件的記錄.


-----------------[以下為網上的一點資料]------------------

LEFT?JOIN操作用于在任何的?FROM?子句中,組合來源表的記錄。使用?LEFT?JOIN?運算來創建一個左邊外部聯接。左邊外部聯接將包含了從第一個(左邊)開始的兩個表中的全部記錄,即使在第二個(右邊)表中并沒有相符值的記錄。

語法:
FROM?table1?LEFT?JOIN?table2?ON?table1.field1?compopr?table2.field2

說明:table1,?table2參數用于指定要將記錄組合的表的名稱。
field1,?field2參數指定被聯接的字段的名稱。且這些字段必須有相同的數據類型及包含相同類型的數據,但它們不需要有相同的名稱。
compopr參數指定關系比較運算符:"
=",?"<",?">",?"<=",?">="?或?"<>"。
如果在INNER?JOIN操作中要聯接包含Memo?數據類型或?OLE?Object?數據類型數據的字段,將會發生錯誤。

--

轉載于:https://www.cnblogs.com/kingjiong/archive/2008/11/18/1336159.html

總結

以上是生活随笔為你收集整理的left join 和 left outer join 的区别【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人三级 | 黄黄的网站 | www.黄色网址.com | 久热只有精品 | 国产免费av电影 | 天天色影| 欧美xxx在线观看 | 96精品国产| 国产特级aaaaaa大片 | 特大巨交吊性xxxx | 欧美色一区二区三区在线观看 | 美女网站视频在线观看 | 欧美成年人在线观看 | 91丝袜在线 | 精品人妻久久久久久888不卡 | 亚洲一区不卡在线 | 日韩和欧美的一区二区 | 青青草污 | av午夜激情 | 欧美性猛交xxxx乱大交退制版 | 美女一级黄色片 | 男人资源网站 | 欧美日韩啪啪 | 婷婷色在线视频 | 精品久久久噜噜噜久久久 | 色大师av一区二区三区 | 岛国av片 | 韩国成人在线 | 亚洲国产欧美在线观看 | 本站只有精品 | 亚洲色图丝袜 | 日本中文字幕网 | 18深夜在线观看免费视频 | 天天色天天综合 | 久久久久久国产精品三级玉女聊斋 | 免费看黄色a级片 | 亚洲人成网站999久久久综合 | 国产成人+综合亚洲+天堂 | 国产黄色视 | 久久无码高潮喷水 | 国内精品久久久久久久影视简单 | 91人人澡人人爽 | 韩国精品久久久 | 91视频88av| 欧美播放 | 久久综合网址 | 国内少妇精品 | 女人扒开双腿让男人捅 | 美女羞羞动态图 | 欧美日韩国产一级 | 国产农村妇女精品一区 | 动漫av一区 | 可以看的av网站 | 男生坤坤放进女生坤坤里 | 中文字幕一区二区三区四区不卡 | 波多野结衣av在线播放 | 亚洲午夜精品久久久 | 国产偷拍一区二区 | 国产日本在线观看 | 少妇高潮惨叫久久久久久 | 亚洲永久| 中国性猛交 | 中文字幕在线导航 | 欧美重口另类 | 欧美综合成人 | 久久久久久高清 | 丁香婷婷久久久综合精品国产 | 日韩精品一区二区视频 | 疯狂做受xxxx国产 | 97视频网站 | 正在播放老肥熟妇露脸 | 亚洲精品在线观 | 揄拍自拍 | 91精品观看 | 亚洲成人一区二区三区 | 特级毛片网站 | 亚洲美女性视频 | 中文字幕乱码中文乱码b站 国产一区二区三区在线观看视频 | 五月婷婷中文 | 久久老熟女一区二区三区 | 欧美精品一区二区三区视频 | 人人免费操 | 丁香综合 | 亚洲少妇30p | 精品人妻一区二区免费 | 日韩在线观看视频网站 | 久久观看最新视频 | 成人国产精品一区 | 天堂网站| 日韩图片一区 | 秋霞综合网 | 精品国产69 | 国产精品伦一区二区 | 九九在线| 亚洲经典一区二区三区 | 亚洲AV无码一区二区三区性 | 亚洲精品国产成人久久av盗摄 | 国产视频久久久久 | 美国毛片av |