Mysql中group by,having和where的使用
- sql语法结构
- sql执行顺序
- where 和 having 的使用区别
- group by详细用法
sql语法结构
select
from
where(不能使用聚合函数)原因如下
join on
group by (分组)
having(可以使用聚合函数,在分组后筛选元组配合group by使用)
order by
where不能使用聚合函数的原因:点击此处.
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 会出现什么情况:
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;