MySQL43--HAVING子句

HAVING子句

HAVING子句用于指定分组的条件;
在 SQL 中增加 HAVING 子句原因是:WHERE 关键字无法与聚合函数一起使用;

-- 统计每个图书分类包含的图书数量,并仅返回数量>=15的分类信息 
SELECT categoryname,COUNT(id) AS num FROM t13 GROUP BY categoryname HAVING num >=15; 

WHERE和HAVING区别

WHERE是对整张表的数据,进行过滤,可以单独使用。

HAVING是对分组后的数据,进行过滤,不可以单独使用,必须和GROUP BY一起使用。

-- 查询emp表中,部门的平均工资大于2000的,部门的编号(deptno),人数,最高工资,平均工资,根据部门人数升序排列
SELECT deptno,COUNT(*),MAX(sal),AVG(sal)
FROM emp
GROUP BY deptno
HAVING AVG(sal) > 2000
ORDER BY COUNT(*) ASC;
-- 查询emp表中,部门的人数大于等于3人的,部门的编号(deptno),人数,工资总和,根据工资总和降序排列
SELECT deptno,COUNT(*),SUM(sal)
FROM emp
GROUP BY deptno
HAVING COUNT(*) >=3
ORDER BY SUM(sal) DESC;
-- 查询emp表中,工资在1000~5000之间的,部门的编号(deptno),人数,平均工资,最高工资,要求最高工资大于3000,根据人数升序排列
SELECT deptno,COUNT(*),AVG(sal),MAX(sal)
FROM emp
WHERE sal BETWEEN 1000 AND 5000
GROUP BY deptno
HAVING MAX(sal) > 3000
ORDER BY COUNT(*) ASC;
-- 查询emp表中,员工姓名(ename)不包含字母C并且部门编号(deptno)是20号或者10号部门的,部门的编号(deptno),人数,平均工资,最高工资,要求最高工资大于2000,根据人数降序排列
SELECT deptno,COUNT(*),AVG(sal),MAX(sal)
FROM emp
WHERE NOT ename LIKE '%C%' AND (deptno=10 OR deptno=20)
GROUP BY deptno
HAVING MAX(sal) > 2000
ORDER BY COUNT(*) DESC;

SELECT deptno,COUNT(*),AVG(sal),MAX(sal)
FROM emp
WHERE NOT ename LIKE '%C%' AND deptno in (20,10)
GROUP BY deptno
HAVING MAX(sal) > 2000
ORDER BY COUNT(*) DESC;
posted @ 2021-10-24 16:22  暄总-tester  阅读(182)  评论(0)    收藏  举报