1.having和where 之间区别不是太大,两个都是设定的条件判断语句,而having是用在分组后进行的条件判断。
2.where的执行顺序在聚合函数之前,having在聚合函数之后;
select sum(num) as rmb from order where id>10
这个是只有先查询出id>10的在进行求和;既先执行where条件,然后在去执行聚合函数sum;
select reportsto as manager, count(*) as reports from employees
group by reportsto having count(*) > 4
这个是先进行按照reportsto进行分组,然后在分组之后再执行聚合函数count,在判断having之后的条件;肯定的说having子句查询过程执行优先级别低于聚合语句。再换句说话说把上面的having换成where则会出错。统计分组数据时用到聚合语句。
对分组数据再次判断时要用having。如果不用这些关系就不存在使用having。直接使用where就行了。
having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。
3.聚合函数,这是必需先讲的一种特殊的函数:
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM tablename
4.显示每个地区的总人口数和总面积.
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。
5. 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,HAVING子句可以让我们筛选成组后的各组数据.
总之:
1.WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。
2.GROUP BY 子句用来分组 WHERE 子句的输出。
3.HAVING 子句用来从分组的结果中筛选行。
参考技术文章:https://blog.csdn.net/gao454917848/article/details/32902595