where 和having
首先我们可以先从下面的一个例子来了解where和having:
select sno,avg(grade) from sc where avg(grade)>90 group by sno;
我们可以看到这个代码是错误的,因为什么呢?
答:where的子句中是不能使用聚集函数作为条件表达式的
正确的查询语句应该是:
select sno,avg(grade) from sc group by sno having avg(grade)>90;
我们呢现在这里做一个补充:
聚集函数有哪些?
COUNT(*)——统计元组个数。
COUNT([DISTINCT|ALL]<列名>)——统计一列中值的个数。
SUM([DISTINCT|ALL]<列名>)——计算一列值的总和(此列必须是数值类型)。
AVG([DISTINCT|ALL]<列名>)——计算一列的平均值(同上)。
MAX([DISTINCT|ALL]<列名>)——求一列值中的最大值。
MIN([DISTINCT|ALL]<列名>)——求一列值中的最小值。
where后面不能使用聚合函数
原因:
聚合函数是针对结果集进行的,但是where条件,并不是在查询出结果集之后运行的,所以主函数放在where语句中会出现错误。
而having不一样,having是针对结果集做的筛选的,所以我们一般把主函数放在having中,用having来代替where。having一般是跟在group by 后面的!
where和having直接的区别有哪些?
相同点:where和having都可以加条件。
不同点:
1.where在分组前加条件,having在分组后加条件。
2.where的效率高于having,分组资源消耗非常大。
group by和order by
首先我们先弄明白两者的英文字面意思。
order by是排序的意思。
group by是分组的意思。
一般order by是默认asc(升序)排序,还可以使用desc(降序)来排序。order by后面必须列出排序的字段名,可以是多个字段名!
而group by为分组必须配合聚合函数才能使用!,使用时至少需要一个分组标志字段。
一些特殊案例
group by和where的一起使用。
我们来看下面这个例子:
select model,count(*) as count from temptable where trim(model) in ("A4","A5","A6") group by model having count(*) >= 50 ;
由代码可以看到既有where也有group by。
这句话是没有任何错误的!!!
上句话的执行大概是这样的:
先根据where条件子句经行过来,再根据group by 子句进行聚合,最后再根据having自己对聚合结果进行过滤!
当我们使用where和group by一起时,应当注意:
1.where在前,group by在后。即先对select xx from xx的记录集合用where进行筛选,然后再使用group by 对筛选后的结果进行分组 使用having字句对分组后的结果进行筛选。
2.需要注意having和where的用法区别:
1.having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前。
3.where后的条件表达式里不允许使用聚合函数,而having可以。
3.当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序。