mysql聚合函数和分组

文章实例的数据表,来自上一篇博客《mysql简单查询》:http://blog.csdn.net/zuiwuyuan/article/details/39349611


一、 聚合函数

聚合函数,也叫做组合函数

求所有数据数
count不统计null ,统计的是记录数
SELECT COUNT(comm) FROM emp;     #  查询emp表comm的总数
SELECT COUNT(*) FROM emp;       #  查询emp表行记录的总数
SELECT COUNT(DISTINCT deptno) FROM emp;   #  查询不重复deptno的记录总数

求平均数,忽略空值
SELECT AVG(sal) FROM emp;
SELECT AVG(comm) FROM emp;   # 2200/4=550

求和
SELECT SUM(sal) FROM emp;

求最大值
SELECT MAX(sal) FROM emp;

#求最小值
SELECT MIN(sal) FROM emp;

二、 分组

Group by字句的真正作用在于与各种聚合函数配合使用,它用来对查询出来的数据进行分组
分组的含义是: 把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录
分组函数忽略空值
结果集隐式按升序排列,如果需要改变排序方式可以使用order by字句

/**
   GROUP BY 可以根据你的分组条件对数据进行分组, 然后再进行统计
   其实,我们对部门进行分组,然后统计出分组后的聚合值(平均、最大、最小等)
*/
#查询每个部门的平均工资
SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;

#查询每个部门的员工数
SELECT deptno,COUNT(*) FROM emp GROUP BY deptno;



查询每个部门的整体工资情况
如果select语句中的列没有使用组函数,那么它就必须出现在group by字句中
而出现在group by字句中的列,不一定出现在select语句中 
SELECT deptno ,AVG(sal),MAX(sal),MIN(sal),SUM(sal),COUNT(1) 
FROM emp
GROUP BY deptno;

# 每个部门每个职位的平均工资
SELECT deptno,job,AVG(sal) FROM emp GROUP BY deptno,job;


三、 限定组的结果
HAVING字句用来对分组后的结果再进行条件过滤

# 查询部门平均工资大于2000的
# 分组后加条件: 使用having
# where和having都是用来做条件限定的,但是having只能用在group by之后
SELECT deptno ,AVG(sal),MAX(sal),MIN(sal),SUM(sal),COUNT(1) 
FROM emp
# where  AVG(sal)>2000; 此句会报错,因为在where字句中无法使用分组函数
GROUP BY deptno
HAVING AVG(sal)>2000;


where和having的区别:


   where是在分组前进行条件过滤的
   having字句是在分组后进行条件过滤的
   where字句中不能使用聚合函数
   having字句中可以使用局和函数和一般过滤条件



四: 查询结果限定

  在select语句最后可以使用limit来限定查询结果返回的起始记录和总数量
  select...limit offset_start,row_count;
  offset_start: 第一个返回记录行的偏移量,默认为0
  row_count: 要返回记录行的最大数目

SELECT * FROM emp LIMIT 5;    # 检索前五条记录
SELECT * FROM emp LIMIT 5,10; # 从第6行开始,记录行6-15(因为默认是0,所以此处的5只的是第六行记录)


原文地址:https://www.cnblogs.com/hehe520/p/6330030.html