照旧先从需求出发,我们现在想求员工表里各个部门的平均工资,最高工资
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id
我们就会知道它会把一样的id分组,没有部门的就会分为一组,我们也可以用其他字段来分组,我们想查询不同jb_id的平均工资
SELECT job_id,AVG(salary)
FROM employees
GROUP BY job_id
那这个各人就相识了,照旧比力容易明确的
现在我们要利用多个列分组比如我们要计算不同部门的不同工种的平均工资,也就是用job_id和department_id的平均工资
SELECT job_id,department_id,AVG(salary)
FROM employees
GROUP BY department_id, job_id
现在mysql最新版已经不支持这个写法了,由于我们用group by只对工种举行分组了,但是剩下的部门没有分,那不就没有位置放部门了
GROUP BY的结论1
我们除了聚合函数的字段,一定要出现在GROUP BY中,但是GROUPBY的字段不一定要出现在查询字段中.
GROUP BY的位置
GROUP BY必须在FROM 和WHERE的后面ORDER BY的前面和LIMIT的前面
GROUP BY的结论3新特性
Mysql中的GROUP BY的WITH ROLLUP
我们在GROUP 字段 WITH ROLLUP
现在我们是不是可以发现最后多了一行,这个数字现实上是公司的平均工资,
我们这里要小心的利用ORDER BY和 WITH ROLLUP 我们不加的话是可以举行运行,但是加入之后就会报错,这是错误的方式,但是mysql最新版已经支持这么做了.
我们要是出现分组了各人就应该注意到是我们要对字段举行相同值分组的时候举行.
HAVING TO的利用
我们现在多了一个HAVING TO
现在我们想查询各个部门中最高工资比10000高的部门信息.
相当于我们想查询各个部门中最高工资
一旦我们的过滤条件中利用的聚合函数,那么我们就必须要利用HAVING TO来替换WHERE 否则就会报错.
现在我们出现了聚合函数,大概说组函数了,我们来写一个正确的写法
不管我们学那个语言我们现实上是有很多规则的,+表示加和毗连,这是规范和规则出现的,直接背就好了,就和叫爸爸叫妈妈,一样没有小孩会想为什么要这么叫,下面的东西就可以思量深层次的缘故原由,后面的东西我们都是可以解释的,也就是一会我们会说HAVING TO 为什么不能用WHERE,
我们把HAVING换进去,发现照旧报错了,
要求2:我们要把HAVING TO 放在GROUP BY的后面
他的声明位置必须在GROUP BY的后面,写在前面了自然就错误了
这就是我们正确的环境
要求3
要是没有GROUP BY能不能利用HAVING TO 函数,发现我们是可以利用的,由于我们没有聚合函数了,我们利用的时候,最后聚合函数的结果是不是没有须要去过滤它了.我们用WHERE筛选之后,再用聚合函数之后再用HAVING就没有什么意义了
所以HAVING 要和GROUPBY一起合并利用.
现在我们要查询部门ID为10,20,30,40,4个部门最高工资比10000高的部门信息
这里前面也是一个过滤条件,我们能不能用WHERE来写,这是方式1
SELECT department_id,MAX(salary)
FROM employees
WHERE department_id IN (10,20,30,40)
GROUP BY department_id
HAVING MAX(salary)>10000
我们还能把条件写在WHERE
SELECT department_id,MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary)>10000 AND department_id IN (10,20,30,40)
SELECT (含有聚合函数)
FROM 表1,表2,表3
WHERE 多表的毗连条件 AND 过滤条件,不包罗聚合函数
GROUP BY 分组操作,….
HAVING 包罗聚合函数的过滤条件
ORDER BY
LIMIT
sql99语法
SELECT ……(含有聚合函数)
FROM 表1 (left/right)JOIN
ON 表2
(left/right)JOIN
ON表2
WHERE 不包罗 聚合函数的过滤条件
GROUP BY
HAVING
ORDER BY
LIMIT
SQL语句的执行过程
第一部门
SELECT ……(含有聚合函数)
第二部门
FROM 表1 (left/right)JOIN
ON 表2
(left/right)JOIN
ON表2
WHERE 不包罗 聚合函数的过滤条件
GROUP BY
HAVING
第三部门
ORDER BY
LIMIT
正常环境我们以为是按顺序运行的,现实上我们的是先执行的第二部门,然后第一部门最后第三部门.
上来我们先FROM 表1 (left/right)JOIN
ON 表2
(left/right)JOIN
ON表2
WHERE 不包罗 聚合函数的过滤条件
GROUP BY
HAVING
如下