[推薦]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
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> 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> SELECT DEPARTMENT_ID,COUNT(*) FROM EMPLOYEES
2 WHERE SALARY > 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> 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> 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> 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 <> 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> 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 > 1000
6 GROUP BY D.DEPARTMENT_NAME,L.CITY
7 HAVING COUNT(*) > 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> SELECT FIRST_NAME || ' ' || LAST_NAME,SALARY
2 FROM EMPLOYEES
3 WHERE SALARY > (
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> 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) > 5000);
Alexander Hunold 9000.00
David Bernstein 9500.00
Peter Hall 9000.00
--等54行資料…
/*--------9、列出各個部門中工資最高的員工的資訊:名字、部門号、工資。---------*/
SQL> 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> 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,如需轉載請自行聯系原作者