1. 程式人生 > >內連線(inner join)與外連線(outer join)小結

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

mySQL包含兩種聯接,分別是內連線(inner join)和外連線(out join),但我們又同時聽說過左連線,交叉連線等術語,本文旨在總結這些術語之間的關係。

1. 內連線

首先說明內連線的一個重要性質:內連線查詢結果與表的順序無關
(當然順序可能會發生變化,但是對應關係絕對不會錯亂!!!)

1.1 交叉連線(cross join)

當然,他還有其他的名字,比如:笛卡爾積,交叉積,還有最奇怪的名字“沒有連線”(no join)
這裡寫圖片描述 這裡寫圖片描述
使用下列命令同時查詢玩具表的toy列和男孩表的boy列,得到的結果就是交叉連線

SELECT t.toy,b.boy
FROM
toys AS t CROSS JOIN boys AS b;

其中,CROSS JOIN可以省略,簡寫為

SELECT t.toy,b.boy
FROM toys AS t, boys AS b;

交叉連接回把第一張表的每個值與第二張表的每個值進行匹配,結果如下
這裡寫圖片描述
交叉連線是內連線的一種,你又可以把內連線看作是通過查詢種的題哦呵件已除了某些結果資料行之後的交叉連線。

1.2 相等連線

我們假設每個男孩子都又一個玩具,表之間是一對一的關係,toy_id是外來鍵,資料庫表如下圖
這裡寫圖片描述 這裡寫圖片描述
我們想找到每個男孩兒擁有什麼玩具,只需要將boys表中的toy_id和toys中的主鍵進行比對,就會得到結果

SELECT boys.boy,toys.toy
FROM boys
    INNER JOIN
    toys
ON boys.toy_id=toys.toy_id;

這裡寫圖片描述

1.3 不等連線

我們繼續沿用1.2中的表結構,如果我們想找到每個男孩兒沒有的玩具,這時候我們可以使用不等連線(說白了就是=換成<>,其他沒有什麼區別)

SELECT boys.boy,toys.toy
FROM boys
    INNER JOIN
    toys
ON boys.toy_id<>toys.toy_id
ORDER BY boys.boy;

這裡寫圖片描述

1.4 自然連線

繼續沿用1.2的表結構。。。。。
注意:自然連線只有在連線的列在兩張表中的名稱都相同時才會有用
其實,自然連線就是自動識別相同列的相等連線

SELECT boys.boy,toys.toy
FROM boys
    NATURAL JOIN
    toys
ORDER BY boys.boy;

得到的結果和1.2中的結果完全一樣(順序可能不同)
這裡寫圖片描述

2. 外連線

首先說明外連線不同於內連線的一個性質:外連線查詢與表的順序有關

2.1 左外連線

LEFT OUTER JOIN(左外連線)接收左表的所有行,並用這些行與右表進行匹配
當左表與右表具有一對多的關係時,左外連線特別有用。我們仍然使用之前的表結構

這裡寫圖片描述 這裡寫圖片描述

現在我們利用左外連線找出每個男孩擁有的玩具

SELECT b.boy,t.toy
FROM boys b
LEFT OUTER JOIN toys t
ON b.toy_id=t.toy_id;

LEFT OUTER JOIN左邊的表boys我們稱為左表,右邊的toys稱為右表,所以LEFT OUTER JOIN會取得左表boys的所有行和右表的toys的行進行匹配,結果如下
這裡寫圖片描述

我們的查詢結果和使用內連線時一樣,難道說內連線和外連線沒區別嗎?怎麼可能!!!接下來我們改變一下左表boys的表結構
這裡寫圖片描述 這裡寫圖片描述
我們向boys中新添加了一個Andy,把他的toy_id設定為6,注意,6在toys表中沒有對應的玩具,接下來再次執行上述程式
這裡寫圖片描述

我們發現居然出現了一個NULL,NULL的出現是要告訴我們右表toys中沒有與左表boys中的Andy相匹配的行,也就是說

外連線一定會提供資料行,無論還行能否在另一個表中找出相匹配的行

接著做個實驗,我們調換左表和右表的順序

SELECT b.boy,t.toy
FROM toys t
LEFT OUTER JOIN boys b
ON b.toy_id=t.toy_id;

這裡寫圖片描述

結論:出現NULL的列總是右表中的列

以下時左外連線的實際匹配過程

toys中的玩具hula hoop與boys中的Davey的記錄比對,toys.toys_is=1,boys.toy_is=3
不匹配
toys中的玩具hula hoop與boys中的Bobby的記錄比對,toys.toys_is=1,boys.toy_is=5
不匹配
toys中的玩具hula hoop與boys中的Beaver的記錄比對,toys.toys_is=1,boys.toy_is=2
不匹配
toys中的玩具hula hoop與boys中的Richie的記錄比對,toys.toys_is=1,boys.toy_is=1
成功匹配
…………………省略toy_id=2,3的匹配過程
toys中的玩具harmonica與boys中的Davey的記錄比對,toys.toys_is=4,boys.toy_is=3
不匹配
toys中的玩具harmonica與boys中的Bobby的記錄比對,toys.toys_is=4,boys.toy_is=5
不匹配
toys中的玩具harmonica與boys中的Beaver的記錄比對,toys.toys_is=4,boys.toy_is=2
不匹配
toys中的玩具harmonica與boys中的Richie的記錄比對,toys.toys_is=4,boys.toy_is=1
不匹配
右表查詢完畢,沒有匹配項,因此建立帶有NULL值的行來對應harmonica
……………….省略baseball cards的匹配過程

2.2 右外連線

與左外連線完全相同,只不過是用右表來評價左表
此外:RIGHT OUTER JOIN左側的表為右表!!!!!
這裡只簡單舉一個例子,具體內容參考左外連線

SELECT b.boy,t.toy
FROM toys t
RIGHT OUTER JOIN boys b
ON b.toy_id=t.toy_id;

上述程式碼等同於

SELECT b.boy,t.toy
FROM boys b
LEFT OUTER JOIN toys t
ON b.toy_id=t.toy_id;

這兩種寫法都是都把toys作為右表,把boys作為左表

實驗的表結構如下:
這裡寫圖片描述 這裡寫圖片描述

結果:
這裡寫圖片描述

在實際運用過程中,我們一般傾向於只使用一種,另一種簡單瞭解就好。

相關推薦

連線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 部類inner class詳解

ron isp https nerd 對象 重寫 prot print 元素 優點 ⒈ 內部類對象可以訪問創建它的對象的實現,包括私有數據; ⒉ 內部類不為同一包的其他類所見,具有很好的封裝性; ⒊ 使用內部類可以很方便的編寫事件驅動程序; ⒋ 匿名內部類可以方便的定義運行

有兩個關於部類Inner Class的示例

  有兩個關於內部類(Inner Class)的示例  第一個,演示一個簡單的外部類使用內部類示例: public class OuterClass {     //內部類    &n

靜態巢狀類(Static Nested Class)和部類Inner Class的不同

答:Static Nested Class是被宣告為靜態(static)的內部類,它可以不依賴於外部類例項被例項化。而通常的內部類需要在外部類例項化後才能例項化,其語法看起來挺詭異的,如下所示。 /**  * 撲克類(一副撲克)  * @author 駱昊  *  */pu

向量點乘叉乘概念及幾何意義

向量的內積(點乘) 定義 概括地說,向量的內積(點乘/數量積)。對兩個向量執行點乘運算,就是對這兩個向量對應位一一相乘之後求和的操作,如下所示,對於向量a和向量b:   a和b的點積公式為: 這裡要求一維向量a和向量b的行列數相同。注意:點乘的結果是一個標量(數量

靜態巢狀類Static Nested Class部類Inner Class

一. 什麼是巢狀類及內部類? 可以在一個類的內部定義另一個類, 這種類稱為巢狀類(nested classes),它有兩種型別: 靜態巢狀類和非靜態巢狀類.靜態巢狀類使用很少, 最重要的是非靜態巢狀類, 也即是被稱作為 內部類(inner).巢狀類從JDK1.1

靜態巢狀類(Static Nested Class)和部類Inner Class的不同?

Static Nested Class是被宣告為靜態(static)的內部類,它可以不依賴於外部類例項被例項化。而通常的內部類需要在外部類例項化後才能例項化,其語法看起來挺詭異的,如下所示。 1 2 3 4 5

Java的部類Inner Class和巢狀類Nested Class的區別

內部類是類中類(內部類不為同一包的其他類可見,具有很好的封裝性),分為靜態內部類,成員內部類,區域性內部類以及匿名內部類;區域性內部類寫在方法裡面;用到最多的就是匿名內部類,例子如下: 首先定義一個介面:Interface A{ public void method();}

【Java】部類Inner Class如何建立new

簡單來說,內部類(inner class)指那些類定義程式碼被置於其它類定義中的類;而對於一般的、類定義程式碼不巢狀在其它類定義中的類,稱為頂層(top-level)類。對於一個內部類,包含其定義

關於java部類Inner Class 不斷更新中

java內部類(Inner Class)  Inner Class 即巢狀類,也即C++和C#中的Nested Class。但Java 的Inner Class 與 C++和C#最大的不同之處在於,巢狀類包含一個指向其容器類的引用,可以訪問容器類的成員。以下程式碼演示了這一點

Java部類Inner Class詳解

重新來認識一下內部類的區別 1Static member class(靜態成員類) 類宣告中包含“static”關鍵字的內部類。如以下示例程式碼, Inner1/Inner2/Inner3/Inner4就是Outer的四個靜態成員類。靜態成員類的使用方式與一般頂層類的使用方式

Scala之旅-部類INNER CLASSES和複合型別COMPOUND TYPES

內部類(INNER CLASSES) Scala 中的類可以把其它類作為自己的成員。與內部類是封閉類(enclosing class)成員的 Java 語言相反,Scala 中的內部類被繫結在外部物件上。假設我們希望編譯器在編譯時能阻止我們,混合哪些節點屬於哪

Scala之旅TOUR OF SCALA——部類INNER CLASSES

在 Scala 中,讓類中有其它類作為成員是可能的。與類 Java 的語言內部類作為封閉類的成員相反,,在 Scala 中內部類是被繫結到外部物件上的。假設編譯器在編譯時想阻止我混合哪些結點屬於哪些類。路徑依賴型別提供了一個解決方案。 為了演示不同, 我們迅速

連線INNER JOIN

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

多表查詢,連線隱式、顯示連線、右、基礎表

from子句進行多表查詢 例如:查詢分數資訊,顯示玩家暱稱、遊戲名稱和分數 select user_name as '暱稱', gname as '遊戲名稱', score as '分數'

Mysql——連線笛卡兒積/叉連線連線/等值連線,自然連線連線,全連線,自連線

表t1,t2 笛卡兒積/叉連線; 共n*m條 欄位為兩個之和 內連線/等值連線 自然連線 自然內連線 自然左外連線 自然右外連線 外連線: 左(

CacheBuffer簡化理解

linux 內存技術 Cache(緩存)是“讀”磁盤時針對內存的一種優化技術。系統進程第一次將從硬盤讀取過來的數據緩存到內存中,當第二次讀取時直接從內存中直接讀取,可提高數據讀取速率。Buffer(緩沖)是“寫”磁盤時針對內存的一種優化技術。系統進程想要將數據寫入磁盤,經過內存時,內存會將數據分散實時

PPCPC無線連線Wi-Fi

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

mysql連結連線

1.內連線(或等值連線)       作用:獲取兩個表中欄位匹配關係的記錄。相當於求兩個集合的交集,即共有的部分 注意:MySQL的INNER JOIN(也可以省略 INNER 使用 JOIN,效果一樣) 格式: select 欄