接上文: MySQL复合查询-CSDN博客
1. 内连接(INNER JOIN)
1.1 概念
内连接是返回两个表中满足连接条件的交集部分。它实际上是对两表的笛卡儿积进行筛选,只保留匹配的行。
1.2 语法
sql
SELECT 字段
FROM 表1
INNER JOIN 表2
ON 连接条件
[WHERE 其他条件];
注:
INNER JOIN可简写为JOIN,效果相同。
1.3 示例
案例 :显示员工 **SMITH**的名字和部门名称。
传统写法(隐式内连接):
sql
SELECT ename, dname
FROM EMP, DEPT
WHERE EMP.deptno = DEPT.deptno AND ename = 'SMITH';

标准内连接写法(显式内连接):
sql
SELECT ename, dname
FROM EMP
INNER JOIN DEPT ON EMP.deptno = DEPT.deptno
WHERE ename = 'SMITH';

2. 外连接(OUTER JOIN)
外连接会返回一个表中的所有记录,即使另一个表中没有匹配的记录。
2.1 左外连接(LEFT JOIN)
概念
如果联合查询,左侧的表完全显示我们就说是左外连接。
语法
sql
SELECT 字段
FROM 表1
LEFT JOIN 表2
ON 连接条件;
示例
学生表:
sql
CREATE TABLE stu (id INT, name VARCHAR(30));
INSERT INTO stu VALUES (1,'jack'), (2,'tom'), (3,'kitty'), (4,'nono');
成绩表:
sql
CREATE TABLE exam (id INT, grade INT);
INSERT INTO exam VALUES (1, 56), (2, 76), (11, 8);
查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来:
sql
SELECT *
FROM stu
LEFT JOIN exam ON stu.id = exam.id;
结果:

2.2 右外连接(RIGHT JOIN)
概念
如果联合查询,右侧的表完全显示我们就说是右外连接。
语法
sql
SELECT 字段
FROM 表1
RIGHT JOIN 表2
ON 连接条件;
示例
对 stu 表和 exam 表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要
显示出来 :
sql
SELECT *
FROM stu
RIGHT JOIN exam ON stu.id = exam.id;
结果:

2.3 补充:外连接的常见使用场景
-
LEFT JOIN:以左表为主表,常用于需要保留主表全部数据的场景。
-
RIGHT JOIN:以右表为主表,常用于需要保留右表全部数据的场景。
-
两者可以互换,只需调整表顺序即可。
练习示例
列出部门名称和这些部门的员工信息,同时列出没有员工的部门。
方法一(左连接):
sql
SELECT d.dname, e.*
FROM dept d
LEFT JOIN emp e ON d.deptno = e.deptno;

方法二(右连接):
sql
SELECT d.dname, e.*
FROM emp e
RIGHT JOIN dept d ON d.deptno = e.deptno;

3. 知识点补充
3.1 连接类型的对比
| 连接类型 | 返回结果 |
|---|---|
| INNER JOIN | 只返回两表匹配的行 |
| LEFT JOIN | 返回左表所有行,右表匹配的行,无匹配则 NULL |
| RIGHT JOIN | 返回右表所有行,左表匹配的行,无匹配则 NULL |
| FULL OUTER JOIN | MySQL 不支持,但可通过 UNION 实现 |
3.2 多表连接
可以连续使用多个**JOIN** 连接多个表:
sql
SELECT *
FROM 表1
JOIN 表2 ON 条件1
JOIN 表3 ON 条件2;
3.3 连接条件与过滤条件的区别
-
**
ON**子句用于指定连接条件。 -
**
WHERE**子句用于对连接后的结果进行过滤。