SUM函数用来求和、group by用来分组查询。
一、建表、插入数据
1、创建一个student表
2、查看student表结构
3、插入6条数据
4、插入了6条数据后,我们可以发现自增数据(auto_increment)的默认值已变为7。
二、操作实例
1、给出各个部门最高分数的学生。
要想得到各个部门学生,首先就要分组,按照部门把他们分组,然后在各个部门中找到分数最高的就可以了。
2、进一步,分数最高的必须是男生,即sex列值必须为0才挑选出。
这里我们没有用where语句而是用了having,因为我们的条件是在分组后进行的所以用having。
3、分组前先使用where根据条件sex=’1’筛选,然后再按照dept部门分组。
4、选择条件改为必须部门所有人的分数之和大于150才能把分数最高的部门的人列出来,这里就必须使用having了,因为 having 里面可以使用聚合函数sum,并且也必须分完组我们才能得到这个组的总分数,才能比较是否该值大于150。
5、要选出不重复的部门
6、如果还要列出一些其他信息,使用distinct如下(distinct只能放到开始位置)。
7、上述查询为什么没有达到预期的效果?因为distinct 作用到了2个字段上,这时,我们就需要使用groub by 。
按照dept分组,自然就达到去重的目的了。所以有时候如果我们碰到了一个问题很难解决,比如用distinct去重,并带上其他列值,我们就需要尝试换个思路。
8、得到每个部门的总分
select dept, sum(score) from student group by dept;
三、MySQL中的聚合函数
1、count()返回某列的行数
2、avg()返回某列的平均值
3、max()返回某列的最大值
4、min()返回某列的最小值
5、sum()返回某列的和
6、distinct 去除重复值
avg()忽略值为null的行
count(*)时统计所有行,count(列)时忽略为null的行
四、Group By 和 Having, Where ,Order by语句的执行顺序
一个SQL语句往往会产生多个临时视图,那么这些关键字的执行顺序就非常重要了,因为你必须了解这个关键字是在对应视图形成前的字段进行操作还是对形成的临时视图进行操作,这个问题在使用了别名的视图尤其重要。
Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by
首先 where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数)
然后通过Group By关键字后面指定的分组条件将筛选得到的视图进行分组
接着系统根据Having关键字后面指定的筛选条件,将分组视图后不满足条件的记录筛选掉
最后按照Order By语句对视图进行排序,这样最终的结果就产生了。
在这四个关键字中,只有在Order By语句中才可以使用最终视图的列名,如:
SELECT FruitName, ProductPlace, Price, ID AS IDE, Discount
FROM T_TEST_FRUITINFO
WHERE (ProductPlace = N'china')
ORDER BY IDE
这里只有在ORDER BY语句中才可以使用IDE,其他条件语句中如果需要引用列名则只能使用ID,而不能使用IDE。
凡是在group by后面出现的字段,必须同时在select后面出现;
凡是在select后面出现的、同时未在聚合函数中出现的字段,必须同时出现在group by后面.
having 子句被限制已经在SELECT语句中定义的列和聚合表达式上。
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行.而where子句在查询过程中执行优先级别优先于聚合语句(sum,min,max,avg,count)。!!!!
简单说来:
where子句:
select sum(num) as rmb from order where id>10
//只有先查询出id大于10的记录才能进行聚合语句
having就是来弥补where在分组数据判断时的不足。因为where执行优先级别要快于聚合语句。