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

left join 和 left outer join 的區別---其他功能(inner 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]
3.2 註文章所有SQL在IBM Informix Dynamic Server Version 9.40.TC2E1測試通過

相關推薦

left join left outer join區別---其他功能inner join 等價直接,==條件左右代表一邊資料

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

SQL 查詢語句inner joinleft join 之間的區別

SQL查詢語句: 1. 查詢中用到的關鍵詞主要包含六個,書寫順序為 select--from--where--group by--having--order by 2. 但是他們的執行順序為  from--where--group by--having--select-

SparkSql中join的實現 inner joinleft outer join,right outer join,full outer join

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

join連接的五種方式的簡單使用案例Inner join,Left join,Right join

oracle inner join left join right join full join 1.內連接Inner join內連接是基於連接謂詞將倆張表(如A和B)的列組合到一起產生新的結果表 ,在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。 下面是一個簡單的使用案例

sql join 大彙總inner join 內聯、full join 全連、 left join 左連、right join 右連 、cross join 交叉連以及union

一、定義兩個表 ,結構如下 create table A (     id  nvarchar(50) null,     names nvarchar(50) null )  create table B (

sql join 大彙總inner join 內聯、full join 全連、 left join 左連、right join 右連 、cross join 交叉連以及union

一、定義兩個表 ,結構如下 create table A (     id  nvarchar(50) null,     names nvarchar(50) null )  create table B (     id  nvarchar(50) null,   

Hibernate Criteria 關聯查詢inner joinleft join

實體類 User 、Dept 。 每個User都有對一個Dept屬性 -----------------------------------------------------------model類-------------------------------------

內連線inner join與外連線(outer join)小結

mySQL包含兩種聯接,分別是內連線(inner join)和外連線(out join),但我們又同時聽說過左連線,交叉連線等術語,本文旨在總結這些術語之間的關係。 1. 內連線 首先說明內連線的一個重要性質:內連線查詢結果與表的順序無關 (當然順序可

Oracle 內連線inner join、外連線outer join、全連線full join

http://blog.itpub.net/30175262/viewspace-1472290/之前沒有用過 full outer join,第一次用,學習一下Student表Color表Oracle中的連線可分為,內連線(inner join)、外連線(outer joi

Java中String直接賦字符串new String的區別 如String str=new String("a")String str = "a"有什麽區別

this his The tin ase name ++ 常量池 TE 百度的面試官問 String A="ABC"; String B=new String("ABC"); 這兩個值,A,B 是否相等,如果都往HashSet裏面放,能放下嗎? 答:A==B 不等,

內連線INNER JOIN

內連線組合兩張表,並且基於兩張表中的關聯關係來連線它們。使用內連線需要指定表中哪些欄位組成關聯關係,並且需要指定基於什麼條件進行連線。內連線的語法如下: INNER JOIN table_name ON condition 其中table_name 為被關聯的表名,condition則為進行連線時

Idea資料庫操作Inner Join

注:本操作僅在Idea中進行(並未在MySQL workbench中哦) join內連線(inner)概述: 基於連線謂詞將兩張表組合在一起,從而產生新的一張表(類似與操作,取其相同部分的屬性)。 1、首先,你要有兩個表: 表1:people 表2:students

Oracle聯合多個子查詢inner join

select aaa.*,bbb.xh from (select xn,xq,kcdm,kcmc,xf,xkkh,kcxz from jxrwbview where xn='2017-2018' group by xn,xq,kcdm,kcmc,xf,xkkh,kcxz ) aaa inner joi

Inner Join, Left Outer JoinAssociation的區別

outer 驗證 sta alt str 圖片 信息 class 能夠 測試用的CDS視圖的源代碼,第8行用Inner Join連接TJ02T, 後者存放了所有系統狀態的ID和描述。 Inner Join測試結果:對於那些在TJ02T裏沒有維護描述信息的狀態,它們不會出現

★★★ 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

left join left outer join區別 ,full outer join

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

SQL的JOIN語法解析(inner join, left join, right join, full outer join區別)

問題 至少 caption 左連接 右連接 class hole pty lock 總的來說,四種JOIN的使用/區別可以描述為: left join 會從左表(shop)那裏返回所有的記錄,即使在右表(sale_detail)中沒有匹配的行。 right oute

sql中inexist語句的區別?(補充了left joinright join)

有用 表數 from 部分匹配 exist 循環 targe 從表 exists in和exists(摘錄自百度)in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。如果兩個表中一個較小,一個是大表,則子查詢表大的用

left join on後面 加條件where後面加條件區別 inner joinleft join right join之間的區別

上一篇對三個join的語句做了一個區別,如果連最基礎的都不清楚,那麼請先參考:inner join 與 left join 和right join之間的區別 碰巧在專案中遇到了一個sql,是left join和where的條件限制的區別,想了好半天,這裡做一下筆記,萬一以後忘記了方便檢視。 話不多說,直接

MySQL連線查詢(inner join,left joinright join區別

關係資料庫由多個相關表組成,這些表使用已知為外來鍵列的常用列連結在一起。 因此,從業務角度來看,每個表中的資料是不完整的。 例如,在示例資料庫(yiibaidb)中,使用orderNumber列連結的orders和orderdetails表。 orders和orderdetails表的 ER 圖如下所示