【分组】

GROUP BY子句和HAVING子句

场景:

select * from table group by zd

按照字段 zd的 不同的来分组 zd有多少的不一样的 就有多少个组  group by 

会根据指定的字段 依靠几个字段的组成的唯一性 来把数据分成一个一个唯一性的数据

【注意】

1、分组 的字段 要充分考虑完成 select 的字段和分组的字段 尽量保持一致

如果group by的字段少了 那么 select出来的 不同的字段 会被错误的忽略掉

2、group by 只会去合并相同的项 使数据减少(group by  带有去重的功能)

【对分组的理解】

1、分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

2、分组 默认把字段相同的值 分成一个组

3、这个字段 可以相同的分组 那其他select的字段呢??也必须分组

group by zd 相当于去重 但这里不是 筛选去重 而是 排列去重

 GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,

为数据分组提供更细致的控制。

嵌套:

 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上

进行汇总。换句话说,在建立分组时,指定的所有列都一起计算

(所以不能从个别的列取回数据)。

 GROUP BY子句中列出的每个列都必须是检索列或有效的表达式

(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在

Can't group on 'stocks'

GROUP BY子句中指定相同的表达式。不能使用别名。

select 表达式 group by 表达式

 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子

句中给出。 使用分组 select的所有字段 都必须分组

select zd,zd1 from table group by zd × >> zd 分组,zd1 取随机值

select zd,zd1 from table group by zd,zd1 √ >> 取全部

select exch_id,instrument_id from xtp_exch_sec_auto group by exch_id,instrument_id

select exch_id,instrument_id from xtp_exch_sec_auto

 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列

中有多行NULL值,它们将分为一组。

 GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。

where group by order by

使用WITH ROLLUP关键字

在group分组字段的基础上再进行统计数据  比如 

SELECT name, SUM(money) as money FROM  test GROUP BY name WITH ROLLUP;
结果就是 除了name的  求和  还会出现 一个总的  求和结果行  但是name是空的 
可以这样来 给name取一个值
SELECT coalesce(name, '总金额'),name, SUM(money) as money FROM  test GROUP BY name WITH ROLLUP;
每一行的执行一次 coalesce 
coalesce(a,b,c);
参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)
对name 做一个逻辑上的判断

 

【多个字段分组】

select zd,zd1 from table group by zd,zd1,zd3 具有相同多个字段的分在一个组

【过滤分组】HAVING  通常和聚集函数 一起使用   

MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组

所有类型的WHERE子句都可以用HAVING来替代  但是 HAVING 还不能完全被WHERE 替代

在第6章和第7章中,我们学习了WHERE子句的条件(包括通配符条件和带多个操作符的子
句)。所学过的有关WHERE的所有这些技术和选项都适用于HAVING。它们的句法是相同的,只是关键字有差别

行的过滤 用where

过滤分组 用HAVING 可以替代where

WHERE在数据分组前进行过滤,HAVING在数据分组后进行滤

WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组

select zd,count(*) ad zd3 fron table group by zd having count(*) >=2

#不能使用别名

select zd,count(*) ad zd3 fron table where zd> =10 group by zd having count(*) >=2

#使用where从开头开始过滤 剔除

【分组和排序】

mysql 分组后删除重复的 mysql多次分组_数据

GROUP BY:

1、排序产生的输出

2、任意列都可以使用(甚至非选择的列也可以使用)

3、不一定需要

ORDER BY:

1、分组行。但输出可能不是分组的顺序 group by 用来分组,但是分出来的组 怎么排序 没有。。。

group by 依赖 order by 来排序

2、只可能使用选择列或表达式列,而且必须使用每个选择列表达式

3、如果与聚集函数一起使用列(或表达式),则必须使用

4、排序放在分组的后面

select zd,count(*) ad zd3 fron table where zd> =10

group by zd having count(*) >=2

order by zd

【select 子句关键字的顺序】

select 必须

from 仅从表查询数据 必须

where 不必须

group by 按组聚集排序时使用

having 不必须

order by 不必须

limit 不必须