前言
又是新的一周,继续努力呀~
数据分组
怎么理解数据分组呢?举个简单的例子,一个学校有一个高三年级的学生名单,整个年级有三个班,这样我们就可以按照班级对数据进行分组。
个人理解的话,分组就是将具有某个相同值的数据分离开。
创建分组
那么如何进行分组呢?分组是在SELECT语句的GROUP BY子句中建立的。
看下面的例子,针对下面的表格(student)
我们对上面的表进行分组。
group by子句在后面要跟列名,它会把该列中具有相同的值的记录合成一组。
group by 子句可以包含任意数目的列,它会把后面跟的所有列值相同的分在一组,比如看下面的例子
因为只有第一条记录和第二条记录的class列和name的值都相等,所有他们在同一组,其余记录各占一组。
过滤分组
在上面的例子中,我们按class分组会得到三组数据,那么我只想得到一班和二班的总人数该怎么办呢?这时候就需要对分组进行过滤了。也就是按照某个标准排除掉某些分组。
咋一看比较简单,我直接加一个WHERE子句不就可以了吗?答案是不行,为什么呢?因为WHERE过滤指定的是行而不是分组。事实上, WHERE没有分组的概念。
我们利用HAVING子句来对分组数据进行过滤,也就是说HAVING过滤的是分组,它的用法与WHERE子句的用法比较相似。
事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组
那么怎么过滤分组呢?我们来看下面的例子
上面的例子过滤掉了class为3的分组。
前面我们提到HAVING子句在WHERE子句后面,对于MySQL来说,先执行WHERE子句,在执行HAVING子句
结果为什么是这样呢?原因是先执行WHERE子句,执行完之后的表格实际上是
也就是对上面的表格再进行分组,所以最终的结果就只有一条。
分组和排序
我们现在知道分组是利用GROUP BY子句,排序是ORDER BY子句。
虽然GROUP BY和ORDER BY经常完成相同的工作,但它们是非常不同的。
SELECT子句顺序
到这里,我们已经学习了较多的子句,今天就大致总结一下子句的顺序
今天的内容比较简单,但是十分重要,大家可以自行多练练~