SQL中的各种JOIN语法总结
SQL中的各种JOIN语法总结
SQL JOIN语句是数据库查询中非常重要的一个部分,它允许我们根据一定的条件将多个表中的数据进行连接和组合。本文将详细讲解各种JOIN类型及其使用场景,帮助读者更好地理解和掌握SQL JOIN语句的使用方法。
SQL JOINs 总结
首先通过一张图总结各种 SQL JOINs:
接下来,我们将通过两个示例表A和B,详细讲解各种JOIN类型:
INNER JOIN
内连接,就是两个表的交集:
SELECT *
FROM A INNER JOIN B
ON A.course_id = B.course_id;
输出结果如下,可以看到这里的course_id是原来两个表共有的:
LEFT JOIN
左外连接,先左后外。也就是先把Table A整个copy来再说,再在Table B中找有没有匹配的部分,没有匹配的部分就用NULL代替:
SELECT *
FROM A LEFT JOIN B
ON A.course_id = B.course_id;
输出结果如下,可以看到结果中含有Table A的全部内容:
RIGHT JOIN
右外连接,先右后外。也就是先把Table B整个copy来再说,再在Table A中找有没有匹配的部分,没有匹配的部分就用NULL代替:
SELECT *
FROM A RIGHT JOIN B
ON A.course_id = B.course_id;
输出结果如下,可以看到结果中含有Table B的全部内容:
FULL OUTER JOIN
全外连接,就是将左边和右边嗯塞一起,空的部分就填上NULL:
SELECT *
FROM A FULL OUTER JOIN B
ON A.course_id = B.course_id;
输出结果如下,可以看到结果中含有Table A和Table B的全部内容:
其他情况的连接
这张图中还展示了一些其他的连接方式,其实已经没有新东西了,都是上述四种连接的结合:
以LEFT JOIN的情况为例:
SELECT *
FROM A LEFT JOIN B
ON A.course_id = B.course_id
WHERE B.course_id IS NULL;
输出结果如下,意为只在Table A中有,而Table B中没有的元组:
NATURAL JOIN
NATURAL JOIN并不是一种单独的连接方式,而是NATURAL关键字在起作用,它代表着自动查询两张表中所有相同的字段,然后再进行等值连接:
例如:
SELECT *
FROM A NATURAL JOIN B;
可以看出相较于ON,NATURAL将相同的course_id合并了:
USING关键字
除了NATURAL外,我们还可以使用USING指定需要以其为根据的相同字段:
例如:
SELECT *
FROM A JOIN B
USING(course_id);
也是同样的效果,并且显示结果上和NATURAL JOIN相同:
CROSS JOIN
使用该连接返回两表的笛卡尔积:
例如:
SELECT *
FROM A CROSS JOIN B;
都是两个表的笛卡尔积:
ON和WHERE
虽然等值条件既可以在ON中写,也可以在WHERE中写,不过因为ON只充当连接条件,而WHERE主要充当选择/过滤条件,因此还是建议将ON和WHERE区分开来。
MySQL中的JOIN
MySQL的JOIN语法与Oracle大致相同,但仍有微小的区别:
- 在Oracle中,INNER JOIN必须跟上ON关键字,否则无法执行;但是在MySQL中INNER JOIN没有ON的话,则表示两个表的笛卡尔积。
- MySQL不支持FULL OUTER JOIN,可以使用LEFT JOIN UNION RIGHT JOIN的方式替代:
SELECT *
FROM A LEFT JOIN B
ON A.course_id = B.course_id
UNION
SELECT *
FROM A RIGHT JOIN B
ON A.course_id = B.course_id;
查询结果如下:
数据库系统选择
在实际应用中,不同的数据库系统可能在语法细节上存在一些差异。例如,Oracle和MySQL在处理JOIN语句时就存在一些细微差别。因此,在编写SQL语句时,需要根据所使用的数据库系统进行相应的调整。建议在开发和测试阶段就确定好使用的数据库系统,避免在后期出现兼容性问题。