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

相关推荐
知行合一。。。4 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)5 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
天空之城--5 小时前
Android Koin 完全指南:从原理到实践
android
上学的小垃圾6 小时前
01-数据库系统概述
数据库
zhangphil6 小时前
Android main thread主线程Choreographer doFrame发生FullSuspendCheck
android
二进制漫游记6 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996226 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄9 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato10 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情67310 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql