数据库关联

面试时对于关联的提问是必不可少的,下面就简单梳理一下关联,希望能够帮助大家。

关联的类型:

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行。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章