MySQL 高级用法-聚合函数

聚合函数

# 聚合函数
# 求平均工资
SELECT avg(sal+IFNULL(comm,0)) as avg
FROM t_emp;

# 求员工的总工资
SELECT SUM(sal) 
FROM t_emp;

# 求月收入最大值
SELECT ename,MAX(sal+IFNULL(comm,0)) as maxComm,SUM(sal) as "sum" FROM t_emp;

# 求员工名字最长的是几个字符
SELECT ename,max(length(ename)) as nameLen FROM t_emp;

# 求记录的数量
# *会把整个数据表中的记录返回
SELECT COUNT(*) FROM t_emp;
# 输入字段会把该列的非空记录返回
SELECT COUNT(comm) FROM t_emp;

# 综合案例
# 查询10和20部门中,底薪超过2000元并且工龄超过15年的员工人数
SELECT count(*) as employeenumber
FROM t_emp
WHERE deptno IN (10,20) 
AND sal>2000
AND  DATEDIFF(NOW(),hiredate)/365>=15;

# 查询1985年以后入职的员工,底薪超过公司平均底薪的员工数量
# (注意:聚合函数是不能出现在WHERE里面)
# 以下是错误的写法
SELECT count(*) as employeenumber
FROM t_emp
WHERE (hiredate>="1985-01-01")
AND (sal>AVG(sal));


# 分组
# 按组统计数值
SELECT deptno,ROUND(AVG(sal))
FROM t_emp GROUP BY deptno;

# 逐级分组
# 查询每个部门里,每种职位的人员数量和平均底薪
SELECT deptno,job,count(*),ROUND(AVG(sal))
FROM t_emp
GROUP BY deptno,job
ORDER BY deptno;

# 对SELECT子句的要求
# 查询语句中如果含有GROUP BY子句,那么SELECT子句中的内容就必须遵守规定:
# SELECT子句中可以包括聚合函数,或者GROUP BY子句的分组列,其余内容均不可以出现在SELECT子句中
# 正确
SELECT deptno,count(*),AVG(sal)
FROM t_emp
GROUP BY deptno;

# 错误
SELECT deptno,count(*),AVG(sal),sal
FROM t_emp
GROUP BY deptno;

# 对分组结果集再次做汇总计算 WITH ROLLUP
SELECT deptno,COUNT(*),AVG(sal),MAX(sal),MIN(sal)
FROM t_emp
GROUP BY deptno
WITH ROLLUP;

# GROUP_CONCAT函数可以把分组查询中的某个字段拼接成一个字符串
# 查询每个部门内底薪超过2000元的人数和员工姓名
SELECT deptno,GROUP_CONCAT(ename),COUNT(*)
FROM t_emp
GROUP BY deptno;

# 查询平均底薪大于2000元的组别
# HAVING
SELECT deptno
FROM t_emp
GROUP BY deptno HAVING AVG(sal)>=2000;

# 查询每个部门中,1982年以后入职的员工超过2个人的部门编号
SELECT deptno
FROM t_emp
WHERE hiredate>=("1982-01-01")
GROUP BY deptno HAVING COUNT(*)>=2
ORDER BY deptno;

# 查询每个部门中,1982年以后入职且平均工资大于500元的员工超过2个人的部门编号
SELECT deptno
FROM t_emp
WHERE hiredate>=("1982-01-01")
GROUP BY deptno HAVING COUNT(*)>=2 AND avg(sal)>500
ORDER BY deptno;


SELECT deptno,COUNT(*)
FROM t_emp
WHERE deptno IN (10,20)
GROUP BY 1 ;

 

你可能感兴趣的:(MySQL)