SQL夯實基礎(一):inner join、outer join和cross join的區別
一、數據構建
先建表,再說話
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的區別