left join 和 left outer join 的區別---其他功能(inner join 等價於直接,和==條件)(左右代表依著一邊的資料條數)
1 關係代數
合併資料集合的理論基礎是關係代數,它是由E.F.Codd於1970年提出的。
在關係代數的形式化語言中:
用表、或者資料集合表示關係或者實體。
用行表示元組。
用列表示屬性。
關係代數包含以下8個關係運算符
選取――返回滿足指定條件的行。
投影――從資料集合中返回指定的列。
笛卡爾積――是關係的乘法,它將分別來自兩個資料集合中的行以所有可能的方式進行組合。
並――關係的加法和減法,它可以在行的方向上合併兩個表中的資料,就像把一個表壘在另一個表之上一樣。
交――返回兩個資料集合所共有的行。
連線――在水平方向上合併兩個表,其方法是:將兩個表中在共同資料項上相互匹配的那些行合併起來。
除――返回兩個資料集之間的精確匹配。
此外,作為一種實現現代關係代數運算的方法,SQL還提供了:
子查詢――類似於連線,但更靈活;在外部查詢中,方式可以使用表示式、列表或者資料集合的地方都可以使用子查詢的結果。
本章將主要講述多種型別的連線、簡單的和相關的子查詢、幾種型別的並、關係除以及其他的內容。
2 使用連線
2.1 連線型別
在關係代數中,連線運算是由一個笛卡爾積運算和一個選取運算構成的。首先用笛卡爾積完成對兩個資料集合的乘運算,然後對生成的結果集合進行選取運算,確保只把分別來自兩個資料集合並且具有重疊部分的行合併在一起。連線的全部意義在於在水平方向上合併兩個資料集合(通常是表),併產生一個新的結果集合,其方法是將一個數據源中的行於另一個數據源中和它匹配的行組合成一個新元組。
連線型別 定義
內連線 只連線匹配的行
左外連線 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行
右外連線 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行
全外連線 包含左、右兩個表的全部行,不管另外一邊的表中是否存在與它們匹配的行。
(H)(theta)連線 使用等值以外的條件來匹配左、右兩個表中的行
交叉連線 生成笛卡爾積-它不使用任何匹配或者選取條件,而是直接將一個數據源中的每個行與另一個數據源的每個行都一一匹配
如果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 join 與 left join) 之間的區別
SQL查詢語句: 1. 查詢中用到的關鍵詞主要包含六個,書寫順序為 select--from--where--group by--having--order by 2. 但是他們的執行順序為 from--where--group by--having--select-
SparkSql中join的實現( inner join,left 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 join 與 left 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 Join和Association的區別
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中in和exist語句的區別?(補充了left join和right join)
有用 表數 from 部分匹配 exist 循環 targe 從表 exists in和exists(摘錄自百度)in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。如果兩個表中一個較小,一個是大表,則子查詢表大的用
left join on後面 加條件和where後面加條件的區別 inner join 與 left join 和right join之間的區別
上一篇對三個join的語句做了一個區別,如果連最基礎的都不清楚,那麼請先參考:inner join 與 left join 和right join之間的區別 碰巧在專案中遇到了一個sql,是left join和where的條件限制的區別,想了好半天,這裡做一下筆記,萬一以後忘記了方便檢視。 話不多說,直接
MySQL連線查詢(inner join,left join和right join的區別)
關係資料庫由多個相關表組成,這些表使用已知為外來鍵列的常用列連結在一起。 因此,從業務角度來看,每個表中的資料是不完整的。 例如,在示例資料庫(yiibaidb)中,使用orderNumber列連結的orders和orderdetails表。 orders和orderdetails表的 ER 圖如下所示