SQL命令详解之多表查询(连接查询)

发布于:2025-03-04 ⋅ 阅读:(22) ⋅ 点赞:(0)

目录

1 简介

2 内连接查询

2.1 内连接语法

2.2 内连接练习

3 外连接查询

3.1 外连接语法

3.2 外连接练习

4 总结


1 简介

连接的本质就是把各个表中的记录都取出来依次匹配的组合加入结果集并返回给用户。我们把 t1 和 t2 两个表连接起来的过程如下图所示:


在 MySQL 中多表查询分为连接查询和子查询,而连接查询又分为内连接查询和外连接查询,外连接查询的方式有左外连接查询和右外连接查询。

2 内连接查询

2.1 内连接语法

内连接查询分为隐式内连接查询和显式内连接查询,表示查询 A 集合和 B 集合的交集。


语法:

-- 隐式内连接查询
SELECT 字段列表 FROM 表1,表2… WHERE 条件;
-- 显示内连接查询
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 条件;

2.2 内连接练习

练习一:查询每名同学的姓名、成绩

student 表:
+------+--------+------------+-------+
| s_id | s_name | s_birth    | s_sex |
+------+--------+------------+-------+
| 01   | 赵雷   | 1990-01-01 | 男    |
| 02   | 钱电   | 1990-12-21 | 男    |
| 03   | 孙风   | 1990-05-20 | 男    |
| 04   | 李云   | 1990-08-06 | 男    |
| 05   | 周梅   | 1991-12-01 | 女    |
| 06   | 吴兰   | 1992-03-01 | 女    |
| 07   | 郑竹   | 1989-07-01 | 女    |
| 08   | 王菊   | 1990-01-20 | 女    |
+------+--------+------------+-------+

score 表:
+------+------+---------+
| s_id | c_id | s_score |
+------+------+---------+
| 01   | 01   |      80 |
| 01   | 02   |      90 |
| 01   | 03   |      99 |
| 02   | 01   |      70 |
| 02   | 02   |      60 |
| 02   | 03   |      80 |
| 03   | 01   |      80 |
| 03   | 02   |      80 |
| 03   | 03   |      80 |
| 04   | 01   |      50 |
| 04   | 02   |      30 |
| 04   | 03   |      20 |
| 05   | 01   |      76 |
| 05   | 02   |      87 |
| 06   | 01   |      31 |
| 06   | 03   |      34 |
| 07   | 02   |      89 |
| 07   | 03   |      98 |
+------+------+---------+

Course 表:
+------+--------+------+
| c_id | c_name | t_id |
+------+--------+------+
| 01   | 语文   | 02   |
| 02   | 数学   | 01   |
| 03   | 英语   | 03   |
+------+--------+------+

编写一个 SQL 查询 学生姓名、课程名、成绩

mysql> SELECT
    ->     t2.s_name,
    ->     t3.c_name,
    ->     t1.s_score
    -> FROM
    ->     score t1
    ->     JOIN student t2 ON t1.s_id = t2.s_id
    ->     JOIN Course t3 ON t1.c_id = t3.c_id;
    
+--------+--------+---------+
| s_name | c_name | s_score |
+--------+--------+---------+
| 赵雷   | 语文   |      80 |
| 赵雷   | 数学   |      90 |
| 赵雷   | 英语   |      99 |
| 钱电   | 语文   |      70 |
| 钱电   | 数学   |      60 |
| 钱电   | 英语   |      80 |
| 孙风   | 语文   |      80 |
| 孙风   | 数学   |      80 |
| 孙风   | 英语   |      80 |
| 李云   | 语文   |      50 |
| 李云   | 数学   |      30 |
| 李云   | 英语   |      20 |
| 周梅   | 语文   |      76 |
| 周梅   | 数学   |      87 |
| 吴兰   | 语文   |      31 |
| 吴兰   | 英语   |      34 |
| 郑竹   | 数学   |      89 |
| 郑竹   | 英语   |      98 |
+--------+--------+---------+

3 外连接查询

3.1 外连接语法

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

  1. 左外连接查询:相当于查询 A 表所有数据和交集部分数据。

  2. 右外连接查询:相当于查询 B 表所有数据和交集部分数据。


语法:

-- 左外连接
SELECT 字段列表 FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件;
-- 右外连接
SELECT 字段列表 FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件;

3.2 外连接练习

练习一:连续出现的数字

表:Logs
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+
在 SQL 中,id 是该表的主键。
id 是一个自增列。

找出所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
结果格式如下面的例子所示:

示例 1:
输入:
Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+
输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+
解释:1 是唯一连续出现至少三次的数字。

找出所有至少连续出现三次的数字:

select 
    distinct t1.num as ConsecutiveNums
from
    Logs t1 
leftjoin
    logs t2 on t1.num = t2.num and t1.id = t2.id-1
leftjoin
    logs t3 on t1.num = t3.num and t2.id = t3.id-1
where t3.num isnotnull;

4 总结

本文介绍了MySQL中的连接查询,包括内连接和外连接的使用方法。内连接查询用于获取两个表中交集部分的数据,分为隐式内连接和显式内连接两种方式。通过内连接,我们可以实现多表联合查询,如查询学生的姓名、课程名称和成绩。外连接查询分为左外连接和右外连接,左外连接返回左表的所有数据和右表匹配的数据,而右外连接则返回右表的所有数据和左表匹配的数据。通过外连接,我们能够处理一些不完全匹配的数据,比如查找连续出现至少三次的数字。通过本文的练习,读者可以掌握多表查询的基本技巧,并理解连接查询的实际应用。