您的位置:首页 > 数据库 > Oracle

Oracle SQL:经典查询练手第五篇

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

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

表名:REGIONS

[align=center]序号[/align]
[align=center]列名[/align]
[align=center]数据类型[/align]
[align=center]长度[/align]
[align=center]小数位[/align]
[align=center]标识[/align]
[align=center]主键[/align]
[align=center]允许空[/align]
[align=center]默认值[/align]
[align=center]说明[/align]
[align=left]1[/align]
[align=left]REGION_ID[/align]
[align=left]NUMBER[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2[/align]
[align=left]REGION_NAME[/align]
[align=left]VARCHAR2[/align]
[align=left]25[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
 

表名:COUNTRIES

[align=center]序号[/align]
[align=center]列名[/align]
[align=center]数据类型[/align]
[align=center]长度[/align]
[align=center]小数位[/align]
[align=center]标识[/align]
[align=center]主键[/align]
[align=center]允许空[/align]
[align=center]默认值[/align]
[align=center]说明[/align]
[align=left]1[/align]
[align=left]COUNTRY_ID[/align]
[align=left]CHAR[/align]
[align=left]2[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2[/align]
[align=left]COUNTRY_NAME[/align]
[align=left]VARCHAR2[/align]
[align=left]40[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]3[/align]
[align=left]REGION_ID[/align]
[align=left]NUMBER[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
表名:LOCATIONS

[align=center]序号[/align]
[align=center]列名[/align]
[align=center]数据类型[/align]
[align=center]长度[/align]
[align=center]小数位[/align]
[align=center]标识[/align]
[align=center]主键[/align]
[align=center]允许空[/align]
[align=center]默认值[/align]
[align=center]说明[/align]
[align=left]1[/align]
[align=left]LOCATION_ID[/align]
[align=left]NUMBER[/align]
[align=left]4[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left]是[/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2[/align]
[align=left]STREET_ADDRESS[/align]
[align=left]VARCHAR2[/align]
[align=left]40[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]3[/align]
[align=left]POSTAL_CODE[/align]
[align=left]VARCHAR2[/align]
[align=left]12[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]4[/align]
[align=left]CITY[/align]
[align=left]VARCHAR2[/align]
[align=left]30[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]5[/align]
[align=left]STATE_PROVINCE[/align]
[align=left]VARCHAR2[/align]
[align=left]25[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]6[/align]
[align=left]COUNTRY_ID[/align]
[align=left]CHAR[/align]
[align=left]2[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
表名:DEPARTMENTS

[align=center]序号[/align]
[align=center]列名[/align]
[align=center]数据类型[/align]
[align=center]长度[/align]
[align=center]小数位[/align]
[align=center]标识[/align]
[align=center]主键[/align]
[align=center]允许空[/align]
[align=center]默认值[/align]
[align=center]说明[/align]
[align=left]1[/align]
[align=left]DEPARTMENT_ID[/align]
[align=left]NUMBER[/align]
[align=left]4[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left]是[/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2[/align]
[align=left]DEPARTMENT_NAME[/align]
[align=left]VARCHAR2[/align]
[align=left]30[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]3[/align]
[align=left]MANAGER_ID[/align]
[align=left]NUMBER[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]4[/align]
[align=left]LOCATION_ID[/align]
[align=left]NUMBER[/align]
[align=left]4[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
表名:JOBS

[align=center]序号[/align]
[align=center]列名[/align]
[align=center]数据类型[/align]
[align=center]长度[/align]
[align=center]小数位[/align]
[align=center]标识[/align]
[align=center]主键[/align]
[align=center]允许空[/align]
[align=center]默认值[/align]
[align=center]说明[/align]
[align=left]1[/align]
[align=left]JOB_ID[/align]
[align=left]VARCHAR2[/align]
[align=left]10[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2[/align]
[align=left]JOB_TITLE[/align]
[align=left]VARCHAR2[/align]
[align=left]35[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]3[/align]
[align=left]MIN_SALARY[/align]
[align=left]NUMBER[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]4[/align]
[align=left]MAX_SALARY[/align]
[align=left]NUMBER[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
表名:EMPLOYEES

[align=center]序号[/align]
[align=center]列名[/align]
[align=center]数据类型[/align]
[align=center]长度[/align]
[align=center]小数位[/align]
[align=center]标识[/align]
[align=center]主键[/align]
[align=center]允许空[/align]
[align=center]默认值[/align]
[align=center]说明[/align]
[align=left]1[/align]
[align=left]EMPLOYEE_ID[/align]
[align=left]NUMBER[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left]是[/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]2[/align]
[align=left]FIRST_NAME[/align]
[align=left]VARCHAR2[/align]
[align=left]20[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]3[/align]
[align=left]LAST_NAME[/align]
[align=left]VARCHAR2[/align]
[align=left]25[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]4[/align]
[align=left]EMAIL[/align]
[align=left]VARCHAR2[/align]
[align=left]25[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]5[/align]
[align=left]PHONE_NUMBER[/align]
[align=left]VARCHAR2[/align]
[align=left]20[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]6[/align]
[align=left]HIRE_DATE[/align]
[align=left]DATE[/align]
[align=left]7[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]7[/align]
[align=left]JOB_ID[/align]
[align=left]VARCHAR2[/align]
[align=left]10[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] [/align]
[align=left]否[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]8[/align]
[align=left]SALARY[/align]
[align=left]NUMBER[/align]
[align=left]8[/align]
[align=left]2[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]9[/align]
[align=left]COMMISSION_PCT[/align]
[align=left]NUMBER[/align]
[align=left]2[/align]
[align=left]2[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]10[/align]
[align=left]MANAGER_ID[/align]
[align=left]NUMBER[/align]
[align=left]6[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]11[/align]
[align=left]DEPARTMENT_ID[/align]
[align=left]NUMBER[/align]
[align=left]4[/align]
[align=left]0[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]是[/align]
[align=left] [/align]
[align=left] [/align]
ER图:





用SQL完成以下问题列表:
哪些部门的人数比90 号部门的人数多。  
Den(FIRST_NAME)、Raphaely(LAST_NAME)的领导是谁(非关联子查询)。  
Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(非关联子查询)。  
Den(FIRST_NAME)、Raphaely(LAST_NAME) 的领导是谁(关联子查询)。  
Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(关联子查询)。  
列出在同一部门共事,入职日期晚但工资高于其他同事的员工:名字、工资、入职日期(关联子查询)。  
哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)不在同一个部门(非关联子查询)。  
哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)不在同一个部门(关联子查询)。  
Finance部门有哪些职位(非关联子查询)。  
Finance部门有哪些职位(关联子查询)。  

 
/*--------1、哪些部门的人数比90号部门的人数多。---------*/  
 
SQL> SELECT DEPARTMENT_ID,COUNT(*) FROM EMPLOYEES  
   2  GROUP BY DEPARTMENT_ID  
   3  HAVING COUNT(*) >  
   4         (SELECT COUNT(*) FROM EMPLOYEES  
   5          WHERE DEPARTMENT_ID = 90  
   6         );  
   
DEPARTMENT_ID   COUNT(*)  
------------- ----------  
           30          6  
           50         45  
           60          5  
           80         34  
          100          6  
 
/*-------2、Den(FIRST_NAME)、Raphaely(LAST_NAME)的  
领导是谁(非关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES  
   3  WHERE EMPLOYEE_ID =   
   4        (SELECT MANAGER_ID FROM EMPLOYEES  
   5         WHERE FIRST_NAME = 'Den' 
   6         AND   LAST_NAME  = 'Raphaely' 
   7        );  
   
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Steven King  
 
/*-------3、Den(FIRST_NAME)、Raphaely(LAST_NAME)领导谁(非关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES  
   3  WHERE MANAGER_ID IN 
   4        (SELECT EMPLOYEE_ID FROM EMPLOYEES  
   5         WHERE FIRST_NAME = 'Den' 
   6         AND   LAST_NAME  = 'Raphaely' 
   7        );  
   
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Alexander Khoo  
Shelli Baida  
Sigal Tobias  
Guy Himuro  
Karen Colmenares  
 
--或者  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES  
   3  WHERE MANAGER_ID =  
   4        (SELECT EMPLOYEE_ID FROM EMPLOYEES  
   5         WHERE FIRST_NAME = 'Den' 
   6         AND   LAST_NAME  = 'Raphaely' 
   7        );  
   
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Alexander Khoo  
Shelli Baida  
Sigal Tobias  
Guy Himuro  
Karen Colmenares  
 
/*-------4、Den(FIRST_NAME)、Raphaely(LAST_NAME)的领导是谁(关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES EMP1  
   3  WHERE EXISTS (  
   4        SELECT 1 FROM EMPLOYEES EMP2  
   5        WHERE FIRST_NAME = 'Den' 
   6        AND LAST_NAME  = 'Raphaely' 
   7        AND EMP2.MANAGER_ID = EMP1.EMPLOYEE_ID);  
   
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Steven King  
 
/*-------5、Den(FIRST_NAME)、Raphaely(LAST_NAME)领导谁(关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES EMP1  
   3  WHERE EXISTS (  
   4        SELECT 1 FROM EMPLOYEES EMP2  
   5        WHERE FIRST_NAME = 'Den' 
   6        AND LAST_NAME  = 'Raphaely' 
   7        AND EMP2.EMPLOYEE_ID = EMP1.MANAGER_ID);   
 
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Alexander Khoo  
Shelli Baida  
Sigal Tobias  
Guy Himuro  
Karen Colmenares 

 
/*-------6、列出在同一部门共事,入职日期晚但工资高于其他同事的员工:  
名字、工资、入职日期(关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME AS 姓名,  
   2          SALARY AS 工资,HIRE_DATE AS 入职日期  
   3  FROM EMPLOYEES EMP1  
   4  WHERE EXISTS (  
   5        SELECT 1 FROM EMPLOYEES EMP2  
   6        WHERE EMP2.DEPARTMENT_ID = EMP1.DEPARTMENT_ID  
  7        AND   EMP1.HIRE_DATE > EMP2.HIRE_DATE  
   8        AND   EMP1.SALARY    > EMP2.SALARY  
  9        );  
 
姓名                                                   工资 入职日期  
---------------------------------------------- ---------- -----------  
Nancy Greenberg                                  12000.00 1994-8-17  
Jose Manuel Urman                                 7800.00 1998-3-7  
Shelli Baida                                      2900.00 1997-12-24  
Adam Fripp                                        8200.00 1997-4-10  
Matthew Weiss                                     8000.00 1996-7-18  
Jennifer Dilly                                    3600.00 1997-8-13  
Julia Dellinger                                   3400.00 1998-6-24  
Laura Bissot                                      3300.00 1997-8-20  
Kevin Mourgos                                     5800.00 1999-11-16  
Shanta Vollman                                    6500.00 1997-10-10  
Vance Jones                                       2800.00 1999-3-17  
Anthony Cabrio                                    3000.00 1999-2-7  
Girard Geoni                                      2800.00 2000-2-3  
Douglas Grant                                     2600.00 2000-1-13  
Donald OConnell                                   2600.00 1999-6-21  
Randall Perkins                                   2500.00 1999-12-19  
Martha Sullivan                                   2500.00 1999-6-21  
Kevin Feeney                                      3000.00 1998-5-23  
Alana Walsh                                       3100.00 1998-4-24  
Samuel McCain                                     3200.00 1998-7-1  
Timothy Gates                                     2900.00 1998-7-11  
Jean Fleaur                                       3100.00 1998-2-23  
Winston Taylor                                    3200.00 1998-1-24  
Michael Rogers                                    2900.00 1998-8-26  
Britney Everett                                   3900.00 1997-3-3  
Kelly Chung                                       3800.00 1997-6-14  
Alexis Bull                                       4100.00 1997-2-20  
Randall Matos                                     2600.00 1998-3-15  
John Seo                                          2700.00 1998-2-12  
Stephen Stiles                                    3200.00 1997-10-26  
Mozhe Atkinson                                    2800.00 1997-10-30  
Irene Mikkilineni                                 2700.00 1998-9-28  
Julia Nayer                                       3200.00 1997-7-16  
Hazel Philtanker                                  2200.00 2000-2-6  
Ki Gee                                            2400.00 1999-12-12  
Steven Markle                                     2200.00 2000-3-8  
Sarah Bell                                        4000.00 1996-2-4  
Nandita Sarchand                                  4200.00 1996-1-27  
Lisa Ozer                                        11500.00 1997-3-11  
Clara Vishney                                    10500.00 1997-11-11  
Eleni Zlotkey                                    10500.00 2000-1-29   
Gerald Cambrault                                 11000.00 1999-10-15  
Alberto Errazuriz                                12000.00 1997-3-10  
Tayler Fox                                        9600.00 1998-1-24  
Harrison Bloom                                   10000.00 1998-3-23  
Danielle Greene                                   9500.00 1999-3-19  
Charles Johnson                                   7211.00 2000-1-4  
Mattea Marvins                                    7200.00 2000-1-24  
Ellen Abel                                       11000.00 1996-5-11  
Karen Partners                                   13500.00 1997-1-5  
John Russell                                     14000.00 1996-10-1  
Peter Tucker                                     10000.00 1997-1-30  
David Bernstein                                   9500.00 1997-3-24  
Jonathon Taylor                                   8600.00 1998-3-24  
Alyssa Hutton                                     8800.00 1997-3-19  
Peter Hall                                        9000.00 1997-8-20  
Jack Livingston                                   8000.00 1998-4-23  
Christopher Olsen                                 8000.00 1998-3-30  
Elizabeth Bates                                   7300.00 1999-3-24  
William Smith                                     7400.00 1999-2-23  
Nanette Cambrault                                 7500.00 1998-12-9  
   
61 rows selected  
 
/*-------7、哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)  
不在同一个部门(非关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
  2  FROM EMPLOYEES  
   3  WHERE DEPARTMENT_ID <>  
  4        (SELECT DEPARTMENT_ID FROM EMPLOYEES  
   5         WHERE FIRST_NAME = 'Den' 
  6         AND LAST_NAME  = 'Raphaely' 
  7        );  
   
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Steven King  
Neena Kochhar  
Lex De Haan  
Alexander Hunold  
Bruce Ernst  
David Austin  
Valli Pataballa  
--等等  
 
--或者  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES  
   3  WHERE DEPARTMENT_ID NOT IN 
   4        (SELECT DEPARTMENT_ID FROM EMPLOYEES  
   5         WHERE FIRST_NAME = 'Den' 
   6         AND LAST_NAME  = 'Raphaely' 
   7        );  
 
/*-------8、哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)  
不在同一个部门(关联子查询)。---------*/  
 
SQL> SELECT FIRST_NAME || ' ' || LAST_NAME  
   2  FROM EMPLOYEES EMP1  
   3  WHERE NOT EXISTS (  
   4        SELECT 1 FROM EMPLOYEES EMP2  
   5        WHERE EMP1.DEPARTMENT_ID = EMP2.DEPARTMENT_ID  
   6        AND EMP2.FIRST_NAME =  'Den' 
   7        AND EMP2.LAST_NAME  =  'Raphaely');  
   
FIRST_NAME||''||LAST_NAME  
----------------------------------------------  
Kimberely Grant 
Lex De Haan  
Neena Kochhar  
Steven King  
Pat Fay  
Michael Hartstein  
Diana Lorentz  
Valli Pataballa  
--等等  
 
/*-------9、Finance部门有哪些职位(非关联子查询)。---------*/  
 
SQL> SELECT DISTINCT JOB_ID FROM EMPLOYEES  
   2  WHERE DEPARTMENT_ID = (  
   3        SELECT DEPARTMENT_ID FROM DEPARTMENTS  
   4        WHERE DEPARTMENT_NAME = 'Finance');  
   
JOB_ID  
----------  
FI_ACCOUNT  
FI_MGR  
 
--或者  
 
SQL> SELECT DISTINCT JOB_ID FROM EMPLOYEES  
   2  WHERE DEPARTMENT_ID IN (  
   3        SELECT DEPARTMENT_ID FROM DEPARTMENTS  
   4        WHERE DEPARTMENT_NAME = 'Finance');  
   
JOB_ID  
----------  
FI_ACCOUNT  
FI_MGR  
 
 
/*-------10、Finance部门有哪些职位(关联子查询)。---------*/  
SQL> SELECT DISTINCT JOB_ID FROM EMPLOYEES  
   2  WHERE EXISTS(  
   3        SELECT 1 FROM DEPARTMENTS  
   4        WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID  
   5        AND DEPARTMENTS.DEPARTMENT_NAME = 'Finance');  
   
JOB_ID  
----------  
FI_ACCOUNT  
FI_MGR 

原文链接:http://www.cnblogs.com/huyong/archive/2011/06/27/2090980.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: