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

相关推荐
2301_7815714216 分钟前
NumPy张量缩并怎么用_np.einsum()爱因斯坦求和约定高级索引魔法
jvm·数据库·python
Mr. zhihao22 分钟前
Agentic 知识库:Agent Wiki不是取代向量数据库,而是让 Agent 学会“多模态思考”
数据库·agent·angetic
IvorySQL34 分钟前
从 repack.c 深入理解 PostgreSQL REPACK 的底层实现
数据库·postgresql·开源
爱码小白40 分钟前
MySQL索引与SQL优化
大数据·数据库·python
2303_8212873841 分钟前
MySQL行锁和表锁如何区分_通过explain查看锁等待机制.txt
jvm·数据库·python
是垚不是土44 分钟前
PostgreSQL 运维工程师 “一本通“ :安装、配置、备份与监控
linux·运维·数据库·postgresql·运维开发
i220818 Faiz Ul1 小时前
宠物猫之猫咖管理系统|基于java + vue宠物猫之猫咖管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·宠物猫之猫咖管理系统
应用市场1 小时前
eMMC 与 UFS 存储原理及在 Android 中的应用
android
随遇丿而安1 小时前
第4周:ImageView 最怕的不是不会显示图片,而是显示得“不对劲”
android
Mart!nHu1 小时前
Android10 添加以太网网络共享功能
android·以太网共享