下面是例子分析
表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是直接减少(或不显示)记录