sql 语句系列(加减乘除与平均)[八百章之第十四章]

avg的注意事项

一张t2表:

select * from t2

select AVG(sal) from t2

得到的结果是:

本来我们得到的结果应该是10的。但是得到的结果确实15.

这是因为忽略了null值。

解决方案:

当为空的时候转换为0

select AVG(coalesce(sal,0)) from t2

max 与 min的注意事项

max与min会忽略null,但是如果全是null的情况,会返回null值。

select DEPTNO,max(COMM)
from EMP
where DEPTNO in (10,30)
group by DEPTNO

例如:

解决方法:

如上文

select DEPTNO,max(coalesce(COMM,0))
from EMP
where DEPTNO in (10,30)
group by DEPTNO

sum

sum 计算的时候会忽略null值。

如上:

解决:

select DEPTNO,sum(coalesce(COMM,0))
from EMP
where DEPTNO in (10,30)
group by DEPTNO

计算行数

通常我们计算行数,通常是使用count。

同样是会忽略null值:

select COUNT(*),count(COMM)
from EMP

累计和

要实现下面这种效果:

比如2600,是红框部分的和。

假设前两列的效果是:

select e.EMPNO, e.SAL
from EMP e
order by 1

要求写出第三列的效果。

答案:

select e.EMPNO, e.SAL,(select SUM(d.SAL) from EMP d where d.EMPNO<=e.EMPNO) as total
from EMP e
order by 3

累计乘

如何实现累计乘法?

有一个数学概念:

select e.EMPNO, e.SAL,(select  exp(sum(log(d.SAL))) from EMP d where d.EMPNO<=e.EMPNO and d.DEPTNO=e.DEPTNO ) as total
from EMP e
where DEPTNO=10
order by 3

累计差

分情况讨论,当是第一个直接输出第一个。后面的就是全部是负值相加然后加两个EMPNO最小值。

select e.EMPNO, e.SAL,(select  case when e.EMPNO=MIN(d.EMPNO) then sum(d.SAL)
else sum(-d.SAL)+(select f.SAL from emp f where f.EMPNO=MIN(d.EMPNO))*2
end from EMP d where d.EMPNO<=e.EMPNO and d.DEPTNO=e.DEPTNO ) as total
from EMP e
where DEPTNO=10
order by EMPNO

原文地址:https://www.cnblogs.com/aoximin/p/12617032.html

时间: 2024-11-10 09:09:27

sql 语句系列(加减乘除与平均)[八百章之第十四章]的相关文章

sql 语句系列(null 值处理)[八百章之第二章]

查找只存在一个表中的数据 有两张表: EMP: select * from emp DEPT: 他们有共同的属性:deptno 现在要查询EMP 中的deptno不等于DEPTNO的deptno项. 解析: select distinct DEPTNO from EMP where DEPTNO not in ( select DEPTNO from DEPT ) 注意: 因为需要查询的是DEPTNO,所以需要排除掉重复项. 其次上面的写法,如果DEPTNO在DEPT有null项上面的是错误的.

《深入浅出Mysql》——第十二章 存储过程和函数 + 第十三章 触发器 + 第十四章 事物控制和锁定语句

MySQL 从 5.0.2 版本开始支持触发器的功能.触发器是与表有关的数据库对象,在满足定义 条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端 确保数据的完整性. MySQL 从 5.0.3 开始支持分布式事务,当前分布式事务只支持 InnoDB 存储引擎.一个 分布式事务会涉及多个行动,这些行动本身是事务性的.所有行动都必须一起成功完成,或 者一起被回滚 分布式的关键在于如何确保分布式事务的完整性,以及在某个分支出现问题时的故障解 决. 原文地址:https:

sql 语句系列(字符串的遍历嵌入删除与统计)[八百章之第十一章]

遍历字符串 我觉得首先要提出一个疑问: 一个数据库本身就是用于存储的,遍历字符串究竟有何意义? 先看如何实现的,毕竟sql service 是没有for循环,也没有loop和while的. select SUBSTRING(e.ENAME,t.ID,1) as sub from emp e,T10 t where e.ENAME='JONES' and t.ID<=len(e.ENAME) 的确是遍历了这个字符串JONES. 原理也十分的简单: select * from T10 T10 可以看

sql 语句系列(众数中位数与百分比)[八百章之第十五章]

众数 众数就是出现最多的那个数. select sal,count(*) as cnt from emp where DEPTNO=20 group by sal 通过分组把他们的行数计算出来.那么最关键的部分在于,你如何知道最大值. 是的我们可以查出当前最大值,然后再取出最大值的sal.但是这肯定要用到两个临时视图. 注:我们不能通过排序cnt,然后取值第一个,因为可能存在相同的行数. 解决方案:通过dense_rank 进行排序. 科普一下概念: row_number的用途非常广泛,排序最好

sql 语句系列(闰年)[八百章之第十九章]

前言 判断闰年还是挺有用的. mysql select DAY(LAST_DAY(DATE_ADD(CURRENT_DATE,INTERVAL -DAYOFYEAR(CURRENT_DATE)+1+31 DAY))) as dy FROM T1 这个看起来有一点点复杂,其实拆开了还是很简单的. CURRENT_DATE 获取当前日期. DATE_ADD(CURRENT_DATE,INTERVAL -DAYOFYEAR(CURRENT_DATE)+1+31 DAY) 当前的日期,减去了从1月1号经

sql 语句系列(行与列处理)[八百章之第一章]

排序时对null进行处理 比如说: select * from EMP order by COMM 我需要对红框部分进行desc处理,也就是从大到小排列. 解析: 重点是如何让null独立出去. select * from (select *,case when COMM is null then 0 else 1 end as COMMISNULL from EMP ) x order by COMMISNULL,COMM desc 解法:单独列出一列把null独立出去. 注意null的判断是

sql 语句系列(用魔法打败魔法)[八百章之第十章]

前言 下面是一些常规的运维手段. 查询每个表的行数 SELECT a.name, a.object_id, b.rows, b.index_id FROM sys.tables AS a INNER JOIN sys.partitions AS b ON a.object_id = b.object_id WHERE b.index_id IN ( 0, 1 ); 哦,对了,对有些大神说,去新公司的时候执行一下这个代码,如果行数不够直接跑路. 后续列举的所有的更新都放在这里,运维相关的.持续更新

sql 语句系列(列举非索引外键)[八百章之第九章]

列举非索引外键 列举出那些外键没有添加索引. 目的: 1.减少锁. 2.外键添加索引,提示了查询性能,因为要与父表做连接查询做笛卡尔积. 下面只要会复制即可,没有会去从新写一遍的. select fkeys.table_name,fkeys.constraint_name,fkeys.column_name,ind_cols.index_name from ( select a.object_id,d.column_id,a.name table_name,b.name constraint_n

sql语句练习:找出平均工资小于5000的商店所在的城市

员工信息表 employee: user_id , name, store_id, salary 商店表stores:store_id, name,city 参考答案:select a.city from stores a,employee b where b.store_id=a.store_id group by b.store_id having avg(b.salary)<5000 原文地址:https://www.cnblogs.com/testertechnology/p/10980