天天看點

[強烈推薦]ORACLE SQL:經典查詢練手第四篇(不懂裝懂,永世飯桶!)本文使用ORACLE自帶的人力資源(HR)執行個體資料,本文所用表結構如下:

 [推薦]ORACLE SQL:

經典查詢練手第四篇(不懂裝懂,永世飯桶!)

——通過知識共享樹立個人品牌。

本文與大家共同讨論與分享ORACLE SQL的一些常用經典查詢,歡迎大家補充,同時你認為有那些經典的也可分享出來。在本文中,對每一個問題,你要是認為有什麼更好的解決方法也歡迎你及時提出。交流與分享才能共同進步嘛,感謝!

 接上三篇:

<a href="http://www.cnblogs.com/huyong/archive/2011/06/03/2071228.html" target="_blank">[推薦]ORACLE SQL:經典查詢練手第一篇</a>

<a href="http://www.cnblogs.com/huyong/archive/2011/06/16/2082581.html" target="_blank">[推薦]ORACLE SQL:經典查詢練手第二篇</a>

<a href="http://www.cnblogs.com/huyong/archive/2011/06/20/2085137.html" target="_blank">[推薦]ORACLE SQL:經典查詢練手第三篇</a>

本篇資料查詢屬于複雜業務,難度比較高,請繼續努力,通過我為大家設立的這個系列,循序漸進,隻要你對每一篇,每一個試題都實踐測試,認真練習。我相信你對常用、經典的、複雜的SQL已能熟能生巧,信手拈來!

表名:REGIONS

序号

列名

資料類型

長度

小數位

辨別

主鍵

允許空

預設值

說明

1

REGION_ID

NUMBER

2

REGION_NAME

VARCHAR2

25

表名:COUNTRIES

COUNTRY_ID

CHAR

COUNTRY_NAME

40

3

表名:LOCATIONS

LOCATION_ID

4

STREET_ADDRESS

POSTAL_CODE

12

CITY

30

5

STATE_PROVINCE

6

表名:DEPARTMENTS

DEPARTMENT_ID

DEPARTMENT_NAME

MANAGER_ID

表名:JOBS

JOB_ID

10

JOB_TITLE

35

MIN_SALARY

MAX_SALARY

表名:EMPLOYEES

EMPLOYEE_ID

FIRST_NAME

20

LAST_NAME

EMAIL

PHONE_NUMBER

HIRE_DATE

DATE

7

8

SALARY

9

COMMISSION_PCT

11

ER圖:

用SQL完成以下問題清單:

/*---------------------------------------------

1. 各個部門平均、最大、最小工資、人數,按照部門号升序排列。

2. 各個部門中工資大于5000的員勞工數。

3. 各個部門平均工資和人數,按照部門名字升序排列。

4. 列出每個部門中有同樣工資的員工的統計資訊,列出他們的部門号,工資,人數。

5. 列出同部門中工資高于1000 的員工數量超過2 人的部門,顯示部門名字、地區名稱。

6. 哪些員工的工資,高于整個公司的平均工資,列出員工的名字和工資(降序)。

7. 哪些員工的工資,介于50号 和80号部門平均工資之間。

8. 所在部門平均工資高于5000 的員工名字。

9. 列出各個部門中工資最高的員工的資訊:名字、部門号、工資。

10. 最高的部門平均工資是多少。

---------------------------------------------*/

各試題解答如下(歡迎大家指出不同的方法或建議!):

/*--------1、各個部門平均、最大、最小工資、人數,按照部門号升序排列。---------*/

SQL&gt; SELECT DEPARTMENT_ID AS 部門号,AVG(SALARY) AS 平均工資

  2         ,MAX(SALARY) AS 最高工資,MIN(SALARY)  AS 最低工資

  3         ,COUNT(*) AS 人數

  4  FROM EMPLOYEES

  5  GROUP BY DEPARTMENT_ID

  6  ORDER BY DEPARTMENT_ID ASC;

   部門号       平均工資       最高工資       最低工資         人數

------         ----------         ----------         ----------         ----------

       10           4400               4400               4400                 1

    20          9500              13000           6000                  2

    30           4150              11000           2500                  6

    40           6500               6500               6500                  1

    50             3475.55555     8200               2100                 45

    60           5760               9000               4200                  5

    70          10000              10000              10000                  1

    80             8973.85294     14000           6100                 34

    90             21333.3333     24000              20000                  3

   100           8600              12000           6900                  6

   110          10150              12000           8300                  2

                7000               7000               7000                  1

12 rows selected

/*--------2、各個部門中工資大于5000的員勞工數。---------*/

SQL&gt; SELECT DEPARTMENT_ID,COUNT(*) FROM EMPLOYEES

   2  WHERE SALARY &gt; 5000

   3  GROUP BY DEPARTMENT_ID;

DEPARTMENT_ID   COUNT(*)

------------- ----------

           20          2

           30          1

           40          1

           50          5

           60          2

           70          1

           80         34

           90          3

          100          6

          110          2

                       1

11 rows selected

/*--------3、各個部門平均工資和人數,按照部門名字升序排列。---------*/

SQL&gt; SELECT DPTNAME,AVG(SALARY),COUNT(*) FROM

  2         (SELECT

  3             (SELECT DEPT.DEPARTMENT_NAME FROM DEPARTMENTS DEPT

  4             WHERE DEPT.DEPARTMENT_ID = EMP.DEPARTMENT_ID) DPTNAME,

  5             EMP.SALARY

  6  FROM EMPLOYEES EMP)

  7  GROUP BY DPTNAME

  8  ORDER BY DPTNAME;

DPTNAME                        AVG(SALARY)   COUNT(*)

------------------------------ ----------- ----------

Accounting                           10150          2

Administration                        4400          1

Executive                      21333.33333          3

Finance                               8600          6

Human Resources                       6500          1

IT                                    5760          5

Marketing                             9500          2

Public Relations                     10000          1

Purchasing                            4150          6

Sales                          8973.852941         34

Shipping                       3475.555555         45

                                      7000          1 

--或者--

SQL&gt; SELECT DEPT.DEPARTMENT_NAME,AVG(EMP.SALARY),COUNT(*)

   2  FROM EMPLOYEES EMP,DEPARTMENTS DEPT

   3  WHERE EMP.DEPARTMENT_ID = DEPT.DEPARTMENT_ID

   4  GROUP BY DEPT.DEPARTMENT_NAME

   5  ORDER BY DEPT.DEPARTMENT_NAME;

DEPARTMENT_NAME                AVG(EMP.SALARY)   COUNT(*)

------------------------------ --------------- ----------

Accounting                               10150          2

Administration                            4400          1

Executive                      21333.333333333          3

Finance                                   8600          6

Human Resources                           6500          1

IT                                        5760          5

Marketing                                 9500          2

Public Relations                         10000          1

Purchasing                                4150          6

Sales                          8973.8529411764         34

Shipping                       3475.5555555555         45

--可以看到,這種方式,對于部門号為空的沒有統計出來

/*--------4、列出每個部門中有同樣工資的員工的統計資訊,

  列出他們的部門号,工資,人數。---------*/

SQL&gt; SELECT EMP1.DEPARTMENT_ID,EMP1.SALARY,COUNT(*) CNT

   2  FROM   EMPLOYEES EMP1,EMPLOYEES EMP2

   3  WHERE  EMP1.DEPARTMENT_ID = EMP2.DEPARTMENT_ID AND

   4          EMP1.SALARY = EMP2.SALARY

   5          AND EMP1.EMPLOYEE_ID &lt;&gt; EMP2.EMPLOYEE_ID

   6  GROUP BY EMP1.DEPARTMENT_ID,EMP1.SALARY;

DEPARTMENT_ID     SALARY        CNT

------------- ---------- ----------

           50    2200.00          2

           50    2400.00          2

           50    2500.00         20

           50    2600.00          6

           50    2700.00          2

           50    2800.00          6

           50    2900.00          2

           50    3000.00          2

           50    3100.00          6

           50    3200.00         12

           50    3300.00          2

           50    3600.00          2

           60    4800.00          2

           80    7000.00          2

           80    7500.00          2

           80    8000.00          6

           80    9000.00          2

           80    9500.00          6

           80   10000.00          6

           80   10500.00          2 

           80   11000.00          2

           90   20000.00          2

22 rows selected

/*--------5、列出同部門中工資高于1000 的員工數量超過2 人的部門,

顯示部門名字、地區名稱。---------*/

SQL&gt; SELECT D.DEPARTMENT_NAME,L.CITY,COUNT(*)

   2  FROM EMPLOYEES E,DEPARTMENTS D,LOCATIONS L

   3  WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID AND

   4         D.LOCATION_ID   = L.LOCATION_ID    AND

   5         E.SALARY &gt; 1000

   6  GROUP BY D.DEPARTMENT_NAME,L.CITY

   7  HAVING COUNT(*) &gt; 2;

DEPARTMENT_NAME                CITY                             COUNT(*)

------------------------------ ------------------------------ ----------

IT                             Southlake                               5

Sales                          Oxford                                 34

Finance                        Seattle                                 6

Shipping                       South San Francisco                    45

Executive                      Seattle                                 3

Purchasing                     Seattle                                 6

6 rows selected

/*--------6、哪些員工的工資,高于整個公司的平均工資,

  列出員工的名字和工資(降序)。---------*/

SQL&gt; SELECT FIRST_NAME || ' ' || LAST_NAME,SALARY

   2  FROM EMPLOYEES

   3  WHERE SALARY &gt; (

   4        SELECT AVG(SALARY)

   5        FROM EMPLOYEES

   6        )

   7  ORDER BY SALARY DESC; 

FIRST_NAME||''||LAST_NAME                          SALARY

---------------------------------------------- ----------

Steven King                                      24000.00

Neena Kochhar                                    20000.00

Lex De Haan                                      20000.00

John Russell                                     14000.00

Karen Partners                                   13500.00

Michael Hartstein                                13000.00

Nancy Greenberg                                  12000.00

Alberto Errazuriz                                12000.00

Shelley Higgins                                  12000.00

Lisa Ozer                                        11500.00

Den Raphaely                                     11000.00

Gerald Cambrault                                 11000.00

Ellen Abel                                       11000.00

Eleni Zlotkey                                    10500.00

Clara Vishney                                    10500.00

Peter Tucker                                     10000.00

Janette King                                     10000.00

Harrison Bloom                                   10000.00

Hermann Baer                                     10000.00

Tayler Fox                                        9600.00

--共50條資料

/*--------7、哪些員工的工資,介于50号 和80号 部門平均工資之間。---------*/

SQL&gt; SELECT FIRST_NAME || ' ' || LAST_NAME AS NAME,SALARY

  2  FROM EMPLOYEES

  3  WHERE SALARY

  4  BETWEEN

  5      (SELECT AVG(SALARY) FROM EMPLOYEES

  6       WHERE DEPARTMENT_ID = 50)

  7  AND (SELECT AVG(SALARY) FROM EMPLOYEES

  8       WHERE DEPARTMENT_ID = 80);

NAME                                               SALARY

Bruce Ernst                                       6000.00

David Austin                                      4800.00

Valli Pataballa                                   4800.00

Diana Lorentz                                     4200.00

John Chen                                         8200.00

Ismael Sciarra                                    7700.00

Jose Manuel Urman                                 7800.00

Luis Popp                                         6900.00

Matthew Weiss                                     8000.00

Adam Fripp                                        8200.00

Payam Kaufling                                    7900.00

Shanta Vollman                                    6500.00

Kevin Mourgos                                     5800.00

Renske Ladwig                                     3600.00

Trenna Rajs                                       3500.00

Christopher Olsen                                 8000.00

Nanette Cambrault                                 7500.00

Oliver Tuvault                                    7000.00

Lindsey Smith                                     8000.00

Louise Doran                                      7500.00

Sarath Sewall                                     7000.00

Mattea Marvins                                    7200.00

David Lee                                         6800.00

Sundar Ande                                       6400.00

Amit Banda                                        6200.00

William Smith                                     7400.00

Elizabeth Bates                                   7300.00

Sundita Kumar                                     6100.00

Alyssa Hutton                                     8800.00

Jonathon Taylor                                   8600.00

Jack Livingston                                   8000.00

Kimberely Grant                                   7000.00

Charles Johnson                                   7211.00

Nandita Sarchand                                  4200.00

Alexis Bull                                       4100.00

Kelly Chung                                       3800.00

Jennifer Dilly                                    3600.00

Sarah Bell                                        4000.00

Britney Everett                                   3900.00

Jennifer Whalen                                   4400.00

Pat Fay                                           6000.00

Susan Mavris                                      6500.00

William Gietz                                     8300.00

43 rows selected

/*--------8、所在部門平均工資高于5000 的員工名字。---------*/

   3  WHERE DEPARTMENT_ID IN

   4        (SELECT DEPARTMENT_ID FROM EMPLOYEES

   5         GROUP BY DEPARTMENT_ID

   6         HAVING AVG(SALARY) &gt; 5000);

Alexander Hunold                                  9000.00

David Bernstein                                   9500.00

Peter Hall                                        9000.00

--等54行資料…

/*--------9、列出各個部門中工資最高的員工的資訊:名字、部門号、工資。---------*/

SQL&gt; SELECT FIRST_NAME || ' ' || LAST_NAME AS NAME

   2         ,SALARY,DEPARTMENT_ID

   3  FROM EMPLOYEES

   4  WHERE (DEPARTMENT_ID,SALARY) IN

   5        (SELECT DEPARTMENT_ID,MAX(SALARY)

   6         FROM EMPLOYEES

   7         GROUP BY DEPARTMENT_ID); 

NAME                                               SALARY DEPARTMENT_ID

---------------------------------------------- ---------- -------------

Jennifer Whalen                                   4400.00            10

Michael Hartstein                                13000.00            20

Den Raphaely                                     11000.00            30

Susan Mavris                                      6500.00            40

Adam Fripp                                        8200.00            50

Alexander Hunold                                  9000.00            60

Hermann Baer                                     10000.00            70

John Russell                                     14000.00            80

Steven King                                      24000.00            90

Nancy Greenberg                                  12000.00           100

Shelley Higgins                                  12000.00           110

/*--------10、最高的部門平均工資是多少。---------*/

SQL&gt; SELECT MAX(AVGSALARY)

  2  FROM(SELECT DEPARTMENT_ID,AVG(SALARY) AVGSALARY

  3    FROM EMPLOYEES

  4    GROUP BY DEPARTMENT_ID);

MAX(AVGSALARY)

--------------

21333.33333333

本文轉自yonghu86 51CTO部落格,原文連結:http://blog.51cto.com/yonghu/1321342,如需轉載請自行聯系原作者