oracle 高级查询案例

分页查询显示员工信息,显示员工号,姓名,月薪

每页显示四条记录,显示第二页的员工,按照月薪降序排列

SELECT R,EMPNO,ENAME,SAL
  2  FROM (SELECT ROWNUM R,EMPNO,ENAME,SAL
  3        FROM(SELECT ROWNUM,EMPNO,ENAME,SAL FROM EMP ORDER BY SAL DESC) E1
  4        WHERE ROWNUM<=8) E2
  5   WHERE R>=5;

         R      EMPNO ENAME             SAL
---------- ---------- ---------- ----------
         5       7698 BLAKE            2850
         6       7782 CLARK            2450
         7       7499 ALLEN            1600
         8       7844 TURNER           1500

找到员工表中薪水大于本部门平均薪水的员工

--EXPLAIN PLAN FOR
SELECT E.EMPNO,E.ENAME,E.SAL,D.AVGSAL
  2  FROM EMP E,(SELECT DEPTNO,AVG(SAL) AVGSAL FROM EMP GROUP BY DEPTNO) D
  3  WHERE E.DEPTNO=D.DEPTNO AND E.SAL>D.AVGSAL;

     EMPNO ENAME             SAL     AVGSAL
---------- ---------- ---------- ----------
      7499 ALLEN            1600 1566.66667
      7566 JONES            2975       2175
      7698 BLAKE            2850 1566.66667
      7788 SCOTT            3000       2175
      7839 KING             5000 2916.66667
      7902 FORD             3000       2175
--SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
--使用相关子查询更好,通过执行计划查询

按部门统计人数,按照如下格式输出(员工入职年份已知)

SELECT COUNT(*)  TOTAL,
  2           SUM(DECODE(TO_CHAR(hiredate,'YYYY'),'1981',1,0)) "1981",
  3           SUM(DECODE(TO_CHAR(hiredate,'YYYY'),'1980',1,0)) "1980",
  4   SUM(DECODE(TO_CHAR(hiredate,'YYYY'),'1982',1,0)) "1982",
  5   SUM(DECODE(TO_CHAR(hiredate,'YYYY'),'1987',1,0)) "1987"
  6* FROM EMP
  7  /

     TOTAL       1981       1980       1982       1987
---------- ---------- ---------- ---------- ----------
        14         10          1          1          2
SELECT
  2  (SELECT COUNT(*) FROM EMP) TOTAL,
  3  (SELECT COUNT(*) FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY')='1980') "1980",
  4  (SELECT COUNT(*) FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY')='1981') "1981",
  5  (SELECT COUNT(*) FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY')='1982') "1982",
  6  (SELECT COUNT(*) FROM EMP WHERE TO_CHAR(HIREDATE,'YYYY')='1987') "1987"
  7  FROM DUAL;

     TOTAL       1980       1981       1982       1987
---------- ---------- ---------- ---------- ----------
        14          1         10          1          2

练习

 DESC PM_CI
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 CI_ID                                     NOT NULL VARCHAR2(20)
 STU_IDS                                            VARCHAR2(100)
 DESC PM_STU
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 STU_ID                                    NOT NULL VARCHAR2(20)
 STU_NAME                                           VARCHAR2(20)
SELECT * FROM PM_CI;

CI_ID
--------------------
STU_IDS
--------------------------------------------------------------------------------
1
1,2,3,4

2
1,4
 SELECT * FROM PM_STU;

STU_ID               STU_NAME
-------------------- --------------------
1                    张三
2                    李四
3                    王五
4                    赵六
 SELECT  C.CI_ID AS ID,
  2  --LISTAGG(S.STU_NAME,',') WITHIN GROUP(ORDER BY S.STU_NAME) AS NAME
  3  TO_CHAR(WM_CONCAT(S.STU_NAME)) AS NAME
  4  FROM PM_CI C,PM_STU S
  5  WHERE INSTR(C.STU_IDS,S.STU_ID)>0
  6  GROUP BY C.CI_ID;

ID
--------------------
NAME
--------------------------------------------------------------------------------
1
张三,赵六,王五,李四

2
张三,赵六

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值