您的位置:首页 > 数据库

sql cookbook笔录(二)

2015-11-10 15:09 246 查看

第七章 使用数字

7.1 计算平均值

avg函数计算会忽略null值,coalesce(sal,0)函数会返回值列表中,第一个不为null的数。如果这样做,平均值就会改变。

7.2 求最大值,最小值

出现在select列表中的列(不包括聚合函数列),都必须出现在group by 子句中。

7.4 求一个表的行数

使用count(*)  或者常量会把null的行也包含进来,如果count(sal)传入列名,会把这一列是null的行,忽略掉。

7.6 生成累计和

MySql使用标量子查询  查询语句中一定要按取值唯一的列连接,否则会有问题
select e.ename,e.sal,(select sum(d.sal) from emp d where
d.empno<=e.empno) as running_total

from emp e order by 3 。

7.7 生成累计积

计算各个列的积  
把上面函数中的sum函数   换成exp(sum(ln(d.sal)))  。

7.9 计算模式

模式就是出现次数最多的,考虑如下数据
sal
----
700
600
800
800
上面数据的模式就是800.
select sal from emp e group by sal having count(*) >= all(select count(*) from emp e group by sal)。

7.11 求总和的百分比

求特定列占总和的百分比,在sum函数中使用case,相当于条件查询一样。
SELECT sum(case WHEN idA=3 then money
end ) as dd,sum(money) from a
 这个查询可以查到ida为3
的money总和,也就是除数,后面的sum是所有的总和。
要得到占的百分比,可以这样做。
     select sum(case when idA=3 then monty end)/sum(monty) from a 把他们二个相除就好了。

7.12 计算中考虑null值

聚集函数会忽略null值,可以使用coalesce函数来取代是null值得列。得到正确的结果。

7.13 计算不包括最大值和最小值的均值

        select avg(sal) from emp where sal not in((select max(sal) from emp),(select min(sal) from emp))
上面的sql会把重复的最大值,最小值全部排除,如果只想排除一个最大值,最小值,可以在总和中
减去一个最大值,一个最小值,再求平均值。
select (sum(sal)-max(sal)-min(sal))/(count(*)-2) from emp
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql