[强烈推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!)

简介:

 [推荐]ORACLE SQL

经典查询练手第四篇(不懂装懂,永世饭桶!)

 

——通过知识共享树立个人品牌。

 

本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!

 接上三篇:

[推荐]ORACLE SQL:经典查询练手第一篇

[推荐]ORACLE SQL:经典查询练手第二篇

[推荐]ORACLE SQL:经典查询练手第三篇

本篇数据查询属于复杂业务,难度比较高,请继续努力,通过我为大家设立的这个系列,循序渐进,只要你对每一篇,每一个试题都实践测试,认真练习。我相信你对常用、经典的、复杂的SQL已能熟能生巧,信手拈来!

 


 

本文使用ORACLE自带的人力资源(HR)实例数据,本文所用表结构如下:

表名:REGIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

REGION_ID

NUMBER

 

 

 

 

 

2

REGION_NAME

VARCHAR2

25

 

 

 

 

 

 

表名:COUNTRIES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

COUNTRY_ID

CHAR

2

 

 

 

 

2

COUNTRY_NAME

VARCHAR2

40

 

 

 

 

 

3

REGION_ID

NUMBER

 

 

 

 

 

 

表名:LOCATIONS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

LOCATION_ID

NUMBER

4

0

 

 

 

2

STREET_ADDRESS

VARCHAR2

40

 

 

 

 

 

3

POSTAL_CODE

VARCHAR2

12

 

 

 

 

 

4

CITY

VARCHAR2

30

 

 

 

 

 

5

STATE_PROVINCE

VARCHAR2

25

 

 

 

 

 

6

COUNTRY_ID

CHAR

2

 

 

 

 

 

表名:DEPARTMENTS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

DEPARTMENT_ID

NUMBER

4

0

 

 

 

2

DEPARTMENT_NAME

VARCHAR2

30

 

 

 

 

 

3

MANAGER_ID

NUMBER

6

0

 

 

 

 

4

LOCATION_ID

NUMBER

4

0

 

 

 

 

表名:JOBS

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

JOB_ID

VARCHAR2

10

 

 

 

 

2

JOB_TITLE

VARCHAR2

35

 

 

 

 

 

3

MIN_SALARY

NUMBER

6

0

 

 

 

 

4

MAX_SALARY

NUMBER

6

0

 

 

 

 

表名:EMPLOYEES

序号

列名

数据类型

长度

小数位

标识

主键

允许空

默认值

说明

1

EMPLOYEE_ID

NUMBER

6

0

 

 

 

2

FIRST_NAME

VARCHAR2

20

 

 

 

 

 

3

LAST_NAME

VARCHAR2

25

 

 

 

 

 

4

EMAIL

VARCHAR2

25

 

 

 

 

 

5

PHONE_NUMBER

VARCHAR2

20

 

 

 

 

 

6

HIRE_DATE

DATE

7

 

 

 

 

 

7

JOB_ID

VARCHAR2

10

 

 

 

 

 

8

SALARY

NUMBER

8

2

 

 

 

 

9

COMMISSION_PCT

NUMBER

2

2

 

 

 

 

10

MANAGER_ID

NUMBER

6

0

 

 

 

 

11

DEPARTMENT_ID

NUMBER

4

0

 

 

 

 

 

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 
12 rows selected

--或者--

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
 
11 rows selected
--可以看到,这种方式,对于部门号为空的没有统计出来

/*--------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 的员工名字。---------*/

SQL
> SELECT FIRST_NAME || ' ' || LAST_NAME AS NAME,SALARY
   
2  FROM EMPLOYEES
   
3  WHERE DEPARTMENT_ID IN
   
4        (SELECT DEPARTMENT_ID FROM EMPLOYEES
   
5         GROUP BY DEPARTMENT_ID
   
6         HAVING AVG(SALARY) > 5000);
 
NAME                                               SALARY
---------------------------------------------- ----------
Michael Hartstein                                13000.00
Pat Fay                                           
6000.00
Susan Mavris                                      
6500.00
Alexander Hunold                                  
9000.00
Bruce Ernst                                       
6000.00
David Austin                                      
4800.00
Valli Pataballa                                   
4800.00
Diana Lorentz                                     
4200.00
Hermann Baer                                     
10000.00
John Russell                                     
14000.00
Karen Partners                                   
13500.00
Alberto Errazuriz                                
12000.00
Gerald Cambrault                                 
11000.00
Eleni Zlotkey                                    
10500.00
Peter Tucker                                     
10000.00
David Bernstein                                   
9500.00
Peter Hall                                        
9000.00
Christopher Olsen                                 
8000.00
Nanette Cambrault                                 
7500.00
Oliver Tuvault                                    
7000.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
 
11 rows selected

/*--------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,如需转载请自行联系原作者

相关文章
|
2天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之在 DataWorks 中,使用Oracle作为数据源进行数据映射和查询,如何更改数据源为MaxCompute或其他类型
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
19 1
|
3天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
|
3天前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之在sql 里嵌套查询时,查询条件带有instr时报错,如何解决
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
|
8天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
13天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标自定义异常:数据探险家的“专属警示灯”
【4月更文挑战第19天】Oracle PL/SQL中的游标自定义异常是处理数据异常的有效工具,犹如数据探险家的警示灯。通过声明异常名(如`LOW_SALARY_EXCEPTION`)并在满足特定条件(如薪资低于阈值)时使用`RAISE`抛出异常,能灵活应对复杂业务规则。示例代码展示了如何在游标操作中定义和捕获自定义异常,提升代码可读性和维护性,确保在面对数据挑战时能及时响应。掌握自定义异常,让数据管理更从容。
|
13天前
|
SQL Oracle 安全
Oracle的PL/SQL游标异常处理:从“惊涛骇浪”到“风平浪静”
【4月更文挑战第19天】Oracle PL/SQL游标异常处理确保了在数据操作中遇到的问题得以优雅解决,如`NO_DATA_FOUND`或`TOO_MANY_ROWS`等异常。通过使用`EXCEPTION`块捕获并处理这些异常,开发者可以防止程序因游标问题而崩溃。例如,当查询无结果时,可以显示定制的错误信息而不是让程序终止。掌握游标异常处理是成为娴熟的Oracle数据管理员的关键,能保证在复杂的数据环境中稳健运行。
|
13天前
|
SQL Oracle 安全
Oracle的PL/SQL异常处理方法:守护数据之旅的“魔法盾”
【4月更文挑战第19天】Oracle PL/SQL的异常处理机制是保障数据安全的关键。通过预定义异常(如`NO_DATA_FOUND`)和自定义异常,开发者能优雅地管理错误。异常在子程序中抛出后会向上传播,直到被捕获,提供了一种集中处理错误的方式。理解和善用异常处理,如同手持“魔法盾”,确保程序在面对如除数为零、违反约束等挑战时,能有效保护数据的完整性和程序的稳定性。
|
13天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL中FOR语句循环游标的奇幻之旅
【4月更文挑战第19天】在Oracle PL/SQL中,FOR语句与游标结合,提供了一种简化数据遍历的高效方法。传统游标处理涉及多个步骤,而FOR循环游标自动处理细节,使代码更简洁、易读。通过示例展示了如何使用FOR循环游标遍历员工表并打印姓名和薪资,对比传统方式,FOR语句不仅简化代码,还因内部优化提升了执行效率。推荐开发者利用这一功能提高工作效率。
|
SQL Oracle 关系型数据库
Oracle SQL优化之多表连接
Oracle SQL优化之多表连接
434 0
Oracle SQL优化之多表连接
|
SQL 关系型数据库 Oracle
ORACLE SQL优化之ORA-03150&ORA-02055&ORA-02063
                                                                                                             >   
4768 0

推荐镜像

更多