SQL——7、在查询中进行统计
在查询中进行统计I (Pt. 1)
下面介绍几个常用统计函数:
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;
在查询中进行统计II (Pt. 2)
用HAVING进行筛选
SELECT group_by_column, AGG_FUNC(column_expression) AS aggregate_result_alias, …
FROM mytable
WHERE condition
GROUP BY column
HAVING group_condition;
语法 HAVING 语法将用来解决这个问题,他可以对分组之后的数据再做SELECT筛选.
练习:Table(表): Employees
【难题】按角色分组算出每个角色按有办公室和没办公室的统计人数(列出角色,数量,有无办公室,注意一个角色如果部分有办公室,部分没有需分开统计) ?
SELECT role,count(role),building is not null as bd
FROM employees
GROUP BY role,bd
#按角色和就职年份统计人数,年份按0-3,3-6,6-9这种阶梯分组,最后按角色+阶梯分组排序#
SELECT Role,Years_employed,Years_employed/3 AS year_3,COUNT(Role)
FROM Employees
GROUP BY Role,year_3