虽然之前一直见过两个Join,对于其具体的含义也在参考书上读过,但是一直没有记住。现在换一种方式进行学习,改为实验方式理解。
Left Join
测试表:
表结构很简单,test包括两个int字段,test2只包含一个int字段
mysql> show create table test\G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec) mysql> show create table test2\G
*************************** 1. row ***************************
Table: test2
Create Table: CREATE TABLE `test2` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
数据:
mysql> select * from test;
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 2 | 3 |
| 4 | 5 |
| 6 | 7 |
+------+------+
4 rows in set (0.00 sec) mysql> select * from test2;
+------+
| a |
+------+
| 4 |
| 6 |
| 2 |
| 8 |
+------+
使用Left Join输出:
mysql> select * from test left join test2 on(test.a);
+------+------+------+
| a | b | a |
+------+------+------+
| 1 | 1 | 4 |
| 1 | 1 | 6 |
| 1 | 1 | 2 |
| 1 | 1 | 8 |
| 2 | 3 | 4 |
| 2 | 3 | 6 |
| 2 | 3 | 2 |
| 2 | 3 | 8 |
| 4 | 5 | 4 |
| 4 | 5 | 6 |
| 4 | 5 | 2 |
| 4 | 5 | 8 |
| 6 | 7 | 4 |
| 6 | 7 | 6 |
| 6 | 7 | 2 |
| 6 | 7 | 8 |
+------+------+------+
这就是笛卡尔积的表示
加上test.a等于test2.a条件之后,对于test2中不存在记录使用NULL表示
mysql> select * from test left join test2 on(test.a = test2.a);
+------+------+------+
| a | b | a |
+------+------+------+
| 1 | 1 | NULL |
| 2 | 3 | 2 |
| 4 | 5 | 4 |
| 6 | 7 | 6 |
+------+------+------+
Right Join
和Left Join相反
Inner Join
对于上面同样的例子使用inner Join输出的记录中不会包含NULL字段:
mysql> select * from test inner join test2 on(test.a = test2.a);
+------+------+------+
| a | b | a |
+------+------+------+
| 4 | 5 | 4 |
| 6 | 7 | 6 |
| 2 | 3 | 2 |
+------+------+------+
3 rows in set (0.00 sec)