CASE WHEN 和 DECODE() ,NVL() 的区别?
1、CASE WHEN 是SQL通用的条件判断写法 可以做条件判断 也可以做等值判断 。
2、DECODE() 函数是oracle特有的,主要做等值判断,结合其他函数使用也可以做简单的条件判断。
3、NVL() 是对空值进行判断并赋一个默认值 。
4、CASE WHEN 和 DECODE() 进行判断以后会产生一个新的列 ,而 NVL()函数不会产生新的列 。
SIGN(对参数计算结果进行判断)
结果 > 0 返回 1
结果 = 0 返回 0
结果 < 0 返回-1
WHERE 和 HAVING 的区别:
1、过滤条件的位置不同 WHERE 必须 放在 GROUP BY 前面 ,HAVING 必须 放在 GROUP BY 后面 。
2、执行顺序不同 。
3、WHERE 后面可以跟所有的过滤条件,除了 不能直接 跟聚合函数 。
4、HAVING 后面只能 跟 聚合函数 或者 分组的字段 。聚合函数可以在 HAVING 后面 直接当条件使用 。
去重的方法:
1、DISTINCT 对结果集去重
SELECT DISTINCT E.DEPTNO
FROM EMP E
2、GROUP BY 对分组字段去重
SELECT E.DEPTNO
FROM EMP E
GROUP BY E.DEPTNO
HAVING COUNT(*) >= 2
3、ROWID 通过物理地址去重,仅限 ORACLE 数据库 ,MAX(ROWID) 最新记录 ,MIN(ROWID) 原始记录 。
SELECT E.DEPTNO ,ROWID
FROM EMP E
WHERE ROWID IN (SELECT MIN(ROWID) FROM EMP GROUP BY DEPTNO)
4、UNION 集合运算去重
SELECT DEPTNO FROM EMP WHERE DEPTNO IN (10,30)
UNION
SELECT DEPTNO FROM DEPT ;
5、ROW_NUNBER() 分析函数去重
SELECT E.*
FROM (
SELECT DEPTNO , ROW_NUMBER()OVER(PARTITION BY DEPTNO ORDER BY DEPTNO) RN
FROM EMP
) E
WHERE E.RN = 1 ;
分析函数中三种排名方式 :
SAL ROW_NUMBER() DENSE_RANK() RANK()
5000 1 1 1
3000 2 2 2
3000 3 2 2
2000 4 3 4
1500 5 4 5
1500 6 4 5
1500 7 4 5
1000 8 5 8
END