表的连接分为内连和外连
内连接:
内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。
语法格式
隐式内连接
sql
SELECT 列名
FROM 表1, 表2
WHERE 表1.连接列 = 表2.连接列 -- 连接条件
AND 其他筛选条件;
显式内连接(标准写法)
sql
SELECT 列名
FROM 表1
[INNER] JOIN 表2 ON 表1.连接列 = 表2.连接列 -- 连接条件
WHERE 其他筛选条件;
INNER关键字可以省略,直接写JOIN即可。
本质:内连接就是在笛卡尔积的基础上,加上筛选条件,去掉无意义的组合。
**备注:**前面学习的都是内连接
显示SMITH的名字和部门名称
- 用前面的写法

- 用标准的内连接写法

外连接:
外连接分为左外连接和右外连接
左外连接(LEFT OUTER JOIN)
左外连接 :以左表为基础,返回左表的所有记录 ,右表只返回匹配的记录;如果右表没有匹配,则右表字段填充为
NULL。如果联合查询,左侧的表完全显示我们就说是左外连接。
sql
SELECT 列名
FROM 左表
LEFT [OUTER] JOIN 右表
ON 连接条件;
- OUTER 关键字可以省略,直接写 LEFT JOIN 即可。
建两张表


查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
- 当左边表和右边表没有匹配时,也会显示左边表的数据

什么时候用左外连接?
| 场景 | 说明 |
|---|---|
| 需要显示左表的所有记录 | 比如显示所有学生,不管有没有成绩 |
| 找出左表中在右表没有匹配的记录 | 加上 WHERE 右表.列 IS NULL |
| 主表(左表)数据必须完整显示 | 订单表为主,关联用户信息 |
右外连接(RIGHT OUTER JOIN)
右外连接 = 右表的每一行都保留 + 左表只加匹配的行(不匹配就填 NULL)
如果联合查询,右侧的表完全显示我们就说是右外连接。
等价于:A RIGHT JOIN B=B LEFT JOIN A实际开发中很少直接用右外连接,通常改写成左外连接更清晰。
标准语法
sql
SELECT 列名
FROM 左表
RIGHT [OUTER] JOIN 右表
ON 连接条件;
OUTER关键字可以省略,直接写RIGHT JOIN即可
对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

列出部门名称和这些部门的员工信息,同时列出没有员工的部门


方法一:

方法二:

类比这个A RIGHT JOIN B=B LEFT JOIN 二者是等价的
结论:在实际开发中,右外连接几乎从来不需要主动使用,因为任何右外连接都可以改写成左外连接。
补充:
1.内连接和外连接对比
| 对比项 | 内连接(INNER JOIN) | 左外连接(LEFT JOIN) | 右外连接(RIGHT JOIN) |
|---|---|---|---|
| 保留的数据 | 只保留两表都能匹配上的行 | 保留左表全部行 | 保留右表全部行 |
| 不匹配时 | 直接丢弃该行 | 右表列填 NULL |
左表列填 NULL |
| 结果行数 | ≤ 左表行数 | ≥ 左表行数 | ≥ 右表行数 |
| 数据完整性 | 可能丢失主表数据 | 保证左表数据不丢失 | 保证右表数据不丢失 |
| 使用频率 | 最高(90%以上) | 较高 | 极低 |
| 是否可被替代 | 不可替代 | 可替代右外连接 | 可被左外连接替代 |
优缺点对比表
| 连接类型 | 优点 | 缺点 |
|---|---|---|
| 内连接 | 结果精确,只返回有效数据 性能最好(数据量最小) 逻辑简单,易理解 不会出现意外的 NULL | 会丢失主表中无匹配的数据 不适合需要保留全量数据的场景 |
| 左外连接 | 保证左表数据完整不丢失 可清晰看出哪些数据无匹配 适合主表+附属表的查询 可替代右外连接 | 结果中会出现 NULL(需处理) 数据量可能较大 性能略差于内连接 理解成本稍高 |
| 右外连接 | 保证右表数据完整不丢失 语法对称完整 | 可读性差(不直观) 可被左外连接完全替代 实际开发几乎不用 增加团队理解成本 |
2.显式内连接和隐式内连接 对比
| 对比项 | 隐式内连接(逗号语法) | 显式内连接(JOIN语法) |
|---|---|---|
| 语法 | FROM t1, t2 WHERE t1.id = t2.id |
FROM t1 JOIN t2 ON t1.id = t2.id |
| 关键字 | 逗号 , |
JOIN / INNER JOIN |
| 连接条件位置 | 在 WHERE 子句中 |
在 ON 子句中 |
| 筛选条件位置 | 也在 WHERE 子句中 |
在 WHERE 子句中(与连接条件分离) |
| 标准性 | 老式语法(SQL-89 标准) | 标准语法(SQL-92 标准) |
| 可读性 | 较差(条件混在一起) | 较好(职责分离) |
| 易错性 | 容易漏写连接条件(产生笛卡尔积) | 连接条件强制写在 ON 中 |
| 混合连接支持 | 不支持(无法混合 LEFT JOIN) | 支持(可混合 LEFT/RIGHT JOIN) |
| 实际使用 | 逐渐被淘汰 | 主流推荐 |
优缺点对比
| 对比项 | 隐式内连接 | 显式内连接 |
|---|---|---|
| 优点 | 代码量稍少(少写 JOIN/ON) | 连接和筛选分离,结构清晰 |
| 优点 | 老程序员习惯 | 符合 SQL 标准,可移植性好 |
| 优点 | --- | 容易看出连接了哪些表 |
| 优点 | --- | 不易漏写连接条件 |
| 缺点 | 连接条件和筛选条件混在一起 | 代码量稍多 |
| 缺点 | 多表时容易混乱 | --- |
| 缺点 | 容易漏写连接条件(产生笛卡尔积) | --- |
| 缺点 | 无法混合外连接 | --- |