前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL 排序、分页查询、聚合查询

MySQL 排序、分页查询、聚合查询

作者头像
Michael阿明
发布2020-07-13 15:16:33
发布2020-07-13 15:16:33
3.1K00
代码可运行
举报
运行总次数:0
代码可运行

1. 排序

SELECT查询时,是根据主键排序

  • 根据其他条件排序,可以加上ORDER BY子句(默认升序 ASC,可省略)
代码语言:javascript
代码运行次数:0
运行
复制
SELECT id, name, gender, score FROM students ORDER BY score;
  • 降序DESC
代码语言:javascript
代码运行次数:0
运行
复制
ORDER BY <列名> DESC  # 降序排列
代码语言:javascript
代码运行次数:0
运行
复制
SELECT id, name, gender, score FROM students ORDER BY score DESC;
  • 多条件排序
代码语言:javascript
代码运行次数:0
运行
复制
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
# 先根据分数降序,然后根据性别
  • 如果有WHERE子句,那么ORDER BY子句要放到WHERE子句后面
代码语言:javascript
代码运行次数:0
运行
复制
SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;

2. 分页查询

查询时,如果结果集数据量很大,分页显示

可以通过LIMIT <M> OFFSET <N>子句实现。每次显示最多 M 条,从第 N 条记录开始算

代码语言:javascript
代码运行次数:0
运行
复制
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0; # 每页3条记录,从第0条开始

OFFSET超过了查询的最大数量不会报错,得到一个空集

OFFSET是可选的,如果只写LIMIT 15 == LIMIT 15 OFFSET 0

在MySQL中,LIMIT 15 OFFSET 30 == LIMIT 30, 15

使用LIMIT <M> OFFSET <N>分页时,随着N越来越大,查询效率也会越来越低

3. 聚合查询

SQL内置的COUNT()函数查询行数

代码语言:javascript
代码运行次数:0
运行
复制
SELECT COUNT(*) FROM students; # 返回一个二维表 ,一行一列

共有10条记录

设置别名

代码语言:javascript
代码运行次数:0
运行
复制
SELECT COUNT(*) num FROM students;

函数

说明

SUM

计算某一列的合计值,该列必须为数值类型

AVG

计算某一列的平均值,该列必须为数值类型

MAX

计算某一列的最大值,可以对字符串排序

MIN

计算某一列的最小值,可以对字符串排序

代码语言:javascript
代码运行次数:0
运行
复制
SELECT AVG(score) average FROM students WHERE gender = 'M';

特别注意:WHERE没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回 NULL

3.1 分组聚合 GROUP BY

代码语言:javascript
代码运行次数:0
运行
复制
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;

使用多个列进行分组。例如,统计各班的男女人数:

代码语言:javascript
代码运行次数:0
运行
复制
SELECT class_id, gender, COUNT(*) num FROM students 
GROUP BY class_id, gender;
代码语言:javascript
代码运行次数:0
运行
复制
每个班级的平均分
SELECT class_id, AVG(score) avgsc FROM students
GROUP BY class_id ORDER BY avgsc DESC;
代码语言:javascript
代码运行次数:0
运行
复制
每个班级男生和女生的平均分
SELECT class_id, gender, AVG(score) avgsc FROM students
GROUP BY class_id, gender ORDER BY avgsc DESC;

练习 LeetCode 176. 第二高的薪水

题目:

编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

代码语言:javascript
代码运行次数:0
运行
复制
+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。 如果不存在第二高的薪水,那么查询应返回 null。

代码语言:javascript
代码运行次数:0
运行
复制
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/second-highest-salary 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

  • DISTINCT去重,题目要求不能并列(200,200的话,第二高为NULL)
代码语言:javascript
代码运行次数:0
运行
复制
# Write your MySQL query statement below
SELECT 
(
    SELECT DISTINCT Salary
    FROM Employee ORDER BY Salary DESC
    LIMIT 1 OFFSET 1
)
SecondHighestSalary

194 ms

练习 LeetCode 177. 第N高的薪水

题目: 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。

代码语言:javascript
代码运行次数:0
运行
复制
+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。 如果不存在第 n 高的薪水,那么查询应返回 null。

代码语言:javascript
代码运行次数:0
运行
复制
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/nth-highest-salary 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

  • 跟上题一样,注意提前设置 N-1的值,不支持 OFFSET N-1写法
代码语言:javascript
代码运行次数:0
运行
复制
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    set n = N-1;
  RETURN (
      # Write your MySQL query statement below.
      SELECT DISTINCT Salary
      FROM Employee ORDER BY Salary DESC
      LIMIT 1 OFFSET n
  );
END

246 ms

练习 LeetCode 182. 查找重复的电子邮箱

题目:

编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。

代码语言:javascript
代码运行次数:0
运行
复制
Create table If Not Exists Person (Id int, Email varchar(255))
Truncate table Person
insert into Person (Id, Email) values ('1', 'a@b.com')
insert into Person (Id, Email) values ('2', 'c@d.com')
insert into Person (Id, Email) values ('3', 'a@b.com')
代码语言:javascript
代码运行次数:0
运行
复制
示例:
+----+---------+
| Id | Email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+
根据以上输入,你的查询应返回以下结果:

+---------+
| Email   |
+---------+
| a@b.com |
+---------+
说明:所有电子邮箱都是小写字母。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/duplicate-emails 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

使用 HAVING 关键字

代码语言:javascript
代码运行次数:0
运行
复制
# Write your MySQL query statement below
SELECT Email FROM Person GROUP BY Email HAVING COUNT(Email)>1;

265 ms

练习 LeetCode 620. 有趣的电影

题目:

某城市开了一家新的电影院,吸引了很多人过来看电影。 该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。

作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列

代码语言:javascript
代码运行次数:0
运行
复制
例如,下表 cinema:
+---------+-----------+--------------+-----------+
|   id    | movie     |  description |  rating   |
+---------+-----------+--------------+-----------+
|   1     | War       |   great 3D   |   8.9     |
|   2     | Science   |   fiction    |   8.5     |
|   3     | irish     |   boring     |   6.2     |
|   4     | Ice song  |   Fantacy    |   8.6     |
|   5     | House card|   Interesting|   9.1     |
+---------+-----------+--------------+-----------+

对于上面的例子,则正确的输出是为:
+---------+-----------+--------------+-----------+
|   id    | movie     |  description |  rating   |
+---------+-----------+--------------+-----------+
|   5     | House card|   Interesting|   9.1     |
|   1     | War       |   great 3D   |   8.9     |
+---------+-----------+--------------+-----------+

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/not-boring-movies 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

代码语言:javascript
代码运行次数:0
运行
复制
# Write your MySQL query statement below
SELECT * FROM cinema 
WHERE description != 'boring' 
        AND id%2 = 1 
ORDER BY rating DESC

或者用 mod(id,2) = 1

!=也可以用<>

198 ms

练习 LeetCode 183. 从不订购的客户

题目:

某网站包含两个表,Customers 表和 Orders 表。 编写一个 SQL 查询,找出所有从不订购任何东西的客户。

代码语言:javascript
代码运行次数:0
运行
复制
Customers 表:
+----+-------+
| Id | Name  |
+----+-------+
| 1  | Joe   |
| 2  | Henry |
| 3  | Sam   |
| 4  | Max   |
+----+-------+

Orders 表:
+----+------------+
| Id | CustomerId |
+----+------------+
| 1  | 3          |
| 2  | 1          |
+----+------------+

例如给定上述表格,你的查询应返回:
+-----------+
| Customers |
+-----------+
| Henry     |
| Max       |
+-----------+

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/customers-who-never-order 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

NOT IN 关键字

代码语言:javascript
代码运行次数:0
运行
复制
# Write your MySQL query statement below
SELECT C.Name Customers
FROM Customers C
WHERE C.Id NOT IN 
(
    SELECT CustomerId FROM Orders
)

或者

代码语言:javascript
代码运行次数:0
运行
复制
# Write your MySQL query statement below
SELECT C.Name Customers
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.Id = O.CustomerId
WHERE O.CustomerId is null

363 ms

练习 LeetCode 596. 超过5名学生的课

题目:

有一个courses 表 ,有: student (学生) 和 class (课程)。

请列出所有超过或等于5名学生的课。

代码语言:javascript
代码运行次数:0
运行
复制
例如,表:
+---------+------------+
| student | class      |
+---------+------------+
| A       | Math       |
| B       | English    |
| C       | Math       |
| D       | Biology    |
| E       | Math       |
| F       | Computer   |
| G       | Math       |
| H       | Math       |
| I       | Math       |
+---------+------------+
应该输出:
+---------+
| class   |
+---------+
| Math    |
+---------+
Note:
学生在每个课中不应被重复计算。(有课程中,重复出现2次A,只算一次)

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/classes-more-than-5-students 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题:

代码语言:javascript
代码运行次数:0
运行
复制
# Write your MySQL query statement below
SELECT class FROM courses GROUP BY class
HAVING COUNT(DISTINCT student) >= 5;

206 ms

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/06/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 排序
  • 2. 分页查询
  • 3. 聚合查询
    • 3.1 分组聚合 GROUP BY
  • 练习 LeetCode 176. 第二高的薪水
  • 练习 LeetCode 177. 第N高的薪水
  • 练习 LeetCode 182. 查找重复的电子邮箱
  • 练习 LeetCode 620. 有趣的电影
  • 练习 LeetCode 183. 从不订购的客户
  • 练习 LeetCode 596. 超过5名学生的课
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档