从这一节开始学习SQL如何对数据进行统计,SQL默认支持一组统计表达式,他们可以完成数据统计,如:计数,求平均等。 以Movies表数据为例,这些统计表达式可以帮我们回答以下问题:"Pixar公司生产了多少电影?", 或 "每一年的票房冠军是谁?".
对全部结果数据做统计
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, … FROM mytable
WHERE constraint_expression;
如果不指明如何分组,那统计函数将对查询结果全部数据进行统计,当然每一个统计也可以像之前用AS来取一个别名,以增加可读性.
常见统计函数
下面介绍几个常用统计函数:
Function | Description |
COUNT(*), COUNT(column) | 计数!COUNT(*) 统计数据行数,COUNT(column) 统计column非NULL的行数. |
MIN(column) | 找column最小的一行. |
MAX(column) | 找column最大的一行. |
AVG(column) | 对column所有行取平均值. |
SUM(column) | 对column所有行求和. |
Docs: MySQL, Postgres, SQLite, Microsoft SQL Server |
分组统计
GROUP BY
数据分组语法可以按某个col_name对数据进行分组,如:GROUP BY Year
指对数据按年份分组, 相同年份的分到一个组里。如果把统计函数和GROUP BY
结合,那统计结果就是对分组内的数据统计了.GROUP BY
分组结果的数据条数,就是分组数量,比如:GROUP BY Year
,全部数据里有几年,就返回几条数据, 不管是否应用了统计函数.
用分组的方式统计
SELECT AGG_FUNC(column_or_expression) AS aggregate_description, … FROM mytable WHERE constraint_expression GROUP BY column;
练习
这节练习基于 Employees 表. 我们来统计有多少雇员, 以及计算一下团队相关的一些指标数据. 马上开始吧!.
Table(表): Employees
Role | Name | Building | Years_employed |
Engineer | Becky A. | 1e | 4 |
Engineer | Dan B. | 1e | 2 |
Engineer | Sharon F. | 1e | 6 |
Engineer | Dan M. | 1e | 4 |
Engineer | Malcom S. | 1e | 1 |
Artist | Tylar S. | 2w | 2 |
Artist | Sherman D. | 2w | 8 |
Artist | Jakob J. | 2w | 6 |
Artist | Lillia A. | 2w | 7 |
Artist | Brandon J. | 2w | 7 |
Manager | Scott K. | 1e | 9 |
Manager | Shirlee M. | 1e | 3 |
Manager | Daria O. | 2w | 6 |
Engineer | Yancy I. | null | 0 |
Artist | Oliver P. | null | 0 |
练习 do it — 请完成如下任务
1.找出就职年份最高的雇员(列出雇员名字+年份)
SELECT Name,max(Years_employed) FROM employees
2.按角色(Role
)统计一下每个角色的平均就职年份
SELECT Role,avg(Years_employed) FROM employees
group by Role
3.按办公室名字总计一下就职年份总和
select Building,sum(Years_employed) from Employees
group by Building
4.每栋办公室按人数排名,不要统计无办公室的雇员
select Building,count(Building) from Employees
where Building is not null
group by Building
5.就职1,3,5,7年的人分别占总人数的百分比率是多少(给出年份和比率"50%" 记为 50)
select Years_employed,count(*)*100/(select count(*)from employees)as Rating
from Employees
where Years_employed in (1,3,5,7)
group by Years_employed