1. 程式人生 > >資料庫內連線、外連線 、交叉連線

資料庫內連線、外連線 、交叉連線

資料庫連線分為:內連線 外連線 交叉連線 (即笛卡爾積)  

內連線(INNER JOIN):分為三種:等值連線、自然連線、不等連線 

外連線(OUTER JOIN):分為三種:左外連線(LEFT JOIN)、右外連線(RIGHT JOIN)、全外連線(FULL JOIN)

交叉連線(CROSS JOIN):沒有where 子句,它返回連線表中所有資料行的笛卡爾積

  1. 並集UNION:select  col1,col2  from  A UNION  select col1,col2 from  B ;
  2. 交集JOIN:select * from  A  JOIN  B on  A.name=B.name;
  3. 差集NOT:select * from  A  where  name  NOT  IN(select name from B);
  4. 笛卡爾積CROSS JOIN:select * from A CROSS JOIN B;  (等價於select * from A,B;)

SQL中的UNION與UNION ALL的區別:前者會去重,後者保留相同的;

交叉連線 CROSS JOIN: 如果不帶WHERE條件子句,它將會返回被連線的兩個表的笛卡爾積,返回結果的行數等於兩個錶行數的乘積::笛卡爾積CROSS JOIN:select * from A CROSS JOIN B;  (等價於select * from A,B;) ; --------- 一般不建議使用該方法,因為如果有WHERE子句的話,往往會先生成兩個錶行數乘積的行的資料表然後才根據where條件中選擇;;不適合大的表

內連線:INNER JOIN

如果僅僅使用 SELECT * FROM A INNER JOIN B 沒有指定連線條件的話,和交叉連線的結果一樣;

如果指定條件,如下:

--等值連線(不去重):selecr * from A INNER JOIN B on  A.col=B.col;

--不等連線:select * from A INNER JOIN B on  A.col>B.col;

--自然連線(去重)(公共屬性只保留一):(通過相同名字的屬性連線的結果就是自然連線)

外連線 OUTER JOIN:

 首先內連線和外連線的不同之處: 內連線如果沒有指定連線條件的話,和笛卡爾積的交叉連線結果一樣,但  

是不同於笛卡爾積的地方是,沒有笛卡爾積那麼複雜地要先生成行數乘積的資料表,內連線的效率要高於笛卡  

爾積的交叉連線。

·指定條件的內連線,僅僅返回符合連線條件的條目

·外連線則不同,返回的結果不僅包含符合連線條件的行,而且包括左表(左外連線時), 右表  (右連線時)或者兩邊連線(全外連線時)的所有資料行。

--左外連線LEFT JOIN:除了顯示符合條件的資料行外,還顯示左邊資料表不符合條件的資料行;;要是右邊沒有對應的行,就顯示NULL;(select A LEFT JOIN B on A.col=B.col;)

--右外連線RIGHT JOIN:除了顯示符合條件的資料行外,還顯示右邊資料表不符合條件的資料行;;要是左邊沒有對應的行,就顯示NULL;(select A RIGHT JOIN B on A.col=B.col;)

--外連線FULL OUTER JOIN:除了顯示符合條件的資料行外,還顯示左邊和右邊資料表不符合條件的資料行;;要是沒有對應的行,就顯示NULL;(select A  FULL OUT JOIN B on A.col=B.col;)

如果把捨棄的元組也儲存在結果關係中,而在其他屬性上空值,那麼這種連線就叫外連線。如果只把左邊關係R要捨棄的元組保留就叫左外連線,如果只把右邊關係S中要捨棄的元組保留右外連線。

例子:

Id

a

b

1

2

3

2

5

4

表A

Id

c

d

2

2

3

3

9

4

表B

selecr * from A  natural  join B on A.Id=B.Id;自然連線的結果:

Id

a

b

c

d

2

5

4

2

3

selecr * from A left  join B on A.Id=B.Id;左連線的結果:

Id

a

b

c

d

1

2

3

Null

Null

2

4

4

2

3

selecr * from A  full out join B on A.Id=B.Id;全外連線的結果:

Id

a

b

c

d

1

2

3

Null

Null

2

5

4

2

3

3

Null

Null

9

4

selecr * from A  cross join B;交叉連線的結果:

IdA

IdB

a

b

c

d

1

2

2

3

2

3

1

3

2

3

9

4

2

2

5

4

2

3

2

3

5

4

9

4