MySQL 内连接(Inner Join)结合 Limit 限制左表查询的用法

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.字段;
Mysql

其中,字段 指的是要查询的字段名,表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;
Mysql

上面的代码中,students 表存储了学生的基本信息,包括 s.ids.names.scores.school_id 等字段,schools 表存储了学校的信息,包括 c.idc.name 等字段。注意到我们在 INNER JOIN 后面的 ON 条件中连接了两个表的 school_idid 字段,这样就可以将两个表中的相关行关联起来。然后我们按照成绩由高到低的顺序进行排序,再使用 Limit 取前 10 条记录即可。

这里还需要解释一下为什么我们要使用别名(alias)c.name as school_name。因为我们使用了 Inner Join,从而返回了两个表合并查询的结果,但是其中可能存在同名字段,比如两个表中都有字段 name。为了避免冲突,我们需要使用别名来区分不同表中相同列的定义及区分一列被查询多次的情况。

实例分析

为了更好地理解 Inner Join with Limit 的应用情况,我们接下来看一个具体的实例。假设我们有两个表 usersorders,其中 users 表记录了用户的基本信息,包括 idnameemail 等字段,orders 表则记录了用户的订单信息,包括 iduser_idproductpricedate 等字段。我们需要查询每个用户的前 5 个订单信息及总价。

首先我们需要使用 Inner Join 来关联 usersorders 表,代码如下:

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;
Mysql

上面的代码中,我们以 users 表为主表,使用 INNER JOINusers 表和 orders 表进行关联。在查询语句的 SELECT 子句中,我们选取了 u.name 作为 users 表中的用户名字,o.producto.priceo.date 分别代表 orders 表中的产品名字、价格和日期。此外,我们还在查询语句中使用了 SUM(o.price) 计算了每个用户的订单总价,使用 AS 为计算结果取了个别名 total_price。在 GROUP BY 子句中,我们按照 u.ido.date 进行分组,这样一来每个用户的订单信息就会被分成多行。最后我们按照用户 ID 和订单日期倒序排序,再使用 Limit 取前 10 条记录。

假设原表如下:

users 表:

id name email
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,使得查询结果更加精准、高效。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册