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

[推荐]ORACLE SQL

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

 

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

 

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

 接上两篇:

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

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

本篇相对上两篇来说难度有所增加,继续努力,通过我为大家设立的这个系列,只要你对每一篇,每一个试题都实践测试,认真练习。我相信你对常用、经典的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
复制代码

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值