[SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5926689.html

序
这是《SQL 基础知识梳理(二) - 查询基础》的下篇。
目录
一、对表进行聚合查询
1.聚合函数
(1)5 个常用函数:
①COUNT:计算表中的记录(行)数。
②SUM:计算表中数值列的数据合计值。
③AVG:计算表中数值列的数据平均值。
④MAX:求出表中任意列中数据的最大值。
⑤MIN:求出表中任意列中数据的最小值。
(2)聚合:将多行汇总成一行。

图1-1 Shohin 表
2.计算表中数据的行数
--示例
SELECT COUNT(*) -- *:参数,这里代表全部列
FROM dbo.Shohin;

3.计算 NULL 以外数据的行数
将 COUNT(*) 的参数改成指定对象的列,就可以得到该列的非 NULL 行数。
SELECT COUNT(shiire_tanka)
FROM dbo.Shohin;

只计算非 NULL 的行
【备注】除了 COUNT 函数,其它函数不能将星号作为参数。
【备注】COUNT 函数的结果根据参数的不同而不同。COUNT(*) 会得到包含 NULL 的数据行数,而 COUNT(<列名>) 会得到 NULL 之外的数据行数。
4.计算合计值
SELECT SUM(hanbai_tanka) AS sum_hanbai_tanka, --总和
AVG(hanbai_tanka) AS avg_hanbai_tanka, --平均
MAX(hanbai_tanka) AS max_hanbai_tanka, --最大
MIN(hanbai_tanka) AS min_hanbai_tanka --最小
FROM dbo.Shohin;

【备注】所有的聚合函数,如果以列名为参数,会无视 NULL 值所在的行。
SELECT MAX(torokubi), --torokubi 为日期
MIN(torokubi)
FROM dbo.Shohin

【备注】MAX/MIN 函数几乎适用于所有数据类型的列。SUM/AVG 函数只适用于数值类型的列。
5.使用聚合函数删除重复值(关键字 DISTINCT)
--示例1:计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT shohin_bunrui)
FROM dbo.Shohin; --示例2:先计算数据行数再删除重复数据的结果
SELECT DISTINCT COUNT(shohin_bunrui)
FROM dbo.Shohin;

【备注】在聚合函数的参数中使用 DISTINCT(示例1),可以删除重复数据。DISTINCT 不仅限于 COUNT 函数,所有的聚合函数都可以使用。
二、对表进行分组
1.GROUP BY 子句
--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;
--示例
SELECT shohin_bunrui AS '商品种类',
COUNT(*) AS '数量'
FROM dbo.Shohin
GROUP BY shohin_bunrui;

【备注】GROUP BY 子句中指定的列称为“聚合键”或“分组列”。
【子句的书写顺序(暂定)】SELECT --> FROM --> WHERE --> GROUP BY
2.聚合键中包含 NULL 的情况
SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
GROUP BY shiire_tanka;

【备注】聚合键中包含 NULL 时,在结果中也会以 NULL 行的形式表现出来。
3.WHERE 对 GROUP BY 执行结果的影响
--语法
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--WHERE <表达式>
--GROUP BY <列名1>, <列名2>, ...
SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
WHERE shohin_bunrui = '衣服'
GROUP BY shiire_tanka

这里是先根据 WHERE 子句指定的条件进行过滤,然后再进行聚合处理。
【执行顺序】FROM --> WHERE --> GROUP BY --> SELECT。这里是执行顺序,跟之前的书写顺序是不一样的。
4.与聚合函数和 GROUP BY 子句有关的常见错误
(1)易错:在 SELECT 子句中书写了多余的列
SELECT 子句只能存在以下三种元素:
①常数
②聚合函数
③GROUP BY 子句中指定的列名(即聚合键)

易错点1
【总结】使用 GROUP BY 子句时,SELECT 子句不能出现聚合键之外的列名。
(2)易错:在 GROUP BY 子句中写了列的别名

易错点2
回顾之前说的执行顺序,SELECT 子句是在 GROUP BY 子句之后执行。所以执行到 GROUP BY 子句时无法识别别名。
【总结】GROUP BY 子句不能使用 SELECT 子句中定义的别名。
(3)易错:GROUP BY 子句的结果能排序吗?
【解答】它是随机的。如果想排序,请使用 ORDER BY 子句。
【总结】GROUP BY 子句结果的显示是无序的。
(4)易错:在 WHERE 子句中使用聚合函数

易错点3
【总结】只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能够使用聚合函数。
三、为聚合结果指定条件
1.HAVING 子句
WHERE 子句智能指定记录(行)的条件,而不能用来指定组的条件。
【备注】HAVING 是 HAVE(拥有)的现在分词。
--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...
--HAVING <分组结果对应的条件>
【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING
SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2

从通过商品种类进行聚合分组后的结果中,取出“包含数据的行数为 2 行”的数据
2.HAVING 子句的构成要素
(1)3 要素:
①常数
②聚合函数
③GROUP BY 子句中指定的列名(即聚合键)

易错用法
3.HAVING 与 WHERE
有些条件可以写在 HAVING 子句中,又可以写在 WHERE 子句中。这些条件就是聚合键所对应的条件。

结果一样
【建议】虽然结果一样,聚合键对应的条件应该写在 WHERE 子句中,不是 HAVING 子句中。
【理由】①WHERE 子句的执行速度比 HAVING 快。
②意义:WHERE 子句 = 指定行所对应的条件,HAVING 子句 = 指定组所对应的条件。
四、对查询结果进行排序
1.ORDER BY 子句
--语法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--ORDER BY <排序基准列1>, <排序基准列2>, ...
SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka; --升序排列

销售单价由低到高(升序)
排序键:ORDER BY 子句中书写的列名。
【书写顺序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY
2.升序(ASC)和降序(DESC):
SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC; --降序排列

【备注】ORDER BY 子句中排列顺序时会默认使用升序(ASC)进行排列。
3.指定多个排序键
SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka, shohin_id;

4.NULL 值的顺序:排序键中包含 NULL 时,会在开头或末尾进行汇总。
5.在排序键中使用 SELECT 子句中的别名
SELECT shohin_id AS id, shohin_mei, hanbai_tanka AS ht
FROM dbo.Shohin
ORDER BY ht, id;

【执行顺序】FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY
【备注】ORDER BY 子句可以使用 SELECT 子句中定义的别名,GROUP BY 子句不能使用别名。
6.ORDER BY 子句中使用聚合函数
SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
ORDER BY COUNT(*);

7.不建议使用列的编号进行排序,虽然可以
SELECT shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC, shohin_id; SELECT shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
FROM dbo.Shohin
ORDER BY 4 DESC, 1; --这里使用列的编号,由于阅读不便,不推荐使用

结果是一样的
【备注】在 ORDER BY 子句中不要使用列的编号。
传送门
备注
这里采用 MS SQL Server 进行验证,不保证所有的 DBMS 执行结果正确。
【参考】《SQL ゼロからはじめるデータベース操作》
[SQL] SQL 基础知识梳理(三) - 聚合和排序的更多相关文章
- 【SQL】- 基础知识梳理(二) - SQL简介
一.引言 在梳理这些知识之前,说实话,如果有人问我SQL是什么?我可能会回答就是“INSERT,DELETE,UPDATE,SELECT”语句呗,还能是啥. 二.SQL概念 SQL是什么? SQL是S ...
- 【SQL】- 基础知识梳理(三) - SQL连接查询
一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...
- 【SQL】- 基础知识梳理(一) - 数据库
一.引言 知识分享这个事情在公司会议上被提出过几次,可一直因各种事情耽搁下来,“我不如地狱,谁入地狱”,怀着这样一种心态,写下了 数据库系列知识分享. 本文将一步步通过循序渐进的方式带你去了解数据库. ...
- 【SQL】- 基础知识梳理(六) - 游标
游标的概念 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标(Cursor): 是处理数据的一种方法. 它可以定位到结果集中的某一行,对数据进行读写. 也可以移动游标定位到你需要的 ...
- 【SQL】- 基础知识梳理(四) - 存储过程
存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 存储过程的好处 A. 存储过程允许标准组件式编程 ...
- 【SQL】- 基础知识梳理(八) - 事务与锁
事务的概念 事务:若干条T-SQL指令组成的一个操作数据库的最小执行单元,这个整体要么全部成功,要么全部失败.(并发控制) 事务的四个属性:原子性.一致性.隔离性.持久性.称为事务的ACID特性. 原 ...
- 【SQL】- 基础知识梳理(七) - 索引
索引的概念 在关系型数据库中,索引是对数据库表中一列或多列的值进行排序的一种结构. SQL SERVER中有索引的类型:按存储结构区分:“聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引 ...
- 【SQL】- 基础知识梳理(五) - 触发器
触发器的概念 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程 触发器的语法 create trigger tgr_name on table_name with encrypion –加 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
随机推荐
- 详解树莓派Model B+控制蜂鸣器演奏乐曲
步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- mysql 7下载安装及问题解决
mysql 7安装及问题解决 一.mysql下载 下载地址:https://www.mysql.com/downloads/ Community (GPL) Downloads MySQL Commu ...
- echarts+php+mysql 绘图实例
最近在学习php+mysql,因为之前画图表都是直接在echart的实例demo中修改数据,便想着两相结合练习一下,通过ajax调用后台数据画图表. 我使用的是echart3,相比较第二版,echar ...
- 用C语言封装OC对象(耐心阅读,非常重要)
用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...
- 代码的坏味道(21)——中间人(Middle Man)
坏味道--中间人(Middle Man) 特征 如果一个类的作用仅仅是指向另一个类的委托,为什么要存在呢? 问题原因 对象的基本特征之一就是封装:对外部世界隐藏其内部细节.封装往往伴随委托.但是人们可 ...
- Kotlin类:功能更强、而更简洁(KAD 03)
作者:Antonio Leiva 时间:Dec 7, 2016 原文链接:http://antonioleiva.com/classes-kotlin/ Kotlin类尽可能简单,这样用较少的代码完成 ...
- 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- 再来说说 LaTeX
在我的上一篇随笔中,我提到了 Markdown.LaTeX 和 MathJax.这几个东西对目前的网络技术文章的写作.展示都有深远的影响.在上一篇中,我还给出了一份 LaTeX 语法的学习资料.在这一 ...