目录

前言

where 和having

group by和order by

一些特殊案例


前言

这是我今天上数据库课时思考的group和order的的区别,然后今天看一个大佬博客的时候发现where和group一起用我刚开始以为写错了,我就去查了一下,就有了新的收获,我在网上找了一些,然后总结出来的,也有借用一些其他大佬的博客,我也希望这个能带给大家帮助!!!

mysql group_by去除 mysql group by where_数据库

 

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个结果集排序。