MYSQL API之 WITH ROLLUP

GROUP BY子句允许一个将额外行添加到简略输出端 WITH ROLLUP 修饰符。这些行代表高层(或高聚集)简略操作。ROLLUP 因而允许你在多层分析的角度回答有关问询的问题。例如,它可以用来向OLAP (联机分析处理) 操作提供支持。

设想一个名为sales 的表具有年份、国家、产品及记录销售利润的利润列:

CREATE TABLE sales

(

year    INT NOT NULL,

country VARCHAR(20) NOT NULL,

product VARCHAR(32) NOT NULL,

profit  INT

);

可以使用这样的简单GROUP BY,每年对表的内容做一次总结:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year;

+------+-------------+

| year | SUM(profit) |

+------+-------------+

| 2000 |        4525 |

| 2001 |        3010 |

+------+-------------+

这个输出结果显示了每年的总利润, 但如果你也想确定所有年份的总利润,你必须自己累加每年的单个值或运行一个加法询问。

或者你可以使用 ROLLUP, 它能用一个问询提供双层分析。将一个 WITH ROLLUP修饰符添加到GROUP BY 语句,使询问产生另一行结果,该行显示了所有年份的总价值:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP;

+------+-------------+

| year | SUM(profit) |

+------+-------------+

| 2000 |        4525 |

| 2001 |        3010 |

| NULL |        7535 |

+------+-------------+

总计高聚集行被年份列中的NULL值标出。

当有多重 GROUP BY 列时,ROLLUP产生的效果更加复杂。这时,每次在除了最后一个分类列之外的任何列出现一个 “break” (值的改变) ,则问讯会产生一个高聚集累计行。

例如,在没有 ROLLUP的情况下,一个以年、国家和产品为基础的关于 sales 表的一览表可能如下所示:

mysql> SELECT year, country, product, SUM(profit)

-> FROM sales

-> GROUP BY year, country, product;

+------+---------+------------+-------------+

| year | country | product    | SUM(profit) |

+------+---------+------------+-------------+

| 2000 | Finland | Computer   |        1500 |

| 2000 | Finland | Phone      |         100 |

| 2000 | India   | Calculator |         150 |

| 2000 | India   | Computer   |        1200 |

| 2000 | USA     | Calculator |          75 |

| 2000 | USA     | Computer   |        1500 |

| 2001 | Finland | Phone      |          10 |

| 2001 | USA     | Calculator |          50 |

| 2001 | USA     | Computer   |        2700 |

| 2001 | USA     | TV         |         250 |

+------+---------+------------+-------------+

表示总值的输出结果仅位于年/国家/产品的分析级别。当添加了 ROLLUP后, 问询会产生一些额外的行:

mysql> SELECT year, country, product, SUM(profit)

-> FROM sales

-> GROUP BY year, country, product WITH ROLLUP;

+------+---------+------------+-------------+

| year | country | product    | SUM(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 |

+------+---------+------------+-------------+

对于这个问询, 添加ROLLUP 子句使村输出结果包含了四层分析的简略信息,而不只是一个下面是怎样解释  ROLLUP输出:

  • 一组给定的年份和国家的每组产品行后面, 会产生一个额外的总计行, 显示所有产品的总值。这些行将产品列设置为 NULL。
  • 一组给定年份的行后面,会产生一个额外的总计行,显示所有国家和产品的总值。这些行将国家和产品列设置为  NULL。
  • 最后, 在所有其它行后面,会产生一个额外的总计列,显示所有年份、国家及产品的总值。 这一行将年份、国家和产品列设置为 NULL。

使用ROLLUP 时的其它注意事项

以下各项列出了一些MySQL执行ROLLUP的特殊状态:

当你使用 ROLLUP时, 你不能同时使用 ORDER BY子句进行结果排序。换言之, ROLLUP 和ORDER BY 是互相排斥的。然而,你仍可以对排序进行一些控制。在 MySQL中, GROUP BY 可以对结果进行排序,而且你可以在GROUP BY列表指定的列中使用明确的 ASC和DESC关键词,从而对个别列进行排序。 (不论如何排序被ROLLUP添加的较高级别的总计行仍出现在它们被计算出的行后面)。

时间: 2024-11-09 01:58:23

MYSQL API之 WITH ROLLUP的相关文章

MySQL中的WITH ROLLUP

MySQL中的WITH ROLLUP MySQL的扩展SQL中有一个非常有意思的应用WITH ROLLUP,在分组的统计数据的基础上再进行相同的统计(SUM,AVG,COUNT…),非常类似于Oracle中统计函数的功能,Oracle的统计函数更多更强大. 下面演示单个司机以及所有司机的总行驶里程数和平均行驶里程数: mysql> select name,sum(miles) as 'miles/driver' -> from driver_log group by name with rol

c++连接mysql数据库(使用mysql api方式,环境VS2013+MYSQL5.6)

转载请注明出处,原文地址http://www.cnblogs.com/zenki-kong/p/4382657.html 刚开始写博客,博主还只是个大三汪,学艺不精,如有错误还请前辈指出(>^ω^<),废话不多说啦,进入正文 下一篇博客应该会讲使用mysql connector c++来让c++连接mysql,本篇是直接使用mysql api 首先交代一下开发环境,64位mysql5.6.23+VS2013+WIN7旗舰版 一开始用mysql5.7.6提示缺少binary_log_types.

Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据

Title:Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据 --2013-10-11 11:57 #include <stdio.h> #include <string.h> #include <stdlib.h> #include "mysql.h" int main(int argc, char *argv[]) { MYSQL my_connection; int res; mysql_ini

c语言mysql api

原文:c语言mysql api 1.mysql_affected_rows()            //返回上次UPDATE.DELETE或INSERT查询更改/删除/插入的行数. 2.mysql_autocommit()                //切换 autocommit模式,ON/OFF. 3.mysql_change_user()                //更改打开连接上的用户和数据库. 4.mysql_charset_name()            //返回用于连

MySQL API函数

MySQL提供了很多函数来对数据库进行操作,大致可以分为以下几类:        第一部分 控制类函数         mysql_init()初始化MySQL对象    mysql_options()设置连接选项     mysql_real_connect()连接到MySQL数据库        mysql_real_escape_string()将查询串合法化     mysql_query()发出一个以空字符结束的查询串     mysql_real_query()发出一个查询串    

64位 Windows 用了 32位编译平台 编译不过 MySQL API

发生在一周前的事情了,当时想感受下 MySQL C API ,就写了几个小例子.虽然是在 Windows(我的工作电脑是 64位 Windows) 上面,但是不想用 VS ,只想用文本软件写好代码后用 cl 编译,然后用 link 链接.就在我写完最简单的一个例子后,死活都编译不过去.代码如下: #include <my_global.h> #include <mysql.h> int main(int argc, char **argv) { printf("MySQL

mysql api 不支持source命令

今天写了个代码 <?php ..... mysql_query("source /tmp/cr.sql",$link); ..... ?> 结果死活cr.sql的SQL语句就是没效果,查了下, SOURCE is definitely a command that is preprocessed by the mysql client. The server does not understand that command. So you can't execute SOU

MySQL api

今天看去年年中写的代码,留意到一个关键时刻能提高效率的api:on duplicate key update: 语法: INSERT INTO INSERT INTO g_iot_user_building ()VALUES() ON DUPLICATE KEY UPDATEa='a',b='b': 当你想向某个表中插入数据,同时保证该条数据在表中不存在时,可使用上面这个方法: 值得注意的是,该方法是mysql特有,并不是sql通用,所以使用的时候需要区别使用: 使用场景: 调用钉钉人员相关接口

mysql group by with rollup

1.普通的 GROUP BY 操作,可以按照部门和职位进行分组,计算每个部门,每个职位的工资平均值: mysql> select dep,pos,avg(sal) from employee group by dep,pos; +------+------+-----------+ | dep | pos | avg(sal) | +------+------+-----------+ | 01 | 01 | 1500.0000 | | 01 | 02 | 1950.0000 | | 02 |