1.分类
MySQL连接可以分为:
1)内连接
2)外连接
- 左外连接
- 右外连接
- 全外连接
3)自然连接
- 自然内连接(NATURAL JOIN)
- 自然左外连接(NATURAL LEFT JOIN)
- 自然右外连接(NATURAL RIGHT JOIN)
4)交叉连接
2.语法
SELECT 列名1,...列名n
FROM 表名1
[连接类型] JOIN 表名2
[连接关键词] WHERE 检索条件;
连接类型四选一:
- INNER
- LEFT OUTER
- RIGHT OUTER
- FULL OUTER
连接关键词二选一:
- ON 连接条件
- USING(cloumn_name)
3.示例
表1 test1:
表2 student:
1)内连接
SELECT * FROM test1 INNER JOIN student ON test1.id = student.id;
内连接生成的新的关系的属性个数(即列数)是原来两个表的属性个数相加;其结果可以这么得出:第一先进行两个表的笛卡尔积(用左表的所有行依次去匹配右表的每一行);第二步根据on后边的条件筛选,符合条件的显示;
注:这里只是为了理解方便,数据库会对连接操作进行优化而不必进行笛卡尔积操作,其实on条件的过滤是在两个表连接之前;而在两个表连接之后,才会再根据where的条件进行筛选;
2)左连接示例:
SELECT * FROM test1 LEFT JOIN student ON test1.id = student.id;
执行结果:
左连接生成的新的关系的属性个数(即列数)是原来两个表的属性个数相加;其结果可以这么得出:第一先进行两个表的笛卡尔积(用左表的所有行依次去匹配右表的每一行);第二步根据on后边的条件筛选,符合条件的显示(第1、3、4行),而对于左表中有右表却没有找到匹配的项,则右表对应的列以null填充(第2行);
右连接和左连接类似,只不过 这次是以右表中的所有行去匹配左表,如果匹配的则显示,不匹配的右表对应的列正常显示,而左表对应的列则以null填充(总之,右表中的所有列都要显示)。
全连接是两个表中如果相匹配的数据,则显示对应的数据,否则以null进行匹配(两个表中的所有行都要显示)。
4.自然连接natural
要求进行自然连接的两个表必须有相同的属性组B(至少包含一个属性),如该实例中,表test1和表student有相同的属性组id和password,则可以进行自然连接。自然连接自带判断条件,即id和password都相等时才算匹配成功。
附:自然连接参考文献