一.分组数据
MySQL如果要返回特定检索的数据怎么办?或者只返回特定供应商所提供的产品怎么办?那就分组吧!
1.创建分组
在具体使用GUOUP BY子句前,需要知道一些重要的规定。
(1)GROUP BY子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制。
(2)如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定所有的列都一起计算。
(3)GROUP BY子句中列出的每个列都是必须检索列或有效的表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
(4)除聚集计算语句之外,SELECT语句中每个列都必须在GROUP BY子句中给出。
(5)
如果多个分组列中具有NULL值,则NULL值将作为最后一个分组返回。如果列中有多行NULL值,它们将被分为一组。
(6)
GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
2.过滤分组
除了用GROUP BY分组数据外,MySQL还允许过滤分组,规定包括那些分组,排除哪些分组。
WHERE语句不能完成该任务,因为WHERE过滤的是指定的行而不是分组。事实上,WHERE没有分组的概念。
MySQL为此专门提供了另外的子句
,那就是HAVING子句。事实上,目前学过的所有类型的WHERE子句都可以用HAVING来代替。唯一差别是,WHERE过滤行,而HAVING过滤分组。下面这条子句最后一行增加了HAVING子句,它过滤COUNT(*)>=2的那些分组。
WHERE子句和HAVING子句可以混用,
WHERE负责过滤行,HAVING负责过滤分组,如:
3.分组和排序
虽然GROUP BY 和 ORDER BY经常完成相同的工作,但是它们是非常不同的。
不要忘记ORDER BY!一般在使用GROUP BY子句时,也应该给出ORDER BY子句,这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。
重点:
4.SELECT 子句的顺序
SELECT语句中使用时有必须遵循的顺序,如下:
顺序由上到下即可。最后一个是LIMIT,倒是第二个是ORDER BY。可见除了LIMIT之外,ORDER BY是要往最后写的。