内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行,外连接包括左外连接、右外连接和全外连接。
用一张题来说明他们之间的关系。
下面具体说一下他们之间的用法:
内连接包括等值连接,不等值连接和自然连接,由于后两个用的很少,这里就不做叙述了。
等值连接:在连接条件中使用等于号(=)运算符,其查询结果中列出被连接表中的所有列,包括其中的重复列。
内连接中等值连接的例子:
mysql> select * from student s,score c where s.name=c.name;
+-----+------+-------+------+-------+
| num | name | class | name | grade |
+-----+------+-------+------+-------+
| 2 | jack | 1 | jack | 98 |
| 4 | pony | 2 | pony | 85 |
| 5 | rose | 1 | rose | 81 |
+-----+------+-------+------+-------+
3 rows in set (0.04 sec)
此等值连接等价于 select * from student s inner join score c on s.name=c.name;
左外连接:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值。
mysql> select * from student s left join score c on s.name=c.name;
+-----+------+-------+------+-------+
| num | name | class | name | grade |
+-----+------+-------+------+-------+
| 2 | jack | 1 | jack | 98 |
| 4 | pony | 2 | pony | 85 |
| 5 | rose | 1 | rose | 81 |
| 1 | tom | 2 | NULL | NULL |
| 3 | mary | 3 | NULL | NULL |
+-----+------+-------+------+-------+
5 rows in set (0.05 sec)
这里可以看到student表中的数据已经完全返回,对于没有和坐标匹配上的数据用Null值代替。
右外连接:与左外连接相反,返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
mysql> select * from student s right join score c on s.name=c.name;
+------+------+-------+------+-------+
| num | name | class | name | grade |
+------+------+-------+------+-------+
| 2 | jack | 1 | jack | 98 |
| 4 | pony | 2 | pony | 85 |
| 5 | rose | 1 | rose | 81 |
| NULL | NULL | NULL | bill | 74 |
+------+------+-------+------+-------+
4 rows in set (0.05 sec)
mysql>
全外连接:不管匹配不匹配,全部显示出来,左表在右边没有的显示NULL,右表在左边没有的显示NULL。
按照正常情况下全外连接应该是select * from student s full join score c on s.name=c.name; 但是mysql并不支持全外连接,所以我们用union来代替full
mysql> select * from student s left join score c on s.name=c.name
-> union select * from student s right join score c on s.name=c.name;
+------+------+-------+------+-------+
| num | name | class | name | grade |
+------+------+-------+------+-------+
| 2 | jack | 1 | jack | 98 |
| 4 | pony | 2 | pony | 85 |
| 5 | rose | 1 | rose | 81 |
| 1 | tom | 2 | NULL | NULL |
| 3 | mary | 3 | NULL | NULL |
| NULL | NULL | NULL | bill | 74 |
+------+------+-------+------+-------+
6 rows in set (0.05 sec)
mysql>
交叉连接:也成为了笛卡尔积,因为相对于内连接来讲他缺少了连接条件,它返回的是两个表行数的乘积,所以为了避免笛卡尔积的出现,当我们进行两张表或者多张表连接时一定要加上最后的连接条件。
mysql> select * from student,score;
+-----+------+-------+------+-------+
| num | name | class | name | grade |
+-----+------+-------+------+-------+
| 1 | tom | 2 | bill | 74 |
| 1 | tom | 2 | jack | 98 |
| 1 | tom | 2 | pony | 85 |
| 1 | tom | 2 | rose | 81 |
| 2 | jack | 1 | bill | 74 |
| 2 | jack | 1 | jack | 98 |
| 2 | jack | 1 | pony | 85 |
| 2 | jack | 1 | rose | 81 |
| 3 | mary | 3 | bill | 74 |
| 3 | mary | 3 | jack | 98 |
| 3 | mary | 3 | pony | 85 |
| 3 | mary | 3 | rose | 81 |
| 4 | pony | 2 | bill | 74 |
| 4 | pony | 2 | jack | 98 |
| 4 | pony | 2 | pony | 85 |
| 4 | pony | 2 | rose | 81 |
| 5 | rose | 1 | bill | 74 |
| 5 | rose | 1 | jack | 98 |
| 5 | rose | 1 | pony | 85 |
| 5 | rose | 1 | rose | 81 |
+-----+------+-------+------+-------+
20 rows in set (0.06 sec)
mysql>