文章实例的数据表,来自上一篇博客《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的区别:
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只的是第六行记录)