1). apply有两种形式: cross apply 和 outer apply
先看看语法: <left_table_expression> {cross|outer} apply <right_table_expression>再让我们了解一下apply运算涉及的两个步骤:1. A1:把右表表达式(<right_table_expression>)应用到左表(<left_table_expression>)输入的行;2. A2:添加外部行; 使用apply就像是先计算左输入,让后为左输入中的每一行计算一次右输入。(这一句很重要,可能会不理解,但要先记住,后面会有详细的说明)最后结合以上两个步骤说明cross apply和outer apply的区别: cross apply和outer apply 总是包含步骤A1,只有outer apply包含步骤A2,如果cross apply左行应用右表表达式时返回空积,则不返回该行。而outer apply返回改行,并且改行的右表表达式的属性为null。看到上面的解释或步骤大家可能还是一头的雾水,不知所云。下面用例子来说明:先建表一([dbo].[Customers] 字段说明:customerid -- 消费者id , city -- 所在城市):CREATE TABLE [dbo].[Customers](
[customerid] [char](5) NOT NULL, [city] [varchar](10) NOT NULL,PRIMARY KEY CLUSTERED ( [customerid] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]向表一插入数据:insert into dbo.Customers values('FISSA','Madrid');insert into dbo.Customers values('FRNDO','Madrid');insert into dbo.Customers values('KRLOS','Madrid');insert into dbo.Customers values('MRPHS','Zion');查询所插入的数据:select * from dbo.Customers结果如图:结果如图:
2). 通过查看sql 2008的帮助文档找到了CUBE 和 ROLLUP 之间的具体区别:
1. CUBE 生成的结果集显示了所选列中值的所有组合的聚合。2. 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 Chinese_PRC_CI_AS NULL, [numb] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL, [phone] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL, [FenShu] [int] NULL) ON [PRIMARY]向表插入数据:
insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','3223','1365255',80)insert into peopleinfo([name],numb,phone,fenshu) values ('李欢','322123','1',90)insert into peopleinfo([name],numb,phone,fenshu) values ('李名','3213112352','13152',56)insert into peopleinfo([name],numb,phone,fenshu) values ('李名','32132312','13342563',60)insert into peopleinfo([name],numb,phone,fenshu) values ('王华','3223','1365255',80)查询出插入的全部数据:select * from dbo.PeopleInfo结果如图:select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb --2,用group by 查询所有数据;
select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with cube --3,用with cube。这三种情况的比较
结果如图:select [name],numb,sum(fenshu) from dbo.PeopleInfo group by [name],numb with rollup --用with rollup。
结果如图:select [name],numb from dbo.PeopleInfo group by numb,[name] with rollup
select [name],numb,phone from dbo.PeopleInfo group by [name],numb,phone with rollup
结果如图:![](https://images2015.cnblogs.com/blog/812043/201703/812043-20170313143251807-963271416.jpg)
现在来看看grouping的实例:
SQL语句看看与with rollup的结合(与with cube的结合是一样的):select [name],numb,grouping(numb) from dbo.PeopleInfo group by [name],numb with rollup结果如图: