SQL单表查询的排序、聚合、分组操作
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">一、引言</a></li><li><a href="#_label1">二、单表查询</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">1.排序查询</a></li><li><a href="#_lab2_1_1">2.聚合函数</a></li><li><a href="#_lab2_1_2">3.分组查询</a></li><li><a href="#_lab2_1_3">4.limit查询</a></li><li><a href="#_lab2_1_4">5.SQL顺序</a></li></ul><li><a href="#_label2">三、结语</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>一、引言</h2><p>今天主要讲一讲昨天剩下的排序、聚合、分组等单表查询的一些操作.</p>
<p class="maodian"><a name="_label1"></a></p><h2>二、单表查询</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>1.排序查询</h3>
<p>知识点:</p>
<p>排序查询关键字: order by</p>
<p>排序查询基础格式: select 字段名 from 表名 order by 排序字段名 asc|desc;</p>
<p>asc : 升序(默认) desc: 降序</p>
<p>进阶格式: select 字段名 from 表名 order by 排序字段1名 asc|desc , 排序字段2名 asc|desc;</p>
<p>注意: 如果order by后跟多个排序字段,先按照前面的字段排序,如果有相同值的情况再按照后面的排序规则排序</p>
<blockquote><p>-- 示例1:查询所有商品,并按照评分从高到低进行排序</p>
<p>SELECT * FROM products ORDER BY score DESC;</p>
<p>-- 示例2:查询所有商品,先按照评分从高到低进行排序,评分相同的按照价格从低到高排序 SELECT * FROM products ORDER BY score DESC, price;</p></blockquote>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>2.聚合函数</h3>
<p>知识点:</p>
<p>聚合函数: 又叫统计函数,也叫分组函数</p>
<p>常用聚合函数: sum( ) count( ) avg( ) max( ) min( )</p>
<p>聚合查询基础格式: select 聚合函数(字段名) from 表名;</p>
<p>注意: 此处没有分组默认整个表就是一个大的分组</p>
<p>注意: 聚合函数(字段名)会自动忽略null值,以后统计个数一般用count(*)统计因为它不会忽略null值</p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:sql;"># 注意: 别名不建议用中文,以下仅仅为了演示
-- 示例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 = '非自营';</pre></div>
<p class="maodian"><a name="_lab2_1_2"></a></p><h3>3.分组查询</h3>
<p>分组查询关键字: group by</p>
<p>分组查询基础格式: select 分组字段名,聚合函数(字段名) from 表名 group by 分组字段名;</p>
<p>注意: select后的字段名要么在group by后面出现过,要么写到聚合函数中,否则报错.</p>
<p>分组查询进阶格式: select 分组字段名,聚合函数(字段名) from 表名 group by 分组字段名 ;</p>
<p>where和having的区别?</p>
<p>书写顺序: where在group by 前,having在group by后</p>
<p>执行顺序: where在分组前,having在分组后</p>
<p>分组函数: where后不能跟聚合条件,只能跟非聚合条件,having后可以使用聚合条件,也可以使用非聚合条件(不建议)</p>
<p>应用场景: 建议大多数过滤数据都采用where,只有当遇到聚合条件的时候再使用having</p>
<p>使用别名: where后不能使用别名,having后可以使用别名</p>
<div class="jb51code"><pre class="brush:sql;">-- 示例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;</pre></div>
<p class="maodian"><a name="_lab2_1_3"></a></p><h3>4.limit查询</h3>
<p>知识点:</p>
<p>分页查询关键字: limit</p>
<p>分页查询基础格式: select 字段名 from 表名 limit x,y;</p>
<p> x: 起始索引,默认从0开始 x = (页数-1)*y</p>
<p> y: 本次查询的条数</p>
<p>注意: limit能完成topN需求,但是不能考虑到并列情况,此问题可以使用后期学习的开窗函数解决</p>
<p>示例:</p>
<div class="jb51code"><pre class="brush:sql;">- 示例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;</pre></div>
<p class="maodian"><a name="_lab2_1_4"></a></p><h3>5.SQL顺序</h3>
<p>书写顺序: SELECT -> DISTINCT -> 聚合函数 -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT</p>
<p>执行顺序: FROM -> WHERE -> GROUP BY -> 聚合函数 -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT</p>
<p><strong>大家记住最后这个执行顺序就好,前面的各种格式都是根据这个来的.</strong></p>
<p class="maodian"><a name="_label2"></a></p><h2>三、结语</h2>
<p>今天就先讲这么多吧,下次给大家讲用python操作MySql.</p>
頁:
[1]