最近又看了下 sql完全手册,以前看过 但是老是记不住这些 sql语法和用法。现在把他写下来,希望以后用到时候不会忘记。

如果一点都记不起来 当然一些sql 技巧都无法展示。

首先说些基础的 group by 语句 它是进行分组 并且可以 分组求和。如果我们在一条语句中见到每位运动员的罚款总数和所有运动员的罚款总数。可能需要两次组合。然后用union 来连接。

例如 select playerno, sum(amount0) from penalties group by playerno

union select cast(null as signed integer), sum(amount0) from penalties

这样的话就比较繁琐,如果引入with rollup的话 就可以简化这样的语句。

with rollup 可以用在一个group by 从句中实现多个组合。 上面那条语句现在变为

select playerno,sum(amount) from penalties  group by playerno wth rollup

两个结果相同  结果表明  在已使用playerno组合后,另一次组合是需要的 --在这种情况下是对所有行。

说明:

group by 指定了表达式 E1,E2,E3,E4,那么执行的组合为[E1,e2,e3,e4],当我们使用 with rollup 规范的话 将组合成[e1,e2,e3,e4],[e1,e2,e3],[e1,e2],[e1]和[],

规范[]表示所有的行均组合到一个组中。

使用 with cube

如果上面那条语句添加with cube 语句 会出现这样的依[e1,e2,e3]为例,组合为[e1,e2,e3],[e1,e2],[e2,e3],[e1,e3],[e1],[e2],[e3]和[].

组合集

select  town ,min(birth_date) from players group be town

可以拓展成这样

select town,min(birth_date) from playerno group by grouping sets((town))

 

select town ,count(*) from players group by town union

select sex,cast(null as char ),count(*) from players group by sex order by 2,1

这样的两个分组求和 可以简化为

select town,count(*) from playerno group by grouping sets((town),(sex))

如果一个组合里面有一个表达式组成的话,可以省略括号。

group by grouping sets((e1,e2,e3))   [E1,E2,E3]

 使用 rollup 和cube 组合来简化 grouping sets

group by rollup(e1,e2)等于规范 group by grouping sets((e1,e2),e2,())

规范 rollup((sex,town),year(birth_date))将导致组合[sex,town,year(birth_date)],[sex,town] 和[]

规范 group by cube[e1,e2,e3]等于规范group by grouping sets((e1,e2,e3),(e1,e2),(e2,e3),(e3,e1),e1,e2,e3,())

暂时记录这么多

 

 

 posted on 2010-10-23 13:40  亮天使  阅读(1409)  评论(0编辑  收藏  举报