SQL单表查询的排序、聚合、分组操作

 更新时间:2026年01月06日 09:40:57   作者:啦啦啦0526  
本文主要介绍了SQL单表查询的排序、聚合、分组等操作,包括排序查询、聚合函数和分组查询的使用方法和示例,最后总结了SQL查询的顺序书写和执行顺序,感兴趣的朋友跟随小编一起看看吧

一、引言

今天主要讲一讲昨天剩下的排序、聚合、分组等单表查询的一些操作.

二、单表查询

1.排序查询

知识点:

排序查询关键字: order by

排序查询基础格式: select 字段名 from 表名 order by 排序字段名 asc|desc;

asc : 升序(默认) desc: 降序

进阶格式: select 字段名 from 表名 order by 排序字段1名 asc|desc , 排序字段2名 asc|desc;

注意: 如果order by后跟多个排序字段,先按照前面的字段排序,如果有相同值的情况再按照后面的排序规则排序

-- 示例1:查询所有商品,并按照评分从高到低进行排序

SELECT * FROM products ORDER BY score DESC;

-- 示例2:查询所有商品,先按照评分从高到低进行排序,评分相同的按照价格从低到高排序 SELECT * FROM products ORDER BY score DESC, price;

2.聚合函数

知识点:

聚合函数: 又叫统计函数,也叫分组函数

常用聚合函数: sum( )         count( )         avg( )         max( )         min( )

聚合查询基础格式: select         聚合函数(字段名)         from         表名;

注意: 此处没有分组默认整个表就是一个大的分组

注意: 聚合函数(字段名)会自动忽略null值,以后统计个数一般用count(*)统计因为它不会忽略null值

示例:

# 注意: 别名不建议用中文,以下仅仅为了演示
-- 示例1:统计当前商品一共有多少件
SELECT count(id) FROM products;
SELECT count(*) FROM products;
-- 示例2:对商品评分列进行计数、求最大、求最小、求和、求平均
SELECT
    COUNT(score) AS cnt,
    MAX(score) AS max_score,
    MIN(score) AS min_score,
    SUM(score) AS total_score,
    AVG(score) AS avg_score
FROM products;
-- 示例3:统计所有非自营商品评分的平均值
SELECT
    is_self,
    AVG(score)
FROM
    products
WHERE
    is_self = '非自营';

3.分组查询

分组查询关键字: group by

分组查询基础格式: select 分组字段名,聚合函数(字段名) from 表名 group by 分组字段名;

注意: select后的字段名要么在group by后面出现过,要么写到聚合函数中,否则报错.

分组查询进阶格式: select 分组字段名,聚合函数(字段名) from 表名 [where 非聚合条件] group by 分组字段名 [having 聚合条件];

where和having的区别?

书写顺序: where在group by 前,having在group by后

执行顺序: where在分组前,having在分组后

分组函数: where后不能跟聚合条件,只能跟非聚合条件,having后可以使用聚合条件,也可以使用非聚合条件(不建议)

应用场景: 建议大多数过滤数据都采用where,只有当遇到聚合条件的时候再使用having

使用别名: where后不能使用别名,having后可以使用别名

-- 示例1:统计每个分类的商品数量
SELECT
    category_id,
    -- ② 再聚合:对每一组的id进行count计数
    COUNT(id) AS cnt
FROM products
-- ① 先分组:按照category_id进行分组
GROUP BY category_id;
-- 示例2:统计每个分类中自营和非自营商品的数量
SELECT
    category_id,
    is_self,
    COUNT(id) AS cnt
FROM products
GROUP BY category_id, is_self;
-- 示例3:统计每个分类商品的平均价格,并筛选出平均价格低于1000的分类
SELECT category_id,
       -- 再聚合
       AVG(price)
FROM products
-- 先分组
GROUP BY category_id
-- 对分组聚合的结果进行筛选
HAVING AVG(price) < 1000;

4.limit查询

知识点:

分页查询关键字: limit

分页查询基础格式: select 字段名 from 表名 limit x,y;

                x: 起始索引,默认从0开始 x = (页数-1)*y

                y: 本次查询的条数

注意: limit能完成topN需求,但是不能考虑到并列情况,此问题可以使用后期学习的开窗函数解决

示例:

- 示例1:获取所有商品中,价格最高的商品信息
SELECT
    *
FROM products
ORDER BY price DESC
LIMIT 1; -- LIMIT 0, 1;
-- 示例2:将商品数据按照价格从低到高排序,然后获取第2页内容(每页3条)
SELECT
    *
FROM products
ORDER BY price
LIMIT 3, 3;
-- 示例3:当分页展示的数据不存在时,不报错,只不过查询不到任何数据
SELECT * FROM products LIMIT 20, 10;

5.SQL顺序

书写顺序: SELECT -> DISTINCT -> 聚合函数 -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT

执行顺序: FROM -> WHERE -> GROUP BY -> 聚合函数 -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT

大家记住最后这个执行顺序就好,前面的各种格式都是根据这个来的.

三、结语

今天就先讲这么多吧,下次给大家讲用python操作MySql.

到此这篇关于SQL单表查询全攻略:排序聚合分组的文章就介绍到这了,更多相关sql单表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论