面试时对于关联的提问是必不可少的,下面就简单梳理一下关联,希望能够帮助大家。
关联的类型:
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行。