目录
1.笛卡尔积
当查询的数据在两种或多张表上时,就需要把两个表进行连接。
2个表连接之后,包含所有可能的表,就是笛卡尔积。
如:A表和B表如下
他们的笛卡尔积如下:
而笛卡尔积的数据量过于全面,很难有实际意义,所以一般会在此基础上进行筛选,根据筛选方法的不同,可分为以下几种。
2.连接
INNER JOIN
内连接。比如现在有这样一种需求:想要知道AD的战队。虽然AD和辅助是同一个战队的,但是战队信息只在B表中有,所以A和B表需要进行连接查询。而既然要连接出有意义的表,就得有连接条件。
这里A和B表,很明显可以通过辅助这一列进行连接,A表中的某行,只拼接B表中辅助字段的值与A表中辅助字段的值相同的行。这样一来,结果如下:
很明显,在笛卡尔积的表中,只有这两列是符合条件的。
LEFT JOIN
这时,我们发现,A表中的Deft,Meimo这行信息,没有了。这是因为B表中没有可以和此行进行连接的行,所以该行信息被舍弃了。而如果我们想要查出所有的下路组合,且战队方面,有信息就显示,没有就显示空,那么就可以用到外连接。
我们可以发现,内连接中,左表(A表)有些行和B表进行了连接(可能连接了一行,也可能是多行),而有些没有。对于没有进行连接的行,就进行了舍弃。而外连接,就是在内连接的基础上,把没有连接的行,也进行显示。左外连接,顾名思义,就是显示左表中,所有的行(包括未连接的行)。结果如下:
RIGHT JOIN
右外连接和类似,只不过是会保留右侧所有的行(包括未连接的行)。不过此例中,右侧的行都进行了连接,所以看不出差别。
FULL JOIN
如果弄清了左外连接,全外连接就是在有连接成功的行的基础上既保留了左侧未连接的行,又保留了右侧未连接的行。
MySQL实例演示
两张表,A表和B表:
inner join
SELECT * FROM A INNER JOIN B ON A.辅助 = B.辅助
或者(二者等价)
SELECT * FROM A JOIN B ON A.辅助 = B.辅助
如果使用逗号进行表连接,默认也是内连接:
SELECT * FROM A, B WHERE A.辅助 = B.辅助
left join
SELECT * FROM A LEFT JOIN B ON A.辅助 = B.辅助
right join
SELECT * from A RIGHT JOIN B on A.辅助 = B.辅助
full join
MySQL没有提供全外连接的关键字,但是可以通过union关键字间接实现。
UNION:将两个查询语句的结果合并,要求两个结果集必须拥有相同数量的列且对应列的数据类型相同。结果集会自动去除重复的行。
SELECT * FROM A LEFT JOIN B ON A.辅助 = B.辅助
UNION
SELECT * from A RIGHT JOIN B on A.辅助 = B.辅助
这样,就也达到了全外连接的效果。
如果使用UNION ALL
则不会去除重复的行:
SELECT * FROM A LEFT JOIN B ON A.辅助 = B.辅助
UNION ALL
SELECT * from A RIGHT JOIN B on A.辅助 = B.辅助
3.连接条件
我们刚才说的连接,用的是A表的列与B表的另一列做等值判断。其实除了等值判断,连接的条件也可以像where语句一样,是多种多样的。
等值连接
如果进行比较的条件是等号,那么就可以称为等值连接,且所比较的两个列,不一定要是公共列。
自然连接
自然连接是等值连接的特殊情况。他要求进行等值判断的两列,是公共列(名称相同,类型相同),并且连接的条件是等值判断。自然连接后,公共列会进行合并。
SELECT * FROM A NATURAL JOIN B
如果有多个公共列,则要都对应相等,才会进行连接。