[推荐]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 的员工数量超过人的部门,显示部门名字、地区名称。

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

7. 哪些员工的工资,介于50号 80部门平均工资之间。

8. 所在部门平均工资高于5000 的员工名字。

9. 列出各个部门中工资最高的员工的信息:名字、部门号、工资。

10. 最高的部门平均工资是多少。

 

 

各试题解答如下(欢迎大家指出不同的方法或建议!):

 

/*--------1、各个部门平均、最大、最小工资、人数,按照部门号升序排列。---------*/

SQLSELECT DEPARTMENT_ID AS 部门号,AVG(SALARYAS 平均工资

  2         ,MAX(SALARYAS 最高工资,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的员工人数。---------*/

SQLSELECT 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、各个部门平均工资和人数,按照部门名字升序排列。---------*/

 

SQLSELECT DPTNAME,AVG(SALARY),COUNT(*) FROM

  2         (SELECT

  3             (SELECT DEPT.DEPARTMENT_NAME FROM DEPARTMENTS DEPT

  4             WHERE DEPT.DEPARTMENT_ID EMP.DEPARTMENT_IDDPTNAME,

  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

 

--或者--

 

SQLSELECT 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、列出每个部门中有同样工资的员工的统计信息,

  列出他们的部门号,工资,人数。---------*/

 

SQLSELECT 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 的员工数量超过人的部门,

显示部门名字、地区名称。---------*/

 

SQLSELECT 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、哪些员工的工资,高于整个公司的平均工资,

  列出员工的名字和工资(降序)。---------*/

 

SQLSELECT 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 部门平均工资之间。---------*/

 

SQLSELECT FIRST_NAME || ' ' || LAST_NAME AS NAME,SALARY

  2  FROM EMPLOYEES

  3  WHERE SALARY

  4  BETWEEN

  5      (SELECT AVG(SALARYFROM EMPLOYEES

  6       WHERE DEPARTMENT_ID 50)

   AND (SELECT AVG(SALARYFROM 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 的员工名字。---------*/

 

SQLSELECT 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、列出各个部门中工资最高的员工的信息:名字、部门号、工资。---------*/

 

SQLSELECT FIRST_NAME || ' ' || LAST_NAME AS NAME

   2         ,SALARY,DEPARTMENT_ID

   3  FROM EMPLOYEES

   4  WHERE (DEPARTMENT_ID,SALARYIN

   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、最高的部门平均工资是多少。---------*/

SQLSELECT MAX(AVGSALARY)

  2  FROM(SELECT DEPARTMENT_ID,AVG(SALARYAVGSALARY

  3    FROM EMPLOYEES

  4    GROUP BY DEPARTMENT_ID);

 

MAX(AVGSALARY)

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

21333.33333333

 

 本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321341,如需转载请自行联系原作者

相关文章
|
14天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
49 9
|
1月前
|
SQL 存储 人工智能
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
Vanna 是一个开源的 Python RAG(Retrieval-Augmented Generation)框架,能够基于大型语言模型(LLMs)为数据库生成精确的 SQL 查询。Vanna 支持多种 LLMs、向量数据库和 SQL 数据库,提供高准确性查询,同时确保数据库内容安全私密,不外泄。
125 7
Vanna:开源 AI 检索生成框架,自动生成精确的 SQL 查询
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
42 8
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
69 4
|
2月前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
|
2月前
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
184 10
|
2月前
|
SQL 关系型数据库 MySQL
|
3月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
229 64
|
29天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
90 11
|
2月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。

推荐镜像

更多