一、分组查询 (GROUP BY)
分组查询是 SQL 中非常重要的一种查询方式,它可以对指定的列进行分组并对每个组进行聚合计算,以便生成每个组的汇总信息。
1、语法
SELECT 字段列表 FROM 表名[WHERE 条件] GROUP BY 分组字段名[HAVING 分组后过滤条件];
where与having区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对结果进行过滤。判断条件不同:where不能对聚合函数进行判断,而having可以。
注意:
执行顺序:where >聚合函数>having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。
2、示例
下面是一个示例,假如有一个表格 sales 包含销售数据:
id | shop_id | product_id | sale_date | quantity |
---|---|---|---|---|
1 | 101 | 201 | 2022-01-01 | 10 |
2 | 102 | 203 | 2022-01-02 | 5 |
3 | 101 | 201 | 2022-01-03 | 12 |
4 | 102 | 203 | 2022-01-04 | 8 |
5 | 103 | 204 | 2022-01-05 | 6 |
现在需要查询每个店铺的每个产品在每个月的销量总和,则可以使用如下的 SQL 语句:
SELECT
shop_id,
product_id,
DATE_TRUNC('month', sale_date) AS sale_month,
SUM(quantity) AS total_quantity
FROM
sales
GROUP BY
shop_id,
product_id,
DATE_TRUNC('month', sale_date);
这条语句中使用了 GROUP BY 子句对三个列进行分组: shop_id、 product_id 和 sale_month。其中, DATE_TRUNC('month', sale_date) 函数用于将销售日期字段调整为月份。最后,使用 sum(quantity) 函数计算每个组的销量总和。
执行上述查询后,会得到下面的结果:
shop_id | product_id | sale_month | total_quantity |
---|---|---|---|
101 | 201 | 2022-01-01 | 22 |
102 | 203 | 2022-01-01 | 13 |
103 | 204 | 2022-01-01 | 6 |
需要注意的是,在分组查询中,GROUP BY 子句中的列都必须出现在 SELECT 列表中,并且如果要在 SELEC 语句中用聚合函数,则必须将该列作为分组依据之一。另外,还要注意避免使
用非分组列的聚合函数,这会导致结果不准确甚至无法解释。
二、排序查询(ORDER BY)
SOL 排序查询是一种将结果集按照指定的规则进行排序的查询方式。通常情况下,排序查询需要使用ORDER BY 来指定排序规则,并支持对多个列进行排序和设置升序或降序排序顺序。
1、语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
2、排序方式
- ASC:升序(默认值)
- DESC:降序
3、示例
假如有一个表格 students 包含学生数据 :
id | name | gender | age | score |
---|---|---|---|---|
1 | Alice | female | 20 | 85 |
2 | Bob | male | 21 | 92 |
3 | Charlie | male | 19 | 80 |
4 | David | male | 22 | 95 |
5 | Emily | female | 20 | 88 |
现在需要按照成绩从高到低排序,并列出每个学生的姓名、年龄和成绩,则可以使用如下的 SQL 语句:
SELECT
name,
age,
score
FROM
students
ORDER BY
score DESC;
这条语句使用 ORDER BY 对 score 列进行降序排序。其中,DESC 关键字表示降序排列,而不使用任何关键字则表示升序排列。
执行上述查询后,会得到下面的结果:
name | age | score |
---|---|---|
David | 22 | 95 |
Bob | 21 | 92 |
Emily | 20 | 88 |
Alice | 20 | 85 |
Charlie | 19 | 80 |
这里的结果告诉我们,按照成绩从高到低排序后,David 的成绩最高,Charlie 的成绩最低。
在 ORDER BY 子句中可以指定多个列进行排序,多个列之间用逗号隔开,例如:
SELECT
name,
age,
score
FROM
students
ORDER BY
gender DESC,
score ASC;
这条语句中将先按照 gender 列降序排序,然后在相同 gender 的情况下按照 score 升序排序。
结果如下:
name | age | score |
---|---|---|
Charlie | 19 | 80 |
Bob | 21 | 92 |
David | 22 | 95 |
Alice | 20 | 85 |
Emily | 20 | 88 |
三、分页查询(LIMIT)
在数据库中,如果一张表的记录非常多,一次性把所有数据都查询出来会耗费很长时间和资源,而且也无法一次性展示在页面上。因此需要使用分页查询来获取和呈现数据。
注意:
- 起始索引从0开始,起始索引= (查询页码- 1)* 每页显示记录数。
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是UIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。
1、语法
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
分页查询的具体实现代码如下(以 MySQL 为例):
-- 分页查询,每页10条数据
SELECT * FROM users
ORDER BY id DESC
LIMIT 0, 10; -- 查询第1页
SELECT * FROM users
ORDER BY id DESC
LIMIT 10, 10; -- 查询第2页
SELECT * FROM users
ORDER BY id DESC
LIMIT 20, 10; -- 查询第3页