SQL joins

网上很多文章说法要么示例太简单, 不够全面,要么说法还有错,
下图已经很清晰,可是有些情况,我觉得没有表示出来,如a和b有一对多关系式,a中的记录会有重复;

SQL joins


归纳下自己的理解, 便于自己后续回顾: 

  • 先假设a,b表,均只有一列,分别为a,b;

mysql> select * from a;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+

mysql> select * from b;
+------+
| b    |
+------+
|    3 |
|    4 |
|    5 |
|    6 |
|    4 |
+------+

 

  • 左连接: 

mysql> select * from a LEFT JOIN b on a.a = b.b;
+------+------+
| a    | b    |
+------+------+
|    1 | NULL |
|    2 | NULL |
|    3 |    3 |
|    4 |    4 |
|    4 |    4 |
+------+------+

a表所有记录 + b表中和a表有关联的记录(不包括同A表没有关联的记录),如果a中某(些)条与b有一对多关系,则a表中这(些)条会重复,反之同理,如上图:
等同于:  select * from a LEFT OUTER JOIN b on a.a = b.b;
等同于:  select * from b RIGHT JOIN a on a.a = b.b;

 

  • 右连接: 

mysql> select * from a RIGHT JOIN b on a.a = b.b;
+------+------+
| a    | b    |
+------+------+
|    3 |    3 |
|    4 |    4 |
| NULL |    5 |
| NULL |    6 |
|    4 |    4 |
+------+------+

b表所有记录 + a表中和B表有关联的记录(不包括同B表没有关联的记录),如果a中某(些)条与b有一对多关系,则a表中这(些)条会重复,反之同理,如上图:

  • inner join: 

mysql> select * from a inner JOIN b on a.a = b.b;
+------+------+
| a    | b    |
+------+------+
|    3 |    3 |
|    4 |    4 |
|    4 |    4 |
+------+------+

取a和b所有有关联的记录, 即两表的交集;如果a中某(些)条与b有一对多关系,则a表中这(些)条会重复,反之同理,如上图:


当然如果有任何表述有问题,或者建议欢迎提出来;

reference:
http://stackoverflow.com/questions/448023/what-is-the-difference-between-left-right-outer-and-inner-joins

http://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join

转载于:https://my.oschina.net/amince/blog/847667