1. 程式人生 > >SQL夯實基礎(一):inner join、outer join和cross join的區別

SQL夯實基礎(一):inner join、outer join和cross join的區別

創建 color varchar mage bubuko where 是你 cross http

一、數據構建

先建表,再說話

create database Test
use Test
create table A
(
AID int identity(1,1) primary key,
name nvarchar(50),
age int
)
create table B
(
BID int identity(1,1) primary key,
name nvarchar(50),
gender  int
)

創建完之後,插入數據

insert A(name,age)values(張三,35)
insert A(name,age)values
(李四,25) insert A(name,age)values(XXX,35) insert A(name,age)values(YYY,35)

技術分享圖片

insert B(name,gender)values(張三,1)
insert B(name,gender)values(李四,1)
insert B(name,gender)values(AAA,2)
insert B(name,gender)values(BBB,2)

技術分享圖片

二、對比測試

  缺省情況下是inner join(也就是你直接輸入join),開發中使用的left join和right join屬於outer join,另外outer join還包括full join.下面我通過圖標讓大家認識它們的區別。

  現有兩張表,Table A,Table B其各有四條記錄,其中有兩條記錄name是相同的:

1.INNER JOIN 產生的結果是AB的交集

SELECT * FROM A INNER JOIN B ON A.name = B.name

技術分享圖片

2.LEFT [OUTER] JOIN 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。

SELECT * FROM A LEFT OUTER JOIN B ON A.name = B.name

技術分享圖片

3.RIGHT [OUTER] JOIN 產生表B的完全集,而A表中匹配的則有值,沒有匹配的則以null值取代。

SELECT * FROM A RIGHT OUTER JOIN B ON A.name = B.name

技術分享圖片

4.FULL [OUTER] JOIN 產生A和B的並集。對於沒有匹配的記錄,則會以null做為值。

SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name

技術分享圖片

你可以通過is NULL將沒有匹配的值找出來:

SELECT * FROM A FULL OUTER JOIN B ON A.name = B.name

WHERE A.id IS null OR B.id IS null

技術分享圖片

5. CROSS JOIN 把表A和表B的數據進行一個N*M的組合,即笛卡爾積。如本例會產生4*4=16條記錄,在開發過程中我們肯定是要過濾數據,所以這種很少用。

SELECT * FROM A CROSS JOIN B

相信大家對inner join、outer join和cross join的區別一目了然了。

補充一點:按照sql標準CROSS JOIN是笛卡爾積。但對於mysql來說,CROSS JOIN 相當於 INNER JOIN。

技術分享圖片

SQL夯實基礎(一):inner join、outer join和cross join的區別