1. 程式人生 > >SQL的內連線與外連線

SQL的內連線與外連線

     有兩個表A和表B。
  表A結構如下:
  Aid:int;標識種子,主鍵,自增ID
  Aname:varchar
  資料情況,即用select * from A出來的記錄情況如下圖1所示:

表B結構如下:
  Bid:int;標識種子,主鍵,自增ID
  Bnameid:int
  資料情況,即用select * from B出來的記錄情況如下圖2所示:

圖2:B表資料

  為了把Bid和Aid加以區分,不讓大家有誤解,所以把Bid的起始種子設定為100。
  有SQL基本知識的人都知道,兩個表要做連線,就必須有個連線欄位,從上表中的資料可以看出,在A表中的Aid和B表中的Bnameid就是兩個連線欄位。
  下圖3說明了連線的所有記錄集之間的關係:



圖3:連線關係圖
現在我們對內連線和外連線一一講解。
  1.內連線:利用內連線可獲取兩表的公共部分的記錄,即圖3的記錄集C
  語句如下:Select * from A JOIN B ON A.Aid=B.Bnameid
  執行結果如下圖4所示:

圖4:內連線資料

  其實select * from A,B where A.Aid=B.Bnameid與Select * from A JOIN B ON A.Aid=B.Bnameid的執行結果是一樣的。
  2.外連線:外連線分為兩種,一種是左連線(Left JOIN)和右連線(Right JOIN)
  (1)左連線(Left JOIN):即圖3公共部分記錄集C+表A記錄集A1。
  語句如下:select * from A Left JOIN B ON A.Aid=B.Bnameid
  執行結果如下圖5所示:


圖5:左連線資料

  說明:
  在語句中,A在B的左邊,並且是Left Join,所以其運算方式為:A左連線B的記錄=圖3公共部分記錄集C+表A記錄集A1
  在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8
  圖1中即表A所有記錄集A中存在的Aid為:1 2 3 4 5 6 7 8 9
  表A記錄集A1中存在的Aid=(圖1中即A表中所有Aid)-(圖3中即記錄集C中存在的Aid),最終得出為:1 4 5 9
  由此得出圖5中A左連線B的記錄=圖3公共部分記錄集C+表A記錄集A1,
  最終得出的結果圖5中可以看出Bnameid及Bid非NULL的記錄都為圖3公共部分記錄集C中的記錄;Bnameid及Bid為NULL的Aid為1 4 5 9的四筆記錄就是表A記錄集A1中存在的Aid。
  (2)右連線(Right JOIN):即圖3公共部分記錄集C+表B記錄集B1。
  語句如下:select * from A Right JOIN B ON A.Aid=B.Bnameid
 執行結果如下圖6所示:
圖6:右連線資料

  說明:
  在語句中,A在B的左邊,並且是Right Join,所以其運算方式為:A右連線B的記錄=圖3公共部分記錄集C+表B記錄集B1
  在圖3中即記錄集C中的存在的Aid為:2 3 6 7 8
  圖2中即表B所有記錄集B中存在的Bnameid為:2 3 6 7 8 11
  表B記錄集B1中存在的Bnameid=(圖2中即B表中所有Bnameid)-(圖3中即記錄集C中存在的Aid),最終得出為:11
  由此得出圖6中A右連線B的記錄=圖3公共部分記錄集C+表B記錄集B1,
  最終得出的結果圖6中可以看出Aid及Aname非NULL的記錄都為圖3公共部分記錄集C中的記錄;Aid及Aname為NULL的Aid為11的記錄就是表B記錄集B1中存在的Bnameid。
  總結:
  通過上面的運算解說,相信很多人已經想到,上面的情況(包括圖3的關係圖)說明的都只是A在B的左邊的情況,
  以下語句B在A的右邊的又會出現什麼情況呢??
  select * from B Left JOIN A ON A.Aid=B.Bnameid
  select * from B Right JOIN A ON A.Aid=B.Bnameid
  其實對圖3左右翻轉一下就可以得出以下結論:
  select * from B Left JOIN A ON A.Aid=B.Bnameid和select * from A Right JOIN B ON A.Aid=B.Bnameid所得出的記錄集是一樣的
    而
  select * from B Right JOIN A ON A.Aid=B.Bnameid和select * from A Left JOIN B ON A.Aid=B.Bnameid所得出的記錄集也是一樣的。

在oracle的SQL語句常用的連線有內連線(inner join),外連線(outer join)等,內連線又包括等值連線,非等值連線,自連線;而外連線又分為左連線和右連線。其中預設的是內連線的等值連線。

內連線:利用內連線(等值)就可獲取公共部分C,圖中的資料集C.

select * from A inner join B on A.Aid=B.Bid;等價於select * from A,B where A.Aid=B.Bid 圖中C的部分

外連線:分為左外連線(left join)與右外連線(right join)
左外連線:select * from A,B where A.Aid=B.Bid(+);等價於select * from A left outer joinB on A.id=B.id圖中A+C的部分

右外連線:select * from A,B where A.Aid(+)=B.Bid;等價於select * from Aright outer joinB on A.id=B.id圖中B+C的部分


相關推薦

SQL連線連線

     有兩個表A和表B。  表A結構如下:  Aid:int;標識種子,主鍵,自增ID  Aname:varchar  資料情況,即用select * from A出來的記錄情況如下圖1所示: 表B結構如下:  Bid:int;標識種子,主鍵,自增ID  Bna

mysql連結連線

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

mysql連線連線

簡介 多表查詢會涉及到連線表,分為內連線,外連線(又細分為左連線、右連線)。 內連線 語法:select * from table_a inner join table_b on table_a.id = table_b.id 說明:檢索結果是返回

mysql 連線連線

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

Oracle表的連線連線的操作實現

對於兩張資料表進行資料查詢時,對於消除笛卡爾積主要是依靠連線模式處理的,而對於資料庫的定義有兩種:內連線和外連線 內連線:使用WHERE子句消除笛卡爾積,這就屬於內連線,只有滿足條件的資料才會顯示 外連線:分為三種,左外連線,右外連線,全外連線 為了更好的觀察到連線的區別,現在已經在

SQL連結,連線,交叉連線,聯合連線區別詳解

一、準備工作: 建立資料表並填寫資訊 class表: student表: 二、詳解 1、內連結 INNER JOIN 用於取得兩個表中存在連線匹配關係的記錄(例如:某一列相等)。通常配合比較運算子(=或<>)一起使用。其中

資料庫-連線連線的區別(舉例說明)

內連線,也被稱為自然連線,只有兩個表相匹配的行才能在結果集中出現。返回的結果集選取了兩個表中所有相匹配的資料,捨棄了不匹配的資料。由於內連線是從結果表中刪除與其他連線表中沒有匹配的所有行,所以內連線可能會造成資訊的丟失。內連線語法如下: select fieldlist

連線連線的區別

(一)內連線   內連線查詢操作列出與連線條件匹配的資料行,它使用比較運算子比較被連線列的 列值。內連線分三種:   1、等值連線:在連線條件中使用等於號(=)運算子比較被連線列的列值,其查詢結 果中列出被連線表中的所有列,包括其中的重複列。   例,下面使用等值連線列出authors和publis

資料庫中連線連線的特點

資料庫內連線、外連線  內連線 外連線 交叉連線 笛卡爾積  首先劃分一下,連線分為三種:內連線、外連線、交叉  連線       內連線(INNER JOIN):        分為三種:等值連線、自然連線、不等連線           外連線(OUTER JOIN):

多表查詢(連線連線的混合使用)(union聯合)

內連線與外連線的混合使用: 格式:select*from表1 left other join 表2 on 條件 inner join 表3 on條件 查詢工資高於公司平均工資的所有員工列:顯示員工資訊,部門名稱,上級領導,工資等級 如下: SELECT

連線連線有什麼區別

內連線:返回的結構集選區了兩個表中所有相匹配的資料,捨棄了不匹配的資料。(inner關鍵字可以省略) 外連線:包含符合連線條件的

MySQL-資料庫內連線連線交叉連線

資料庫中涉及兩個表之間的資料查詢通常使用連線的方法實現。連線分為內連線和外連線。 內連線: 指連線結果僅包含符合連線條件的行,參與連線的兩個表都應該符合連線條件。 外連線: 連線結果不僅包含符合連線條件的行同時也包含自身不符合條件的行。包括左外連線、

資料庫之自身連線連線

假設有一個數據表為Course: Cno為課程號,Cname為課程名,CPno為上這門課程之前必須學習的的課程號: 查詢每一門課的間接先修課(即先修課的先修課)。 SELECT  A.Cno, A.Cname, B.Cpno FROM  Course  A, Cou

資料庫內連線連線

資料庫中涉及兩個表之間的資料查詢通常使用連線的方法實現。連線分為內連線和外連線。 內連線: 指連線結果僅包含符合連線條件的行,參與連線的兩個表都應該符合連線條件。 外連線: 連線結果不僅包含符合連線條件的行同時也包含自身不符合條件的行。包括左外連線、右外連線和全外連

SQL 連線連線區別

資料庫的資料: 資料分級: 100 定義的是鎖,110 定義的是門鎖,111定義的是門鎖的種類例如光交門鎖。 那麼 門鎖的種類就是110~190  9 種,具體細分,鎖的種類就是總共:9*9=81種。夠用了。 這種型別的表,適合做自連線。 左外連結:連線2次。左側的資

SQL的左連線連線 連線連線

a表     id   name                      b表     id     &nb

Day055--MySQL--外來鍵的變種,表表的關係,單表查詢,多表查詢, 連線,左右連線,全連線

表和表的關係 ---- 外來鍵的變種 * 一對多或多對一 多對多 一對一 如何找出兩張表之間的關係 分析步驟: #1、先站在左表的角度去找 是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個欄位foreign key 右表一個欄位(通常是id) #2、再站在右表的角度去找 是否右表

SQL多表聯合查詢(交叉連線連線連線)

連線查詢:                 交叉連線:             &nbs

SQL的四種連線-左連線、右連線連線、全連線

聯接條件可在FROM或WHERE子句中指定,建議在FROM子句中指定聯接條件。WHERE和HAVING子句也可以包含搜尋條件,以進一步篩選聯接條件所選的行。     聯接可分為以下幾類:     1、內聯接(典型的聯接運算,使用像 =  或 <> 之類的比較運算

深入理解SQL的四種連線-左連線、右連線連線、全連線

1、內聯接(典型的聯接運算,使用像 = 或 <> 之類的比較運算子)。包括相等聯接和自然聯接。 內聯接使用比較運算子根據每個表共有的列的值匹配兩個表中的行。例如,檢索 students和courses表中學生標識號相同的所有行。 2、外聯接。外聯接