虽然之前一直见过两个Join,对于其具体的含义也在参考书上读过,但是一直没有记住。现在换一种方式进行学习,改为实验方式理解。
Left Join
测试表:
表结构很简单,test包括两个int字段,test2只包含一个int字段
mysql> show create table testG *************************** 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 test2G *************************** 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)