1.聚合函数
聚合函数类型AVG()SUM()MAX()MIN()COUNT()
1.1 AVG()和SUM()
只能对数值型数据使用
1.2MIN和MAX函数
可以对
任意数据类型
的数据使用
MIN
和
MAX
函数。
SELECT MIN(hire_date), MAX(hire_date) FROM employees;
1.3COUNT(*)和count(列名)
返回里面列明不为空的。
count(*)
会统计值为
NULL
的行,而
count(
列名
)
不会统计此列为
NULL
值的行。
2.1基本使用
可以使用
GROUP BY子句将表中的数据分成若干组;
在
SELECT
列表中所有未包含在组函数中的列都应该包含在
GROUP BY
子句中;
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id ;
2.2使用多个列分组
SELECT department_id dept_id, job_id, SUM(salary) FROM employees GROUP BY department_id, job_id ;
其中
WITH ROLLUP:
使用这个关键字
在所有查询出的分组记录之后增加一条记录,该记录计算查询出的所
有记录的总和,即统计记录数量。
例如:
![](https://i-blog.csdnimg.cn/blog_migrate/b881ee4d01bb28eaefa83a6e28ba8c3c.png)
3.having
用来过滤group by分组的条件子句,使用了聚合函数
SELECT department_id, MAX(salary) FROM employees
GROUP BY department_id HAVING MAX(salary)>10000 ;
3.1切记不能再where中用
SELECT department_id, AVG(salary)FROM employeesWHERE AVG(salary) > 8000GROUP BY department_id;
3.2 where和having的对比
区别
1
:
WHERE
可以直接使用表中的字段作为筛选条件,但不能使用分组中的计算函数作为筛选条件;
HAVING
必须要与
GROUP BY
配合使用,可以把分组计算的函数和分组字段作为筛选条件。
这决定了,在需要对数据进行分组统计的时候,
HAVING
可以完成
WHERE
不能完成的任务。这是因为,
在查询语法结构中,
WHERE
在
GROUP BY
之前,所以无法对分组结果进行筛选。
HAVING
在
GROUP BY
之
后,可以使用分组字段和分组中的计算函数,对分组的结果集进行筛选,这个功能是
WHERE
无法完成
的。另外,
WHERE
排除的记录不再包括在分组中。
区别
2
:如果需要通过连接从关联表中获取需要的数据,
WHERE
是先筛选后连接,而
HAVING
是先连接
后筛选。
这一点,就决定了在关联查询中,
WHERE
比
HAVING
更高效。因为
WHERE
可以先筛选,用一
个筛选后的较小数据集和关联表进行连接,这样占用的资源比较少,执行效率也比较高。
HAVING
则需要
先把结果集准备好,也就是用未被筛选的数据集进行关联,然后对这个大的数据集进行筛选,这样占用
的资源就比较多,执行效率也较低
WHERE先筛选数据再关联,执行效率高不能使用分组中的计算函数进行筛选HAVING可以使用分组中的计算函数在最后的结果集中进行筛选,执行效率较低
4.select的执行过程
4.1关键字的顺序
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ... LIMIT...
4.2select语句的执行顺序
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 的字段 -> DISTINCT -> ORDER BY -> LIMIT
比如,你写了一个sql语句,那么你的关键顺序和执行顺序是下面这样的:
SELECT DISTINCT player_id, player_name, count (*) as num # 顺序 5FROM player JOIN team ON player .team_id = team .team_id # 顺序 1WHERE height > 1.80 # 顺序 2GROUP BY player .team_id # 顺序 3HAVING num > 2 # 顺序 4ORDER BY num DESC # 顺序 6LIMIT 2 # 顺序 7