Sql学习第四天——SQL关于withcube,withrollup和grouping解释及演示
关于withcube,withrollup和grouping
通过查看sql2005的帮助文档找到了CUBE和ROLLUP之间的具体区别:
CUBE生成的结果集显示了所选列中值的所有组合的聚合。ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合。
再看看对grouping的解释:
当行由CUBE或ROLLUP运算符添加时,该函数将导致附加列的输出值为1;当行不由CUBE或ROLLUP运算符添加时,该函数将导致附加列的输出值为0。
仅在与包含CUBE或ROLLUP运算符的GROUPBY子句相关联的选择列表中才允许分组。
当看到以上的解释肯定非常的模糊,不知所云和不知道该怎样用,下面通过实例操作来体验一下:
先建表(dbo.PeopleInfo):
CREATETABLE[dbo].[PeopleInfo](
[id][int]IDENTITY(1,1)NOTNULL,
[name][nchar](10)COLLATEChinese_PRC_CI_ASNULL,
[numb][nchar](10)COLLATEChinese_PRC_CI_ASNOTNULL,
[phone][nchar](10)COLLATEChinese_PRC_CI_ASNULL,
[FenShu][int]NULL
)ON[PRIMARY]
向表插入数据:
insertintopeopleinfo([name],numb,phone,fenshu)values("李欢","3223","1365255",80)
insertintopeopleinfo([name],numb,phone,fenshu)values("李欢","322123","1",90)
insertintopeopleinfo([name],numb,phone,fenshu)values("李名","3213112352","13152",56)
insertintopeopleinfo([name],numb,phone,fenshu)values("李名","32132312","13342563",60)
insertintopeopleinfo([name],numb,phone,fenshu)values("王华","3223","1365255",80)
查询出插入的全部数据:
select*fromdbo.PeopleInfo
结果如图:
操作一:先试试:1,查询所有数据;2,用groupby查询所有数据;3,用withcube。这三种情况的比较
SQL语句如下:
select*fromdbo.PeopleInfo--1,查询所有数据;
select[name],numb,sum(fenshu)fromdbo.PeopleInfogroupby[name],numb--2,用groupby查询所有数据;
select[name],numb,sum(fenshu)fromdbo.PeopleInfogroupby[name],numbwithcube--3,用withcube。这三种情况的比较
结果如图:
结果分析:
用第三种(用withcube)为什么会多出来有null的字段值呢?通过分析图上的值得组合会发现是怎么回事儿了,以第三条数据(李欢,null,170)为例:它只是把姓名是【李欢】的分为了一组,而没有考虑【numb】,所以有多出来了第三条数据,也说明了170是怎么来的。其他的也是这样。再回顾一下帮助文档的解释:CUBE生成的结果集显示了所选列中值的所有组合的聚合,发现明了了许多。
操作二:1,用withcube;2,用withrollup这两种情况的比较
SQL语句如下:
select[name],numb,sum(fenshu)fromdbo.PeopleInfogroupby[name],numbwithcube--用withcube。
select[name],numb,sum(fenshu)fromdbo.PeopleInfogroupby[name],numbwithrollup--用withrollup。
结果如图:
结果分析:
为什么withcube比withrollup多出来一部分呢?原来它没有显示,以【numb】分组而不考虑【name】的数据情况。再回顾一下帮助文档的解释:ROLLUP生成的结果集显示了所选列中值的某一层次结构的聚合,那这个【某一层次】又是以什么为标准的呢?我的猜想是:距离groupup最近的字段必须考虑在分组内。
证明猜想实例:
操作:用两个groupup交换字段位置的sql语句和一个在groupup后面增加一个字段的sql语句进行比较:
SQL语句如下:
select[name],numbfromdbo.PeopleInfogroupby[name],numbwithrollup
select[name],numbfromdbo.PeopleInfogroupbynumb,[name]withrollup
select[name],numb,phonefromdbo.PeopleInfogroupby[name],numb,phonewithrollup
结果如图:
通过结果图的比较发现猜想是正确的。
---------------------------------------------------grouping-------------------------------------------------
现在来看看grouping的实例:
SQL语句看看与withrollup的结合(与withcube的结合是一样的):
select[name],numb,grouping(numb)fromdbo.PeopleInfogroupby[name],numbwithrollup
结果如图:
结果分析:
结合帮助文档的解释:当行由CUBE或ROLLUP运算符添加时,该函数将导致附加列的输出值为1;当行不由CUBE或ROLLUP运算符添加时,该函数将导致附加列的输出值为0。 很容易理解再此就不多解释了。
相关文章
- SQL Server 数据库学习「建议收藏」
- SQL Server仓储物流公司visual studio发货数据仓库设计
- SQL开发知识:SQL Server中修改“用户自定义表类型”问题
- 详解SQL Server如何修改数据库物理文件的存在位置
- sql分组后二次汇总(处理表重复记录查询和删除)的实现方法
- SQL SERVER 分组求和sql语句
- Oracle解锁SQL:实现精准控制(oracle解锁sql)
- Oracle 中优化SQL性能的终极指南(oracle中sql优化)
- MySQL解析SQL: 打开路径视窗之门(mysql解析sql)
- MySQL学习笔记:创建表的SQL语句(mysql创建表的sql)
- MySQL函数大百科,轻松学习SQL编程(mysql函数大全)
- 【学习SQL Server,提升职业通向晋升之路】(学习sqlserver)
- SQL服务器无法运行MSSQL(sql服务没有mssql)
- 框SQL Server:脱离框架向前行(sqlserver 跳出)
- 如何排查慢的 Oracle SQL?(oracle慢的sql)
- 优化SQL Server服务,提升性能(sqlserver服务项)
- 使用SQL Server列表框轻松构建数据表格(sqlserver列表框)
- 深入浅出学习SQL Server2016(sqlserver16)
- 探索Oracle的SQL跟踪工具:优化数据库性能的重要利器(oracle跟踪sql工具)
- 使用SQL Server执行SQL文件的最佳实践(sqlserver执行sql文件)
- Oracle与SQL:两者共同促进数据库发展(oracle 和 sql)
- MySQL数据库简单导出SQL脚本方法(mysql导出sql脚本)
- MySQL中遇到的SQL语句陷阱(mysql中sql语句坑)
- Oracle数据库如何防范SQL注入(oracle会sql注入)
- Oracle SQL认证获取高级计算能力的必要准备(oracle sql认证)
- 深入浅出学习Oracle SQL中文(oracle sql中文)
- Sql学习第一天——SQL将变量定义为Table类型(虚拟表)