聚合函数
聚合: 将分散的聚集到一起.
聚合函数: 对列进行操作,返回的结果是一个单一的值,除了 COUNT 以外,都会忽略空值
COUNT:统计指定列不为NULL的记录行数;
SUM:计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
MAX:计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN:计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
AVG:计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
select 聚合函数 from 表名;
例如:
select avg(age),min(age),max(age),sum(age),count(age)from person #统计人员的平均年龄,最小年龄,最大年龄,总年龄,不为空的行数
分组
分组的含义: 将一些具有相同特征的数据 进行归类.比如:性别,部门,岗位等等
怎么区分什么时候需要分组呢?
特征: 遇到 "每" 字,一般需要进行分组操作.
例如: 1. 公司每个部门有多少人.
2. 公司中有 多少男员工 和 多少女员工.
#分组查询格式: select 被分组的字段 from 表名 group by 分组字段 [having 条件字段] ps: 分组查询可以与 聚合函数 组合使用. #查询班级的平均年龄 select avg(age),name from tb GROUP BY class; #查询每个部门的平均薪资 并且看看这个部门的员工都有谁? select avg(salary),dept,GROUP_CONCAT(name) from tb1 GROUP BY dept; #GROUP_CONCAT(expr):按照分组,将expr字符串按逗号分隔,组合起来 #查询平均薪资大于10000的部门, 并且看看这个部门的员工都有谁? select avg(salary),dept,GROUP_CONCAT(name) from person GROUP BY dept; having avg(salary)>10000; #这里的having后面跟条件与where相似,但也有不同
where 与 having区别:
#执行优先级从高到低:where > group by > having
#1. Where 发生在分组group by之前,因而Where中可以有任意字段,但是绝对不能使用聚合函数。
#2. Having发生在分组group by之后,因而Having中可以使用分组的字段,无法直接取到其他字段,可以使用聚合函数
分页查询
关键字 limit
limit (起始条数),(查询多少条数),如果limit后只有一个数字,则代表 0,(查询多少条数)
#查询前5条数据 select * from person limit 3; #查询第3条到第3条数据 select * from person limit 3,6;
SQL 语句关键字的执行顺序
1、查询中常用到的关键词有:
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY
其中,SELECT与FROM是必需的,其他关键词则是可选的。
标准的 SQL 的解析顺序为: FROM->WHERE->GROUP BY->HAVING->SELECT->ORDER BY
(1).FROM 字段语句, 组装来自不同数据源的数据
(2).WHERE 表名, 基于指定的条件对记录进行筛选
(3).GROUP BY 分组字段列表, 将数据划分为多个分组
(4).使用聚合函数进行计算
(5).使用 HAVING 子句筛选分组
(6).计算所有的表达式
(7).使用 ORDER BY 对结果集进行排序 ASC(升序,默认)、DESC(降序)
例如:
在学生成绩表中,把班级为1班的学生成绩按照学生姓名分组,并且筛选分组结果,汇总计算各个学生的总成绩,选出总成绩大于600分的学生列表,并按照总分从高到低排列。
Python代码
select sum(score)as s,name from tb1
where class_id=1 group by name having s>600
order by 2 asc
在上面的示例中SQL语句的执行顺序如下:
①首先执行FROM子句,从tb1表检索记录;
②执行WHERE子句,筛选出tb1表中class_id=1的所有记录;
③执行GROUP BY子句,把tb1表按name列进行分组;
④计算SUM()聚集函数,求出每个name的score之和;
⑤执行HAVING子句,筛选出sum(score)大于600的分组;
⑥提取name,sum(score)两个字段,产生新的结果集;
⑦执行ORDER BY子句,把⑥的结果集按sum(score)字段升序排列。