MySql 内外连接

接上文: 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**子句用于对连接后的结果进行过滤。

相关推荐
Kapaseker25 分钟前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋1 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧16 小时前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏16 小时前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧17 小时前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄17 小时前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭17 小时前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景18 小时前
Kotlin Flow操作符学习
android·kotlin
plainGeekDev19 小时前
GreenDAO → Room
android·java·kotlin
weiggle19 小时前
第八篇:ViewModel + Compose——生产级状态管理实践
android