数据库基础-07-DQL分组查询、排序查询和分页查询

一、分组查询 (GROUP BY)

分组查询是 SQL 中非常重要的一种查询方式,它可以对指定的列进行分组并对每个组进行聚合计算,以便生成每个组的汇总信息。

1、语法

SELECT 字段列表 FROM 表名[WHERE 条件] GROUP BY 分组字段名[HAVING 分组后过滤条件];

where与having区别:
执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组,而having是分组之后对结果进行过滤。判断条件不同:where不能对聚合函数进行判断,而having可以。 

注意:
执行顺序:where >聚合函数>having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

2、示例

下面是一个示例,假如有一个表格 sales 包含销售数据:

idshop_idproduct_idsale_datequantity
11012012022-01-0110
21022032022-01-025
31012012022-01-0312
41022032022-01-048
51032042022-01-056

现在需要查询每个店铺的每个产品在每个月的销量总和,则可以使用如下的 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_idproduct_idsale_monthtotal_quantity
1012012022-01-0122
1022032022-01-0113
1032042022-01-016

需要注意的是,在分组查询中,GROUP BY 子句中的列都必须出现在 SELECT 列表中,并且如果要在 SELEC 语句中用聚合函数,则必须将该列作为分组依据之一。另外,还要注意避免使
用非分组列的聚合函数,这会导致结果不准确甚至无法解释。 

 二、排序查询(ORDER BY)

SOL 排序查询是一种将结果集按照指定的规则进行排序的查询方式。通常情况下,排序查询需要使用ORDER BY 来指定排序规则,并支持对多个列进行排序和设置升序或降序排序顺序。

1、语法

SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;

2、排序方式

  • ASC:升序(默认值)
  • DESC:降序 

3、示例

假如有一个表格 students 包含学生数据 :

idnamegenderagescore
1Alicefemale2085
2Bobmale2192
3Charliemale1980
4Davidmale2295
5Emilyfemale2088

现在需要按照成绩从高到低排序,并列出每个学生的姓名、年龄和成绩,则可以使用如下的 SQL 语句:

SELECT 
    name, 
    age, 
    score
FROM 
    students
ORDER BY 
    score DESC;

这条语句使用 ORDER BY 对 score 列进行降序排序。其中,DESC 关键字表示降序排列,而不使用任何关键字则表示升序排列。

执行上述查询后,会得到下面的结果:

nameagescore
David2295
Bob2192
Emily2088
Alice2085
Charlie1980

这里的结果告诉我们,按照成绩从高到低排序后,David 的成绩最高,Charlie 的成绩最低。

在 ORDER BY 子句中可以指定多个列进行排序,多个列之间用逗号隔开,例如: 

SELECT 
    name, 
    age, 
    score
FROM 
    students
ORDER BY 
    gender DESC, 
    score ASC;

 这条语句中将先按照 gender 列降序排序,然后在相同 gender 的情况下按照 score 升序排序。

结果如下:

nameagescore
Charlie1980
Bob2192
David2295
Alice2085
Emily2088

三、分页查询(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页
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值