MySQL之左、右、内关联类型解析

下面是例子分析

表A记录如下:

id name

2 jack

4 hello

9 heihei

3 world

1 dream

表B记录如下:

id name

2 miaomiao

4 yanyan

7 jack

创建这两个表SQL语句如下:

create table a (

id varchar(10),

name varchar(30)

);

INSERT INTO `a` VALUES ('2', 'jack');

INSERT INTO `a` VALUES ('4', 'hello');

INSERT INTO `a` VALUES ('9', 'heihei');

INSERT INTO `a` VALUES ('3', 'world');

INSERT INTO `a` VALUES ('1', 'dream');

create table b (

id varchar(10),

name varchar(30)

);

INSERT INTO `b` VALUES ('2', 'miaomiao');

INSERT INTO `b` VALUES ('4', 'yanyan');

INSERT INTO `b` VALUES ('7', 'jack');

 


实验如下:

1.left join(左联接)

sql语句如下:

SELECT * FROM a

LEFT JOIN b

ON a.id=b.id

结果如下:

mysql> select * from a left join b on a.id = b.id;

+------+--------+------+----------+

| id | name | id | name |

+------+--------+------+----------+

| 2 | jack | 2 | miaomiao |

| 4 | hello | 4 | yanyan |

| 9 | heihei | NULL | NULL |

| 3 | world | NULL | NULL |

| 1 | dream | NULL | NULL |

+------+--------+------+----------+

5 rows in set (0.73 sec)

结果说明:

left join是以A表的记录为基础的,A[主表]可以看成左表,B[副表]可以看成右表,left join是以左表为准的.

换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: a.id = b.id).

B表记录不足的地方均为NULL.

 


2.right join(右联接)

sql语句如下:

SELECT * FROM a

RIGHT JOING b

ON a.id = b.id

结果如下:

mysql> select * from a right join b on a.id = b.id;

+------+-------+------+----------+

| id | name | id | name |

+------+-------+------+----------+

| 2 | jack | 2 | miaomiao |

| 4 | hello | 4 | yanyan |

| NULL | NULL | 7 | jack |

+------+-------+------+----------+

3 rows in set (0.00 sec)

结果说明:

仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B) [主表]为基础的,A[主表]表不足的地方用NULL填充.

 


3.inner join(相等联接或内联接)

sql语句如下:

mysql> select * from a inner join b on a.id = b.id;

+------+-------+------+----------+

| id | name | id | name |

+------+-------+------+----------+

| 2 | jack | 2 | miaomiao |

| 4 | hello | 4 | yanyan |

+------+-------+------+----------+

2 rows in set (0.00 sec)

结果说明:

很明显,这里只显示出了 a.id = b.id的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.

LEFT JOIN操作用于在任何的 FROM 子句中

 


没有where条件等价于完全关联,反之则为内部关联。其约束是先ON 再 WHERE ,这里一定要注意的是:条件是放在ON里还是WHERE里,放的位置不同结果可能完全不一样的,WHERE 后面所有字段都是用来进一步过滤的。

副表的约束条件尽量在ON里写,因为ON关联后再约束副表的话可能丢东西。主表的约束基本上写在ON或WHERE里都行。

 

2017-2-14 个人体会:

a left join b 

id   a.mid1    b.time          b.mid2

1  55412        2013-12-09 13:55:02    55412
2  1840517    2015-12-07 18:42:03    1840517
3  2227947    2017-02-09 17:20:25    2227947
4  2495599    2016-11-30 19:17:47    2495599

只放在on后面过滤  2月1日之前数据,结果为:

id   a.mid1    b.time          b.mid2

1  55412        2013-12-09 13:55:02    55412
2  1840517    2015-12-07 18:42:03    1840517
3  2227947    null           null
4  2495599    2016-11-30 19:17:47    2495599

只放在where后面过滤  2月1日之前数据,结果为:

id   a.mid1    b.time          b.mid2

1  55412        2013-12-09 13:55:02    55412
2  1840517    2015-12-07 18:42:03    1840517
3  2495599    2016-11-30 19:17:47    2495599

总结:on后面不会减少结果记录数,只是主表匹配不上,则从表设为null,where是直接减少(或不显示)记录

posted @ 2012-03-23 19:39  花已梦  阅读(627)  评论(0编辑  收藏  举报