面試時對於關聯的提問是必不可少的,下面就簡單梳理一下關聯,希望能夠幫助大家。
關聯的類型:
Left Join (左連接):左邊爲主表,根據關聯條件匹配右表,取不到右表的記錄則右表相關字段爲null,左表全部返回
Right Join(右鏈接):右邊爲主表,根據關聯條件匹配左表,取不到左表的記錄則左表相關字段爲null,左表全部返回
Inner Join(內鏈接):取兩張表的交集,能關聯上則返回
Full Join(全鏈接):兩張表的記錄全部返回,類似於左表關聯合並右表關聯,然後去重。
Cross Join(笛卡爾積):一張表的每一條記錄都和另一張表的每條記錄關聯
上圖:
Table_A | Table_B | ||||
ID | NAME | GENDER | ID | AMT | |
A001 | Tony | M | A001 | 1000 | |
A002 | Abby | F | A002 | 500 | |
A003 | Alice | F | A003 | 200 | |
A004 | John | M | B001 | 700 |
Left Join (左連接):
SELECT A.ID
,A.NAME
,A.GENDER
,B.AMT
FROM TABLE_A A
LEFT JOIN TABLE_B B
ON A.ID=B.ID
ID | NAME | GENDER | AMT |
A001 | Tony | M | 1000 |
A002 | Abby | F | 500 |
A003 | Alice | F | 200 |
A004 | John | M |
Right Join(右鏈接):
SELECT B.ID
,A.NAME
,A.GENDER
,B.AMT
FROM TABLE_A A
RIGHT JOIN TABLE_B B
ON A.ID=B.ID
ID | NAME | GENDER | AMT |
A001 | Tony | M | 1000 |
A002 | Abby | F | 500 |
A003 | Alice | F | 200 |
B001 | 700 |
Inner Join(內鏈接):
SELECT A.ID
,A.NAME
,A.GENDER
,B.AMT
FROM TABLE_A A
INNER JOIN TABLE_B B
ON A.ID=B.ID
ID | NAME | GENDER | AMT |
A001 | Tony | M | 1000 |
A002 | Abby | F | 500 |
A003 | Alice | F | 200 |
Full Join(全鏈接):
SELECT A.ID
,A.NAME
,A.GENDER
, B.ID
,B.AMT
FROM TABLE_A A
Full JOIN TABLE_B B
ON A.ID=B.ID
ID | NAME | GENDER | ID | AMT |
A001 | Tony | M | A001 | 1000 |
A002 | Abby | F | A002 | 500 |
A003 | Alice | F | A003 | 200 |
A004 | John | M | ||
B001 | 700 |
Cross Join(笛卡爾積):不用寫關聯條件
SELECT B.ID
,A.NAME
,A.GENDER
,B.AMT
FROM TABLE_A A
CROSS JOIN TABLE_B B
ID | NAME | GENDER | ID | AMT |
A001 | Tony | M | A001 | 1000 |
A001 | Tony | M | A002 | 500 |
A001 | Tony | M | A003 | 200 |
A001 | Tony | M | B001 | 700 |
A002 | Abby | F | A001 | 1000 |
A002 | Abby | F | A002 | 500 |
A002 | Abby | F | A003 | 200 |
A002 | Abby | F | B001 | 700 |
A003 | Alice | F | A001 | 1000 |
A003 | Alice | F | A002 | 500 |
A003 | Alice | F | A003 | 200 |
A003 | Alice | F | B001 | 700 |
A004 | John | M | A001 | 1000 |
A004 | John | M | A002 | 500 |
A004 | John | M | A003 | 200 |
A004 | John | M | B001 | 700 |
當左聯接或右鏈接的關聯條件爲恆成立比如 ON 1=1時,那麼此時它們和笛卡爾積效果是一樣的。
面試題來了:
Q1:表A爲2行3列,表B爲3行2列,做笛卡爾積生成幾行幾列(列出所有字段)?
A1:做CROSS JOIN時,生成的結構爲行數相乘列數相加,所以生成6行5列。
Q2:表A爲M行,表B爲N行,做左聯接生成幾行?
A2:首先要看關聯條件,若右表的關聯條件爲主鍵時,則生成M行,若右表的關聯條件爲非主鍵時,則生成最少爲M行,最多爲M*N行。