MySQL各类函数的运用必知必会
12.1.1 AVG函数
作用是求出指定列的平均值,方式是先统计行数再求和进行运算,他会对列查询,然后得出结果
AVG函数只能作用于单列 AVG(列名)
AVG函数不会统计值为NULL的行
12.1.2 COUNT函数
作用是确定表中的行的数目,或者是符合特定条件的行的数目
COUNT函数有两种用法 COUNT(*) 和 COUNT(列名)
前者能统计所有的行(不管行的某一列是否为NULL),后者统计的时候会忽略指定列为NULL的行
12.1.3 MAX函数12.1.4 MIN函数
MAX(列名) 返回指定列中的最大值
MIN(列名) 返回指定列中的最小值
两个函数都要求指定列名(如果不指定列名,则返回NULL),都不对列为NULL的行进行统计
两个函数一般用来对数值或者时间进行操作,但是也同样允许对非数值数值数据使用,对非数值类型使用,返回的是minimum(maximum) string value.
12.1.2 COUNT函数
作用是确定表中的行的数目,或者是符合特定条件的行的数目
COUNT函数有两种用法COUNT(*) 和 COUNT(列名)
前者能统计所有的行(不管行的某一列是否为NULL),后者统计的时候会忽略指定列为NULL的行
12.1.5 SUM函数
作用是返回指定列的和
除了SUM(列名)之外,还可以使用算术运算符SUM(列名1 运算符 列名2)的形式
如果没有匹配的列,则返回NULL
12.2 聚集不同值(distinct)
上面的5个函数都可以用distinct修饰列,用来表示聚集不同的值,对于MAX()和 MIN(),加不加distinct是一样的结果,对于其他三个聚集函数,其他三个都将发挥作用。
AVG(distinct 列名) 取所有不同列值的平均数
COUNT(distinct 列名) 统计所有不同的列值的个输
SUM(distinct 列名) 取所有不同列值的总和
12.3 组合聚集函数
可以在一个select语句中多次使用聚合函数
13.2 创建分组
使用GROUP BY子句来创建分组,同时要注意以下几点
1、GROUP BY子句可以包含任意数目的列,这使得能对分组进行嵌套,为数据分组提供更细致的控制
2、如果在GROUP BY子句中使用了多个列,那么在建立分组时,所有列都将一起计算
GROUP BY X意思是将所有具有(相同X字段值)的记录放到一个分组里,
GROUP BY X, Y意思是将所有具有(相同X字段值和Y字段值)的记录放到一个分组里。(摘抄自网络)
3、GROUP BY子句中列出的每个列必须是检索列或者是有效表达式(不能是聚集函数),如果有在SELECT中使用表达式,则在GROUP BY子句中也要使用表达式,不能使用别名。
4、除聚集函数计算语句外,SELECT中的每个列都必须在GROUP BY语句中给出
5、如果分组列中有NULL值,则NULL将作为一个分组返回,如果列中有多行NULL,则归为一组(在仅对一列进行分组时)
6、GROUP BY子句必须出现在WHERE子句后,ORDER BY子句前。
WITH ROLLUP 关键字
使用WITH ROLLUP关键字,可以得到对每个分组的总和,在GROUP BY多个列时,可以分别对每个列级别进行汇总,示例:
mysql> SELECT year, country, product, SUM(profit) AS profit FROM sales GROUP BY year ASC, country ASC, product ASC WITH ROLLUP; +------+---------+------------+--------+ | year | country | product | profit | +------+---------+------------+--------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | NULL | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | India | NULL | 1350 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2000 | USA | NULL | 1575 | | 2000 | NULL | NULL | 4525 | | 2001 | Finland | Phone | 10 | | 2001 | Finland | NULL | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+------------+--------+
GROUPING 函数
暂时先贴几个示例,详情百度或参阅MYSQL参考手册
对于GROUPING(列1) ,如果某行的列1的NULL值是超聚合(super-aggregate)变量标志,也就是说该行为列1的超聚合行,则值为1。
mysql> SELECT year, country, product, SUM(profit) AS profit, GROUPING(year) AS grp_year, GROUPING(country) AS grp_country, GROUPING(product) AS grp_product FROM sales GROUP BY year ASC, country ASC, product ASC WITH ROLLUP; +------+---------+------------+--------+----------+-------------+-------------+ | year | country | product | profit | grp_year | grp_country | grp_product | +------+---------+------------+--------+----------+-------------+-------------+ | 2000 | Finland | Computer | 1500 | 0 | 0 | 0 | | 2000 | Finland | Phone | 100 | 0 | 0 | 0 | | 2000 | Finland | NULL | 1600 | 0 | 0 | 1 | | 2000 | India | Calculator | 150 | 0 | 0 | 0 | | 2000 | India | Computer | 1200 | 0 | 0 | 0 | | 2000 | India | NULL | 1350 | 0 | 0 | 1 | | 2000 | USA | Calculator | 75 | 0 | 0 | 0 | | 2000 | USA | Computer | 1500 | 0 | 0 | 0 | | 2000 | USA | NULL | 1575 | 0 | 0 | 1 | | 2000 | NULL | NULL | 4525 | 0 | 1 | 1 | | 2001 | Finland | Phone | 10 | 0 | 0 | 0 | | 2001 | Finland | NULL | 10 | 0 | 0 | 1 | | 2001 | USA | Calculator | 50 | 0 | 0 | 0 | | 2001 | USA | Computer | 2700 | 0 | 0 | 0 | | 2001 | USA | TV | 250 | 0 | 0 | 0 | | 2001 | USA | NULL | 3000 | 0 | 0 | 1 | | 2001 | NULL | NULL | 3010 | 0 | 1 | 1 | | NULL | NULL | NULL | 7535 | 1 | 1 | 1 | +------+---------+------------+--------+----------+-------------+-------------+
为了更直观的在查询中看出超聚合行,可以这样写,这样写还可以区分出原始聚合数据中的NULL值与超聚合行的NULL标识
mysql> SELECT IF(GROUPING(year), 'All years', year) AS year, IF(GROUPING(country), 'All countries', country) AS country, IF(GROUPING(product), 'All products', product) AS product, SUM(profit) AS profit FROM sales GROUP BY year ASC, country ASC, product ASC WITH ROLLUP; +-----------+---------------+--------------+--------+ | year | country | product | profit | +-----------+---------------+--------------+--------+ | 2000 | Finland | Computer | 1500 | | 2000 | Finland | Phone | 100 | | 2000 | Finland | All products | 1600 | | 2000 | India | Calculator | 150 | | 2000 | India | Computer | 1200 | | 2000 | India | All products | 1350 | | 2000 | USA | Calculator | 75 | | 2000 | USA | Computer | 1500 | | 2000 | USA | All products | 1575 | | 2000 | All countries | All products | 4525 | | 2001 | Finland | Phone | 10 | | 2001 | Finland | All products | 10 | | 2001 | USA | Calculator | 50 | | 2001 | USA | Computer | 2700 | | 2001 | USA | TV | 250 | | 2001 | USA | All products | 3000 | | 2001 | All countries | All products | 3010 | | All years | All countries | All products | 7535 | +-----------+---------------+--------------+--------+
GROUPING(year, country, product) 数值上等于
result for GROUPING(product)
+ result for GROUPING(country) << 1
+ result for GROUPING(year) << 2
因此有下面的示例能查询出所有的超聚合行
mysql> SELECT year, country, product, SUM(profit) AS profit FROM sales GROUP BY year ASC, country ASC, product ASC WITH ROLLUP HAVING GROUPING(year, country, product) <> 0; +------+---------+---------+--------+ | year | country | product | profit | +------+---------+---------+--------+ | 2000 | Finland | NULL | 1600 | | 2000 | India | NULL | 1350 | | 2000 | USA | NULL | 1575 | | 2000 | NULL | NULL | 4525 | | 2001 | Finland | NULL | 10 | | 2001 | USA | NULL | 3000 | | 2001 | NULL | NULL | 3010 | | NULL | NULL | NULL | 7535 | +------+---------+---------+--------+
关于ROLLUP更多的细节 可以参阅MYSQL参考手册