Mysql中group by--having语句和where的区别

sql语法结构

select
from
where(不能使用聚合函数)
join on
group by (分组)
having(可以使用聚合函数,在分组后筛选元组配合group by使用)
order by

sql执行顺序

from > where >join on > group by > having > select > order by

where 和 having 的使用区别

- where是分组前的数据筛选
- having 是分组后的数据筛选(配合group by使用)

示例1

用一条SQL 语句 查询出每门课都大于80 分的学生姓名

		name   course    score
		张三     语文       81
		张三     数学       75
		李四     语文       76
		李四     数学       90
		王五     语文       81
		王五     数学       100
		王五     英语       90	

方法1 尝试where语句,如 where score>80

问题1:但 “王五” 语数英均大于80,会筛选出3个“王五”,不符合要求。 如果在select中加上 distinct 过滤下name,可以distinct过滤掉重复的姓名。但也 有问题2
问题2:“张三”语文81大于80,数学75小于80,因此也会被筛选出来,但显然不符合每门课都大于80的条件;

解决方法:其实可以将 score<=80的name过滤出来,再not in 排除这些name即可,如下

select distinct name
from table
where name not in (
				select distinct name 
				from table 
				where score<=80)

方法2 尝试group by – having语句

解决方法:此时考虑到如果最小的分数都大于80的score过滤出来就好了。having有过滤的功能,即采用 group by和 having的配合使用,过滤出来只有“王五”符合

select name  
from table 
group by name #分组后如图2,张三/李四/王五各自的成绩都被放在了各自名下
having min(score)>80 # 在每人下过滤出最小成绩大于80的元组,王五

在这里插入图片描述

group by详细用法

  • GROUP BY X将相同的X字段值的记录放在一个分组
  • GROUP BY X, Y将相同的X字段值和Y字段值的记录放在一个分组
    SQL GROUP BY X示例
    GROUP BY X将相同的X字段值的记录放在一个分组
    我们拥有下面这个 “Orders” 表:
    在这里插入图片描述
    现在,我们希望查找每个客户的总金额(总订单)。
    我们想要使用 GROUP BY 语句对客户进行组合。
    我们使用下列 SQL 语句:
	SELECT Customer,SUM(OrderPrice) 
	FROM Orders
	GROUP BY Customer

结果集类似这样:
在这里插入图片描述
很棒吧,对不对?

让我们看一下如果省略 GROUP BY 会出现什么情况:

扫描二维码关注公众号,回复: 11376353 查看本文章
SELECT Customer,SUM(OrderPrice) FROM Orders

结果集类似这样:
在这里插入图片描述
上面的结果集不是我们需要的。

那么为什么不能使用上面这条 SELECT 语句呢?解释如下:上面的 SELECT 语句指定了两列(Customer 和 SUM(OrderPrice))。“SUM(OrderPrice)” 返回一个单独的值(“OrderPrice” 列的总计),而 “Customer” 返回 6 个值(每个值对应 “Orders” 表中的每一行)。因此,我们得不到正确的结果。不过,您已经看到了,GROUP BY 语句解决了这个问题。
SQL GROUP BY X, Y示例
GROUP BY X, Y将相同的X字段值和Y字段值的记录放在一个分组

我们拥有下面这个 "Students" 表:

	自动编号   学号   	姓名   课程编号  课程名称  分数
	  1     2005001 	张三    0001     数学    69
	  2     2005002 	李四    0001     数学    89
	  3     2005001 	张三    0001     数学    69
  
删除除了自动编号不同, 其他都相同的学生冗余信息

我们想要使用 GROUP BY 语句对客户进行组合。
我们可以使用下列 SQL 语句,将重复数据去除:

delete from Students
 where 自动编号 not in (
                   select min(自动编号)
                     from Students t
                    group by t.学号, t.姓名, t.课程编号, t.课程名称, t.分数
                  );
commit;

引用:https://www.w3school.com.cn/sql/sql_groupby.asp

猜你喜欢

转载自blog.csdn.net/weixin_46932303/article/details/106974033