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

相关推荐
激昂网络2 小时前
在Ubuntu 24.04上编译T527 Android系统:遇到的几个问题及解决方法
android·linux·ubuntu
watersink2 小时前
第16章 案例特训专题【数据库篇】
数据库
爬山算法2 小时前
MongoDB(78)什么是MongoDB的事务?
数据库·mongodb
卤炖阑尾炎2 小时前
MySQL 主从复制与读写分离:从原理到实战全解析
mysql·adb
ego.iblacat2 小时前
MySQL 高可用
数据库·mysql·adb
阿里小阿希2 小时前
PostgreSQL 判断大导入是否正在执行 pg_stat_activity
数据库·postgresql
李艺为2 小时前
android客制开发之DevCheck检测CPU核心作假
android
xrui582 小时前
PostgreSQL异常:An IO error occurred while sending to the backend
数据库·postgresql
hnlgzb2 小时前
LiveData和MutableLiveData都是什么?有什么区别?都是在什么情况下用?
android