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

相关推荐
真实的菜6 小时前
Redis 从入门到精通(十四):Redis 7.x 新特性全解 —— 系列收官之作
数据库·redis·缓存
哭哭啼6 小时前
pgSql 事务篇
java·数据库·postgresql
霸道流氓气质6 小时前
从MySQL到云原生:全面解析阿里云PolarDB数据库及其与MySQL的核心差异
数据库·mysql·云原生
这个DBA有点耶7 小时前
时序数据库选型:吞吐、压缩与查询延迟的均衡之术
数据库·sql·架构·时序数据库·dba
snow@li7 小时前
数据库:MySQL vs PostgreSQL 详尽对比(2026版)
java·mysql·postgresql
luck_bor7 小时前
数据库简介
数据库·oracle
数智工坊7 小时前
【ROS 2 全栈入门指南三】:Action、参数与Launch文件全链路指南
android·stm32·嵌入式硬件·学习·机器人
hikktn7 小时前
Oracle批量UPDATE空值覆盖陷阱:CASE WHEN优雅防御方案【宗申集团】
数据库·oracle
Han_han9197 小时前
数据库基本操作:
数据库
J.Kuchiki7 小时前
【PostgreSQL 内核学习:平衡 K 路归并(Balanced k-way Merge)】
数据库·学习·postgresql