Oracle学习笔记之子查询(二)

2015-11-10 12:17:22 · 作者: · 浏览: 10
统计这两组的总人数,


--思路:将需要被看做一组,但值又不同的那些数据,我们使用DECODE将他们改为相同的值即可。


SELECT DECODE(job,'MANAGER','VIP','ANALYST','VIP','OPERATIONS') NAME, COUNT(*) FROM emp


GROUP BY DECODE(job,'MANAGER','VIP','ANALYST','VIP','OPERATIONS');


SELECT deptno,dname FROM dept ORDER BY DECODE(dname,'OPERATIONS',1,'ACCPOUNTING',2,'SALES',3);


--按照部门分组,按照工资降序,产生组内连续唯一的数字:


SELECT ename,deptno,sal,ROW_NUMBER()OVER


(PARTITION BY deptno ORDER BY sal DESC)rank FROM emp;--rank函数与ROW_NUMBER的区别在于,进行排序的字段若值相同


--且他们在同一组时,那么他们得到的数字是相同的,但是,在下面的数字会有跳跃,RANK会生成组内不连续且不唯一的数字。


--DENSE_RANK()会产生一个连续唯一的


SELECT ename,deptno,sal, DENSE_RANK()OVER(PARTITION BY deptno ORDER BY sal DESC) rank FROM emp;


--集合操作中: 并集,将两个集合中的所有元素集合成一个集合 普通并集与全并集。


--全并集:会产生重复元素,两个集合都有的元素,会在合并后在新的集合中出现两次。


--交集:新的集合中只保留两个集合都有的元素


--差集:新的集合中只保存我有你没有的元素。


--差集


SELECT ename,job,sal FROM emp WHERE job ='MANAGER' MINUS SELECT ename,job,sal FROM emp WHERE sal>2500;


--普通并集


SELECT ename,job,sal FROM emp WHERE job ='MANAGER' UNION SELECT ename,job,sal FROM emp WHERE sal>2500;


--全并集


SELECT ename,job,sal FROM emp WHERE job ='MANAGER' UNION ALL SELECT ename,job,sal FROM emp WHERE sal>2500;


--交集


SELECT ename,job,sal FROM emp WHERE job ='MANAGER' INTERSECT SELECT ename,job,sal FROM emp WHERE sal>2500;


SELECT * FROM sales_tab;


SELECT year_id,month_id,day_id,SUM(sales_value) FROM SALES_TAB GROUP BY


GROUPING SETS((year_id,month_id,day_id),(year_id,month_id))


ORDER BY year_id,month_id,day_id;