【MySQL】第十二弹---表连接详解:从内连接到外连接

✨个人主页:熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】【MySQL】

目录

1.表的内连和外连

[1.1 内连接](#1.1 内连接)

[1.2 外连接](#1.2 外连接)

[1.2.1 左外连接](#1.2.1 左外连接)

[1.2.1 右外连接](#1.2.1 右外连接)

[1.3 实战OJ](#1.3 实战OJ)


1.表的内连和外连

表的连接分为内连和外连。

1.1 内连接

内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。

语法:

复制代码
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

备注:前面学习的都是内连接。

案例:

  • 显示SMITH的名字和部门名称

使用笛卡尔积

复制代码
mysql> select ename,dname from emp,dept where emp.deptno = dept.deptno and ename = 'SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

使用内连接

复制代码
# 方式一:使用and连接条件
mysql> select ename,dname from emp inner join dept on emp.deptno = dept.deptno and ename = 'SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.01 sec)

# 方式二:使用where条件(更好理解,先新建表再条件查询)
mysql> select ename,dname from emp inner join dept on emp.deptno = dept.deptno where ename = 'SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

1.2 外连接

外连接分为左外连接和右外连接。

1.2.1 左外连接

如果联合查询,左侧的表完全显示我们就说是左外连接

语法:

复制代码
select 字段名  from 表名1 left join 表名2 on 连接条件

案例:

新建两张表

学生表

复制代码
# 创建学生表
mysql> create table stu (id int, name varchar(30));
Query OK, 0 rows affected (0.06 sec)

# 查看表结构
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

# 插入数据
mysql> insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

# 查询数据
mysql> select * from stu;
+------+------+
| id   | name |
+------+------+
|    1 | jack |
|    2 | tom  |
|    3 | kity |
|    4 | nono |
+------+------+
4 rows in set (0.00 sec)

成绩表

复制代码
# 创建成绩表
mysql> create table exam (id int, grade int);
Query OK, 0 rows affected (0.06 sec)

# 查看表结构
mysql> desc exam;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| grade | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec)

# 插入数据
mysql> insert into exam values(1, 56),(2,76),(11, 8);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

# 查看表数据
mysql> select * from exam;
+------+-------+
| id   | grade |
+------+-------+
|    1 |    56 |
|    2 |    76 |
|   11 |     8 |
+------+-------+
3 rows in set (0.00 sec)
  • 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

学生表的内容要全部显示出来,使用左外连接。

复制代码
mysql> select * from stu left join exam on stu.id = exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
|    3 | kity | NULL |  NULL |
|    4 | nono | NULL |  NULL |
+------+------+------+-------+
4 rows in set (0.00 sec)

在外连接中,有的信息直接打印,没有的信息使用NULL打印。

1.2.1 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接

语法:

复制代码
select 字段 from 表名1 right join 表名2  on 连接条件;

案例:

  • 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

把成绩表都打印出来,使用右外连接。

复制代码
mysql> select * from stu right join exam on stu.id = exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
| NULL | NULL |   11 |     8 |
+------+------+------+-------+
3 rows in set (0.00 sec)

也可以使用左外连接,将成绩表作为左表。

复制代码
mysql> select * from exam left join stu on exam.id = stu.id;
+------+-------+------+------+
| id   | grade | id   | name |
+------+-------+------+------+
|    1 |    56 |    1 | jack |
|    2 |    76 |    2 | tom  |
|   11 |     8 | NULL | NULL |
+------+-------+------+------+
3 rows in set (0.00 sec)

1.3 实战OJ

Rank Scores

Exchange Seats

相关推荐
Edingbrugh.南空12 分钟前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink
上单带刀不带妹12 分钟前
手写 Vue 中虚拟 DOM 到真实 DOM 的完整过程
开发语言·前端·javascript·vue.js·前端框架
Kaltistss32 分钟前
98.验证二叉搜索树
算法·leetcode·职场和发展
知己如祭36 分钟前
图论基础(DFS、BFS、拓扑排序)
算法
mit6.8241 小时前
[Cyclone] 哈希算法 | SIMD优化哈希计算 | 大数运算 (Int类)
算法·哈希算法
BD_Marathon1 小时前
Ubuntu:Mysql服务器
服务器·mysql·ubuntu
c++bug1 小时前
动态规划VS记忆化搜索(2)
算法·动态规划
哪 吒1 小时前
2025B卷 - 华为OD机试七日集训第5期 - 按算法分类,由易到难,循序渐进,玩转OD(Python/JS/C/C++)
python·算法·华为od·华为od机试·2025b卷
-凌凌漆-1 小时前
【Qt】QStringLiteral 介绍
开发语言·qt
程序员爱钓鱼1 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin