本文与大家共同讨论与分享ORACLE SQL的一些常用经典查询,欢迎大家补充,同时你认为有那些经典的也可分享出来。在本文中,对每一个问题,你要是认为有什么更好的解决方法也欢迎你及时提出。交流与分享才能共同进步嘛,感谢!
接上四篇:
[推荐]ORACLE SQL:html">经典查询练手第一篇
[推荐]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. 哪些部门的人数比90 号部门的人数多。
2. Den(FIRST_NAME)、Raphaely(LAST_NAME)的领导是谁(非关联子查询)。
3. Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(非关联子查询)。
4. Den(FIRST_NAME)、Raphaely(LAST_NAME) 的领导是谁(关联子查询)。
5. Den(FIRST_NAME)、Raphaely(LAST_NAME) 领导谁(关联子查询)。
6. 列出在同一部门共事,入职日期晚但工资高于其他同事的员工:名字、工资、入职日期
(关联子查询)。
7. 哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)不在同一个部门(非关联子查询)。
8. 哪些员工跟Den(FIRST_NAME)、Raphaely(LAST_NAME)不在同一个部门(关联子查询)。
9. Finance部门有哪些职位(非关联子查询)。
10. 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
&nb