zoukankan      html  css  js  c++  java
  • ORACLE SQL:经典查询练手第三篇

      本文使用ORACLE自带的人力资源(HR)实例数据,本文所用表结构如下:
      HR.EMPLOYEES员工表结构如下:
      HR.DEPARTMENTS表结构如下:
      HR.REGIONS表结构如下:
      SQL> DESC HR.REGIONS;
      Name        Type         Nullable Default Comments
      ----------- ------------ -------- ------- --------
      REGION_ID   NUMBER
      REGION_NAME VARCHAR2(25) Y
      --------------------------------------------------------------------------------
      用SQL完成以下问题列表:
      1. 让SELECT TO_CHAR(SALARY,'L99,999.99') FROM HR.EMPLOYEES WHERE  ROWNUM < 5 输出结果的货币单位是¥和$。
      2. 列出前五位每个员工的名字,工资、涨薪后的的工资(涨幅为8%),以“元”为单位进行四舍五入。
      3. 找出谁是最高领导,将名字按大写形式显示。
      4. 找出First_Name 为David,Last_Name为Austin 的直接领导名字。
      5. First_Name 为Alexander,Last_Name为Hunold领导谁。(谁向David 报告)。
      6. 哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。
      7. 哪些员工和Chen(LAST_NAME)同部门。
      8. 哪些员工跟De Haan(LAST_NAME)做一样职位。
      9. 哪些员工跟Hall(LAST_NAME)不在同一个部门。
      10. 哪些员工跟William(FIRST_NAME)、Smith(LAST_NAME)做不一样的职位。
      11. 显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称。
      12. 显示Executive部门有哪些职位。
      13. 整个公司中,最高工资和最低工资相差多少。
      14. 提成大于0 的人数。
      15. 显示整个公司的最高工资、最低工资、工资总和、平均工资保留到整数位。
      16. 整个公司有多少个领导。
      17. 列出在同一部门入职日期晚但工资高于其他同事的员工:名字、工资、入职日期。
      各试题解答如下(欢迎大家指出不同的方法或建议!):
      /*--------1、改变NLS_LANG 的值,让SELECT TO_CHAR(SALARY,'L99,999.99') FROM HR.EMPLOYEES WHERE ROWNUM < 5 输出结果的货币单位是¥和$。---------*/
      -----在没有设置NLS_LANG的情况下:
      SQL> SELECT TO_CHAR(SALARY,'L99,999.99')
      2  FROM HR.EMPLOYEES
      3  WHERE ROWNUM < 5;
      TO_CHAR(SALARY,'L99,999.99')
      ----------------------------
      ¥24,000.00
      ¥20,000.00
      ¥20,000.00
      ¥9,000.00
      SQL> SELECT TO_CHAR(SALARY,'$99,999.99')
      2  FROM HR.EMPLOYEES
      3  WHERE ROWNUM < 5;
      TO_CHAR(SALARY,'$99,999.99')
      ----------------------------
      $24,000.00
      $20,000.00
      $20,000.00
      $9,000.00
      /*--说明:对于'$99,999.99'格式符:
      L:表示强制显示当地货币符号
      $: 表示显示美元符号
      9: 表示一个数字
      0: 表示强制0显示
      .: 表示一个小数点
      ,: 表示一个千位分隔符
      --------------*/
      /*--------2、列出前五位每个员工的名字,工资、涨薪后的的工资(涨幅为8%),以“元”为单位进行四舍五入。---------*/
      SQL> SELECT FIRST_NAME,SALARY,ROUND(SALARY * 1.08) FROM HR.EMPLOYEES
      2  WHERE ROWNUM <=5;
      FIRST_NAME               SALARY ROUND(SALARY*1.08)
      -------------------- ---------- ------------------
      Steven                 24000.00              25920
      Neena                  20000.00              21600
      Lex                    20000.00              21600
      Alexander               9000.00               9720
      Bruce                   6000.00               6480
      /*--------3、找出谁是最高领导,将名字按大写形式显示。---------*/
      SQL> SELECT UPPER(FIRST_NAME || ' ' || LAST_NAME) AS NAME
      2  FROM HR.EMPLOYEES
      3  WHERE MANAGER_ID IS NULL;
      NAME
      ----------------------------------------------
      STEVEN KING
      /*--------4、找出David 的直接领导的名字。---------*/
      SQL> SELECT UPPER(FIRST_NAME ||' ' || LAST_NAME) AS NAME
      2  FROM HR.EMPLOYEES
      3  WHERE EMPLOYEE_ID IN(
      4  SELECT MANAGER_ID FROM HR.EMPLOYEES
      5  WHERE FIRST_NAME = 'David' AND LAST_NAME = 'Austin');
      NAME
      ----------------------------------------------
      ALEXANDER HUNOLD
      --或采用以下方法
      SQL> SELECT UPPER( EMP1.FIRST_NAME ||' ' ||  EMP1.LAST_NAME) AS NAME
      2  FROM HR.EMPLOYEES EMP1,HR.EMPLOYEES EMP2
      3  WHERE EMP1.EMPLOYEE_ID = EMP2.MANAGER_ID
      4  AND EMP2.FIRST_NAME = 'David' AND EMP2.LAST_NAME =  'Austin';
      NAME
      ----------------------------------------------
      ALEXANDER HUNOLD
      /*--------5、First_Name 为Alexander,LAST_NAME为Hunold领导谁。(谁向David 报告)。---------*/
      SQL> SELECT UPPER(FIRST_NAME ||' ' || LAST_NAME) AS NAME
      2  FROM HR.EMPLOYEES
      3  WHERE MANAGER_ID IN(
      4  SELECT EMPLOYEE_ID FROM HR.EMPLOYEES
      5  WHERE FIRST_NAME = 'Alexander' AND LAST_NAME = 'Hunold');
      NAME
      ----------------------------------------------
      BRUCE ERNST
      DAVID AUSTIN
      VALLI PATABALLA
      DIANA LORENTZ
      --或采用以下方法
      SQL> SELECT UPPER( EMP1.FIRST_NAME || ' ' ||  EMP1.LAST_NAME) AS NAME
      2  FROM HR.EMPLOYEES EMP1,HR.EMPLOYEES EMP2
      3  WHERE EMP1.MANAGER_ID = EMP2.EMPLOYEE_ID
      4  AND EMP2.FIRST_NAME = 'Alexander' AND EMP2.LAST_NAME =  'Hunold';
      NAME
      ----------------------------------------------
      BRUCE ERNST
      DAVID AUSTIN
      VALLI PATABALLA
      DIANA LORENTZ
      /*--------6、哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。---------*/
      SQL> SELECT E.FIRST_NAME,E.SALARY,M.FIRST_NAME,M.SALARY
      2  FROM EMPLOYEES E,EMPLOYEES M
      3  WHERE E.MANAGER_ID = M.EMPLOYEE_ID AND E.SALARY > M.SALARY;
      FIRST_NAME               SALARY FIRST_NAME               SALARY
      -------------------- ---------- -------------------- ----------
      Lisa                   11500.00 Gerald                 11000.00
      Ellen                  11000.00 Eleni                  10500.00
      --要是只列出员工的名字与工资的话,还可以这样:
      SQL> SELECT E.FIRST_NAME,E.SALARY
      2  FROM EMPLOYEES E WHERE E.SALARY >
      3 (SELECT M.SALARY FROM EMPLOYEES M
      4  WHERE E.MANAGER_ID = M.EMPLOYEE_ID);
      FIRST_NAME               SALARY
      -------------------- ----------
      Lisa                   11500.00
      Ellen                  11000.00
      /*--------7、哪些员工和Chen(LAST_NAME)同部门。---------*/
      SQL> SELECT FIRST_NAME FROM EMPLOYEES
      2  WHERE DEPARTMENT_ID IN
      3  (SELECT DEPARTMENT_ID FROM EMPLOYEES WHERE LAST_NAME = 'Chen')
      4  AND LAST_NAME <> 'Chen';
      FIRST_NAME
      --------------------
      Nancy
      Daniel
      Ismael
      Jose Manuel
      Luis
      --或者--
      SQL> SELECT E1.FIRST_NAME FROM EMPLOYEES E1,EMPLOYEES E2
      2  WHERE E1.DEPARTMENT_ID = E2.DEPARTMENT_ID
      3  AND E2.LAST_NAME = 'Chen' AND E1.LAST_NAME <> 'Chen';
      FIRST_NAME
      --------------------
      Nancy
      Daniel
      Ismael
      Jose Manuel
      Luis
      /*--------8、哪些员工跟De Haan(LAST_NAME)做一样职位。---------*/
      SQL> SELECT FIRST_NAME FROM EMPLOYEES
      2  WHERE JOB_ID IN
      3  (SELECT JOB_ID FROM EMPLOYEES
      4  WHERE LAST_NAME = 'De Haan')
      5  AND LAST_NAME <> 'De Haan';
      FIRST_NAME
      --------------------
      Neena
      --或者--
      SQL> SELECT E1.FIRST_NAME FROM EMPLOYEES E1,EMPLOYEES E2
      2  WHERE E1.JOB_ID = E2.JOB_ID
      3  AND E2.LAST_NAME = 'De Haan' AND E1.LAST_NAME <> 'De Haan';
      FIRST_NAME
      --------------------
      Neena
      /*--------9、哪些员工跟Hall(LAST_NAME)不在同一个部门。---------*/
      SQL> SELECT FIRST_NAME || ' ' || LAST_NAME FROM HR.EMPLOYEES
      2  WHERE DEPARTMENT_ID NOT IN(
      3  SELECT DEPARTMENT_ID FROM HR.EMPLOYEES
      4  WHERE LAST_NAME = 'Hall');
      FIRST_NAME||''||LAST_NAME
      ----------------------------------------------
      Steven King
      Neena Kochhar
      Lex De Haan
      Alexander Hunold
      Bruce Ernst
      David Austin
      Valli Pataballa
      Diana Lorentz
      Nancy Greenberg
      --...初始有72条数据
      --或者:
      SQL> SELECT e1.FIRST_NAME FROM EMPLOYEES e1,EMPLOYEES e2
      2  WHERE e1.DEPARTMENT_ID = e2.DEPARTMENT_ID(+)
      3  and e2.LAST_NAME(+) = 'Hall'
      4  and e2.LAST_NAME IS NULL;
      /*-------10、哪些员工跟William(FIRST_NAME)、Smith(LAST_NAME)做不一样的职位。--------*/
      SQL> SELECT FIRST_NAME || ' ' || LAST_NAME FROM HR.EMPLOYEES
      2  WHERE JOB_ID <> (SELECT DISTINCT JOB_ID FROM EMPLOYEES
      3  WHERE FIRST_NAME = 'William' AND LAST_NAME = 'Smith');
      FIRST_NAME||''||LAST_NAME
      ----------------------------------------------
      Steven King
      Neena Kochhar
      Lex De Haan
      Alexander Hunold
      ----...初始有77条数据
      --------------------------------------------------------------------------------
      /*--------11、显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称。---------*/
      SQL> SELECT E.FIRST_NAME || ' ' || E.LAST_NAME AS NAME,
      2  E.COMMISSION_PCT,D.DEPARTMENT_NAME,L.CITY
      3  FROM HR.EMPLOYEES E,HR.DEPARTMENTS D,HR.LOCATIONS L
      4  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
      5  AND D.LOCATION_ID = L.LOCATION_ID
      6  AND E.COMMISSION_PCT IS NOT NULL;
      /*--------12、显示Executive部门有哪些职位。---------*/
      SQL> SELECT DISTINCT E.JOB_ID FROM HR.EMPLOYEES E,HR.DEPARTMENTS D
      2  WHERE D.DEPARTMENT_ID = E.DEPARTMENT_ID
      3  AND D.DEPARTMENT_NAME = 'Executive';
      JOB_ID
      ----------
      AD_PRES
      AD_VP
      /*--------13、整个公司中,最高工资和最低工资相差多少。---------*/
      SQL> SELECT MAX(SALARY) - MIN(SALARY) FROM HR.EMPLOYEES;
      MAX(SALARY)-MIN(SALARY)
      -----------------------
      21900
      /*--------14、提成大于0 的人数。---------*/
      SQL> SELECT COUNT(*) AS 提成大小0的人数 FROM HR.EMPLOYEES
      2  WHERE COMMISSION_PCT > 0;
      提成大小0的人数
      ---------------
      35
      --或者
      SQL> SELECT COUNT(COMMISSION_PCT) AS 提成大小0的人数
      2   FROM HR.EMPLOYEES
      3   WHERE COMMISSION_PCT > 0;
      提成大小0的人数
      ---------------
      35
      /*--------15、显示整个公司的最高工资、最低工资、工资总和、平均工资保留到整数位。---------*/
      SQL> SELECT MAX(NVL(SALARY,0)) AS 最高工资,
      2           MIN(NVL(SALARY,0)) AS 最低工资,
      3           SUM(NVL(SALARY,0)) AS 工资总和,
      4           ROUND(AVG(NVL(SALARY,0))) AS 平均工资
      5  FROM HR.EMPLOYEES;
      最高工资       最低工资       工资总和       平均工资
      ----------    ----------      ----------     ---------
      24000          2100           698011         6523
      /*--------16、整个公司有多少个领导。---------*/
      SQL> SELECT COUNT(DISTINCT(MANAGER_ID))  FROM HR.EMPLOYEES
      2  WHERE MANAGER_ID IS NOT NULL;
      COUNT(DISTINCT(MANAGER_ID))
      ---------------------------
      18
      /*--------17、列出在同一部门入职日期晚但工资高于其他同事的员工:
      名字、工资、入职日期。---------*/
      SQL> SELECT DISTINCT E1.FIRST_NAME || ' ' || E1.LAST_NAME AS 姓名,
      2         E1.SALARY AS 工资,E1.HIRE_DATE AS 入职日期
      3  FROM HR.EMPLOYEES E1,HR.EMPLOYEES E2
      4  WHERE E1.DEPARTMENT_ID = E2.DEPARTMENT_ID
      5  AND E1.HIRE_DATE > E2.HIRE_DATE
      6  AND E1.SALARY > E2.SALARY
      7  ORDER BY 工资 DESC;
      姓名                                                   工资 入职日期
      ---------------------------------------------- ---------- -----------
      John Russell                                     14000.00 1996-10-1
      Karen Partners                                   13500.00 1997-1-5
      Alberto Errazuriz                                12000.00 1997-3-10
      Nancy Greenberg                                  12000.00 1994-8-17
      Lisa Ozer                                        11500.00 1997-3-11
      Ellen Abel                                       11000.00 1996-5-11
      Gerald Cambrault                                 11000.00 1999-10-15
      Clara Vishney                                    10500.00 1997-11-11
      Eleni Zlotkey                                    10500.00 2000-1-29
      Harrison Bloom                                   10000.00 1998-3-23
      Peter Tucker                                     10000.00 1997-1-30
      Tayler Fox                                        9600.00 1998-1-24
      Danielle Greene                                   9500.00 1999-3-19
      David Bernstein                                   9500.00 1997-3-24
      Peter Hall                                        9000.00 1997-8-20
      Alyssa Hutton                                     8800.00 1997-3-19
      Jonathon Taylor                                   8600.00 1998-3-24
      Adam Fripp                                        8200.00 1997-4-10
      Christopher Olsen                                 8000.00 1998-3-30
      Jack Livingston                                   8000.00 1998-4-23
      Matthew Weiss                                     8000.00 1996-7-18
      Jose Manuel Urman                                 7800.00 1998-3-7
      Nanette Cambrault                                 7500.00 1998-12-9
      William Smith                                     7400.00 1999-2-23
      Elizabeth Bates                                   7300.00 1999-3-24
      Charles Johnson                                   7211.00 2000-1-4
      Mattea Marvins                                    7200.00 2000-1-24
      Shanta Vollman                                    6500.00 1997-10-10
      Kevin Mourgos                                     5800.00 1999-11-16
      Nandita Sarchand                                  4200.00 1996-1-27
      Alexis Bull                                       4100.00 1997-2-20
      Sarah Bell                                        4000.00 1996-2-4
      Britney Everett                                   3900.00 1997-3-3
      Kelly Chung                                       3800.00 1997-6-14
      Jennifer Dilly                                    3600.00 1997-8-13
      Julia Dellinger                                   3400.00 1998-6-24
      Laura Bissot                                      3300.00 1997-8-20
      Julia Nayer                                       3200.00 1997-7-16
      Samuel McCain                                     3200.00 1998-7-1
      Stephen Stiles                                    3200.00 1997-10-26
      Winston Taylor                                    3200.00 1998-1-24
      Alana Walsh                                       3100.00 1998-4-24
      Jean Fleaur                                       3100.00 1998-2-23
      Anthony Cabrio                                    3000.00 1999-2-7
      Kevin Feeney                                      3000.00 1998-5-23
      Michael Rogers                                    2900.00 1998-8-26
      Shelli Baida                                      2900.00 1997-12-24
      Timothy Gates                                     2900.00 1998-7-11
      Girard Geoni                                      2800.00 2000-2-3
      Mozhe Atkinson                                    2800.00 1997-10-30
      Vance Jones                                       2800.00 1999-3-17
      Irene Mikkilineni                                 2700.00 1998-9-28
      John Seo                                          2700.00 1998-2-12
      Donald OConnell                                   2600.00 1999-6-21
      Douglas Grant                                     2600.00 2000-1-13
      Randall Matos                                     2600.00 1998-3-15
      Martha Sullivan                                   2500.00 1999-6-21
      Randall Perkins                                   2500.00 1999-12-19
      Ki Gee                                            2400.00 1999-12-12
      Hazel Philtanker                                  2200.00 2000-2-6
      Steven Markle                                     2200.00 2000-3-8
      61 rows selected

  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/soundcode/p/2100807.html
Copyright © 2011-2022 走看看