在我们走出新手村,开始编写系统时,总会遇到各种复杂的场景需要多个数据库表的联查,这时我们就需要掌握多表查询有几种方式,以便我们在各种复杂的应用场景使用适宜的连接方式。
用于测试的表:
student表
grade表
system表
交叉连接(CROSS JOIN或称笛卡尔积)
不带有WHERE条件子句,将返回两张表的笛卡尔积,也就是两张表行数的乘积。
SELECT * FROM student, grade;
或
SELECT * FROM student CROSS JOIN grade;
内连接(等值连接)
内连接
从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息,因为他只显示两个表满足条件的交集。
SELECT * FROM student INNER JOIN grade ON student.id = grade.sid;
等值连接
SELECT * FROM student, grade WHERE student.id = grade.sid;
自然连接
自然连接是一种特殊的等值连接。(自然连接无需指定连接列,SQL会检查两个表中是否相同名称的列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示)
SELECT * FROM grade NATURAL JOIN `system`;
外连接
左外连接(左连接、LEFT JOIN、LEFT OUTER JOIN)
将返回左表的所有行。如果左表的某行在右表中没有匹配行,则右表将返回空值
SELECT * FROM student LEFT JOIN grade ON student.id = grade.sid;
右外连接(右连接、RIGHT JOIN、RIGHT OUTER JOIN)
将返回右表的所有行。如果右表的某行在左表中没有匹配行,则左表将返回空值
SELECT * FROM student RIGHT JOIN grade ON student.id = grade.sid;
全连接(UNION)
Mysql并不直接支持全连接:可以通过LEFT JOIN+RIGHT JOIN+UNION
(SELECT * FROM student RIGHT JOIN grade ON student.id = grade.sid) UNION (SELECT * FROM student LEFT JOIN grade ON student.id = grade.sid);
UNION与UNION ALL的区别:UNION与UNION ALL都会合并结果集,但UNION会删除重复行。