一、内连接
内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选,我们前面所学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
语法:
sql
select 列 from 表1 inner join 表2 on 连接条件;
-- inner 可以省略,直接写 join
案例:显示Smith的名字和部门名称
sql
select emp.name, dept.dname
from emp join dept
on emp.deptno = dept.deptno
where emp.name = 'Smith';

二、外连接
外连接和内连接不一样,内连接只保留匹配成功的数据,而外连接会保留其中一张表的全部数据,匹配不到的地方填充 NULL。外连接分为左外连接和右外连接。
2.1 左外连接
语法:
sql
select 列 from 表1 left join 表2 on 连接条件;
左外连接以 left join 左边的这张表作为主表,主表里面所有行都会保留,再去右边的表匹配符合条件的数据。如果右边表没有匹配上对应的记录,右边表的字段就全部填充为 NULL。
对外连接的使用案例使用student和score两张表。
案例:保留所有学生,没成绩的学生成绩列显示 NULL
sql
SELECT s.sid, s.sname, sc.cname, sc.grade
FROM student s
LEFT JOIN score sc ON s.sid = sc.sid;

2.2 右外连接
语法:
sql
select 列 from 表1 right join 表2 on 连接条件;
右外连接以 right join 右边的这张表作为主表,主表里面所有行都会保留,再去左边的表匹配符合条件的数据。如果左边表没有匹配上对应的记录,左边表的字段就全部填充为 NULL。
案例:保留所有成绩记录,找不到对应学生的学生列显示 NULL
sql
SELECT s.sid, s.sname, sc.cname, sc.grade
FROM student s
RIGHT JOIN score sc ON s.sid = sc.sid;

2.3 全外连接
全外连接会保留两张表里所有的数据,不管能不能匹配上。左边表匹配不到的行,右边字段填充 NULL;右边表匹配不到的行,左边字段填充 NULL。
由于MySQL 没有直接提供 FULL OUTER JOIN 语法,需要借助 UNION,合并左外连接和右外连接的结果来模拟。
sql
-- 左连接结果 UNION 右连接里排除已经匹配过的行
SELECT *
FROM student s
LEFT JOIN score sc ON s.sid = sc.sid
UNION
SELECT *
FROM student s
RIGHT JOIN score sc ON s.sid = sc.sid
WHERE s.sid IS NULL;
