MySQL 内连接(Inner Join)结合 Limit 限制左表查询的用法
在本文中,我们将介绍 MySQL 内连接(Inner Join)结合 Limit 限制左表查询的用法。内连接是一种常见的关联查询,在实际应用中经常用于多表查询。
阅读更多:MySQL 教程
Inner Join 简介
Inner Join 又叫做内连接或等值连接,是常用的 SQL 连接方式之一,用于将两个或多个表中符合条件的行连接在一起。具体来说,Inner Join 会返回两个表中根据指定条件关联起来的行。Inner Join 查询语句的基本语法如下:
SELECT 字段 FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段;
其中,字段 指的是要查询的字段名,表1 和 表2 是要连接的两个表,ON 后面是连接条件。
Inner Join with Limit
如果我们需要在 Inner Join 查询中对左表进行 Limit 限制,该怎么办呢?比如我们需要查询学生信息和对应的学校信息,但是只需要查询前 10 名成绩最好的学生,代码如下:
SELECT s.*, c.name as school_name
FROM students s
INNER JOIN schools c ON s.school_id = c.id
ORDER BY s.score DESC
LIMIT 10;
上面的代码中,students 表存储了学生的基本信息,包括 s.id、s.name、s.score 和 s.school_id 等字段,schools 表存储了学校的信息,包括 c.id 和 c.name 等字段。注意到我们在 INNER JOIN 后面的 ON 条件中连接了两个表的 school_id 和 id 字段,这样就可以将两个表中的相关行关联起来。然后我们按照成绩由高到低的顺序进行排序,再使用 Limit 取前 10 条记录即可。
这里还需要解释一下为什么我们要使用别名(alias)c.name as school_name。因为我们使用了 Inner Join,从而返回了两个表合并查询的结果,但是其中可能存在同名字段,比如两个表中都有字段 name。为了避免冲突,我们需要使用别名来区分不同表中相同列的定义及区分一列被查询多次的情况。
实例分析
为了更好地理解 Inner Join with Limit 的应用情况,我们接下来看一个具体的实例。假设我们有两个表 users 和 orders,其中 users 表记录了用户的基本信息,包括 id、name 和 email 等字段,orders 表则记录了用户的订单信息,包括 id、user_id、product、price 和 date 等字段。我们需要查询每个用户的前 5 个订单信息及总价。
首先我们需要使用 Inner Join 来关联 users 和 orders 表,代码如下:
SELECT u.name, o.product, o.price, o.date, SUM(o.price) AS total_price
FROM users u
INNER JOIN orders o ON u.id = o.user_id
GROUP BY u.id, o.date
ORDER BY u.id, o.date DESC
LIMIT 10;
上面的代码中,我们以 users 表为主表,使用 INNER JOIN 将 users 表和 orders 表进行关联。在查询语句的 SELECT 子句中,我们选取了 u.name 作为 users 表中的用户名字,o.product、o.price 和 o.date 分别代表 orders 表中的产品名字、价格和日期。此外,我们还在查询语句中使用了 SUM(o.price) 计算了每个用户的订单总价,使用 AS 为计算结果取了个别名 total_price。在 GROUP BY 子句中,我们按照 u.id 和 o.date 进行分组,这样一来每个用户的订单信息就会被分成多行。最后我们按照用户 ID 和订单日期倒序排序,再使用 Limit 取前 10 条记录。
假设原表如下:
users 表:
| id | name | |
|---|---|---|
| 1 | Alice | alice@test.com |
| 2 | Bob | bob@test.com |
| 3 | Carol | carol@test.com |
| 4 | David | david@test.com |
| 5 | Emily | emily@test.com |
orders 表:
| id | user_id | product | price | date |
|---|---|---|---|---|
| 1 | 1 | iPhone | 999 | 2021-10-01 |
| 2 | 1 | MacBook | 1999 | 2021-09-30 |
| 3 | 1 | iPad | 799 | 2021-09-30 |
| 4 | 2 | iMac | 2999 | 2021-10-01 |
| 5 | 2 | AirPods | 199 | 2021-10-02 |
| 6 | 3 | Apple TV | 599 | 2021-10-02 |
运行上面的查询语句,得到的结果如下:
| name | product | price | date | total_price |
|---|---|---|---|---|
| Alice | iPhone | 999 | 2021-10-01 | 2797 |
| Alice | iPad | 799 | 2021-09-30 | 2797 |
| Alice | MacBook | 1999 | 2021-09-30 | 2797 |
| Bob | iMac | 2999 | 2021-10-01 | 3198 |
| Bob | AirPods | 199 | 2021-10-02 | 3198 |
| Carol | Apple TV | 599 | 2021-10-02 | 599 |
我们可以看到,查询结果展示了每个用户的前 5 个订单及订单总价。比如 Alice 的订单总价为 2797,由 iPhone、iPad 和 MacBook 三个产品组成;Bob 的订单总价为 3198,由 iMac 和 AirPods 两个产品组成。Carol 只有一个订单,因此其订单总价为 599,并且不需要展示前 5 个订单。
总结
MySQL 的 Inner Join 是一种常见的多表查询方式,可以将两个或多个表中符合条件的行连接在一起。结合 Limit 语句,可以限制查询结果集的行数,从而提高查询效率。在实际应用中,我们可以根据具体场景灵活运用 Inner Join with Limit,使得查询结果更加精准、高效。
极客教程