Sql学习第四天——SQL 关于with cube,with rollup和grouping解释
关于with cube ,with rollup 和 grouping,通过查看sql 2005的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别:,CUBE 生成的结果集显示了所选列中值的所有组合的聚合。ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。,再看看对grouping的解释:,当行由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 1;当行不由 CUBE 或 ROLLUP 运算符添加时,该函数将导致附加列的输出值为 0。,仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相关联的选择列表中才允许分组。,当看到以上的解释肯定非常的模糊,不知所云和不知道该怎样用,下面通过实例操作办法来体验一下:,先建表(dbo.PeopleInfo):,复制具体相关代码 具体相关代码如下:,CREATE TABLE [dbo].[PeopleInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [nchar](10) COLLATE Chine,复制具体相关代码 具体相关代码如下:,insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','3223','1365255',80) insert into peopl,复制具体相关代码 具体相关代码如下:,select * from dbo.PeopleInfo,操作办法一:先试试:1, 查询所有数据;2,用group by 查询所有数据;3,用with cube。这三种情况的比较,SQL数据库语句如下:,复制具体相关代码 具体相关代码如下:,select * from dbo.PeopleInfo --1, 查询所有数据; select [name],numb,sum(fenshu) from dbo.PeopleInfo group b,结果分析:, 用第三种(用with cube)为什么会多出来有null的字段值呢?通过分析图上的值得组合会发现是怎么回事儿了,以第三条数据(李欢,null,170)为例:它只是把姓名是【李欢】的分为了一组,而没,操作办法二:1,用with cube;2,用with rollup 这两种情况的比较,SQL数据库语句如下:,复制具体相关代码 具体相关代码如下:,select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube --用with cube。 sele,结果分析:, 为什么with cube 比 with rollup多出来一部分呢?原来它没有显示,以【numb】分组而不考虑【name】的数据情况。再回顾一下帮助文档的解释:ROLLUP 生成的结果集显示了所选,证明猜想实例:,操作办法:用两个group up 交换字段位置的sql数据库语句和一个在group up 后面增加一个字段的sql数据库语句进行比较:,SQL数据库语句如下:,复制具体相关代码 具体相关代码如下:,select [name],numb from dbo.PeopleInfo group by [name],numb with rollup select [name],numb from dbo.,通过结果图的比较发现猜想是正确的。,---------------------------------------------------grouping-----------------------------------------,现在来看看grouping的实例:,SQL数据库语句看看与with rollup的结合(与with cube的结合是一样的):,复制具体相关代码 具体相关代码如下:
这个问题的原因在于有用户连接了当前要做还原的网站数据库,这里的用户甚至包括当前要做还原的用户。解决办法就是关闭与要还原网站数据库的所有连接。
①先切换网站数据库到master网站数据库。执行数据库语句
select * from master..sysprocesses where dbid=db_id( '网站数据库名称')
②然后逐步运行数据库语句 exec kill spid(上一步结果集中的数据),
问题就解决了。哈哈
今天在还原网站数据库的时候,提示"因为网站数据库正在使用,所以无法获得对网站数据库的独占访问权",无论我是重启网站数据库,还是重启计算机,都不能解决问题,多番尝试后,终于解决了该问题。现将引发该问题的原因与解决方案写出来,有不对的地方欢迎大家提出来。
引发原因:是因为我在还原网站数据库的时候,还有其他的用户正在使用网站数据库,所以就会出现以上提示。
解决具体相关方法:
1,设置网站数据库在单用户模式下工作。
设置具体相关方法:在需要还原的网站数据库上右击,在右键菜单开始执行命令上选择"属性"- >"选项"- >"状态"- >"限制访问"- >"Single"。这是SQLSERVER2005的菜单开始执行命令,其它版本请自己查找。
2,利用SQL数据库语句,杀死正在使用该网站数据库的所有进程,自己以前在做一个SQL SERVER操作办法小相关工具的时候有写过该功能的SQL,贴出来供大家参考:
复制具体相关代码 具体相关代码如下:
declare @dbname varchar(50)
set @dbname='网站数据库名称'
declare @sql varchar(50)
declare cs_result cursor local for select 'kill ' cast(spid as varchar(50)) from sys.sysprocesses where db_name(dbid)=@dbname
open cs_result
fetch next from cs_result into @sql
while @@fetch_status=0
begin
execute(@sql)
fetch next from cs_result into @sql
end
close cs_result
deallocate cs_result
该SQL数据库语句利用游标循环所有正在使用该网站数据库的进程,并通过kill开始执行命令杀死进程。
3,利用SQL数据库语句,断开所有用户链接,并回滚所有事务,具体SQL数据库语句如下:
复制具体相关代码 具体相关代码如下:
ALTER DATABASE [网站数据库名称]
SET OFFLINE WITh ROLLBACK IMMEDIATE
注意:在使用具体相关方法2与3时,不要在需要的还原的网站数据库下执行,建议在master网站数据库下面执行。