很多操作都是在两个表中操作的,比如之前的子查询和联合,连接也是多表操作,是用来连接多个表。
1、外连接
外连接就是用一个表做基表,另个表为附表,然后根据匹配条件来显示附表内容。通常分为:
① 左(外)连接
用左边表当标准,所以左表全部显示,右表部分显示,右表找不到匹配的用 NULL 补齐。
select * from aa left (outer) join bb on bb.id = aa.id;
ps:on 与 where 的区别:
on 出现顺序在 where 前面,作用也不同,on 是为连接提供一个准则,而 where 用于筛选结果集。
on 条件还可以用一些比较运算符。
② 右(外)连接
和左连接一样。
③ 全(外)连接
全连接相当于是把左连接和右连接结果集联合起来,mysql 并不支持全连接,可以通过这种方式来得到类似的效果。
select * from aa full join bb;
2、内连接
使用 inner join 来表示,内连接是最均衡的连接,他可以用一个 on 条件来指定构造该连接的条件。
内连接使用等号的情况是最多而且最普遍的,mysql 提供了一个简化的操作语法,把 on 子句换成 using(字段名) 即可。比如:
select * from aa inner join bb using(id); #就是把 aa 和 bb 中 id 相等的行合并为一行,然后放入结果集中。
ps:
如果内连接不指定任何条件,就会变成交叉连接。
内连接分为三类:
① 等值连接
在 on 子句中使用等号来进行连接,使用情况比较多。
② 不等连接
在 on 子句中不使用等号来进行连接。
③ 自然连接
它是一种特殊的等值连接,在结果集中会把重复的属性列去掉,使用 natural join 时,无需指定连接时的一些操作,因为这些都是自然进行的;
使用 using 和自然连接的效果是一样的。
3、交叉连接
交叉连接就是表与表进行笛卡尔乘积,使用 cross join,也可以什么都不用,直接用,分割。
他可以用于多个表,当结果集数据量较大的时候,使用 where 来筛选结果集。
select * from aa cross join bb;
select * from aa,bb,cc;
ps:
在使用,的时候,不能用 on 条件来限定连接。
4、自连接
自己和自己连接,相当于把一张表当两张表来使用。在本表中找一些信息,不实用连接又很难找到(不考虑子查询情况下)时用自连接;
在 on 子句中使用等号来进行连接。