生成一个表给SELECT子句 子查询也可以用在FROM子句中,这里它们有时是被作为内嵌视图使用。我们可以设想HR Schema上的另一个问题:员工被分配到一个部门,而部门有一个位置。每一个位置是在一个国家中。即便他们为不同的部门工作,你又如何找出一个国家中员工的平均工资呢?我们可以这样做: select avg(salary),country_id from (select salary,department_id,location_id,country_id from employees natural join de……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
生成一个表给SELECT子句
子查询也可以用在FROM子句中,这里它们有时是被作为内嵌视图使用。我们可以设想HR Schema上的另一个问题:员工被分配到一个部门,而部门有一个位置。每一个位置是在一个国家中。即便他们为不同的部门工作,你又如何找出一个国家中员工的平均工资呢?我们可以这样做:
select avg(salary),country_id from (select salary,department_id,location_id,country_id from employees natural join departments natural join locations) group by country_id; |
这个子查询构造了一个表,表里有每一个员工的工资和他的部门所在国家。然后父查询接收这个表,计算出SALARY的平均值,并将结果按COUNTRY_ID分组。
生成映射值
子查询的第三个使用位置是查询的SELECT列表。你如何确定最高工资和最高销售提成,以及根据最高工资员工应获取最高销售提成的原则的最大提成比例是多少?我们可以用两个子查询来解决:
select (select max(salary) from employees) * (select max(commission_pct) from employees) / 100 from dual; |
这个用法中,用于映射字段的SELECT列表是由子查询的结果生成的。这种方式的子查询必须是标量的,否则父查询会执行出错。
生成传递给DMK语句的记录行
DML语句会在第10章中详细介绍,下面是一些例子:
insert into sales_hist select * from sales where date > sysdate-1; update employees set salary = (select avg(salary) from employees); delete from departments where department_id not in (select department_id from employees); |
第一个例子使用一个子查询来确定一个表中将要插入到另一个表中的记录行。第二个例子使用一个子查询来计算所有员工的平均工资并将这个值(标量数)传递给一个更新语句。第三个例子使用一个子查询来获取所有正在使用的DEPARTMENT_ID并将这个列表传递给DELETE命令,这将会删除所有没有被使用的部门。
需要注意的是在VALUES子句使用子查询是不合法的;而下面是合法的:
insert into dates select sysdate from dual; |
但这个是不合法的:
insert into dates (date_col) values (select sysdate fom dual); |
练习8-2一些更复杂的子查询
在这个练习中,你将编写一些更复杂一些的子查询。你可以使用SQL*Plus或SQL Developer进行代码编写。所有这些查询都应该能在HR Schema上执行。
1、以用户HR登录到你的数据库。
2、编写一个查询,找出所有工作部门在United Kingdom的员工。这将需要三个层次的嵌套子查询:
select last_name from employees where department_id in (select department_id from departments where location_id in (select location_id from locations where country_id = (select country_id from countries where country_name='United Kingdom') )); |
3、通过单独运行子查询来检查第2步中得到的结果是正确的。首先,找出United Kingdom的COUNTRY_ID:
select country_id from countries where country_name='United Kingdom'; |
结果将会是UK。然后找出相应的位置:
select location_id from locations where country_id = 'UK'; |
返回的LOCATION_ID将会是2400,2500和2600。然后找出在这些位置的部门的DEPARTMENT_ID:
select department_id from departments where location_id in (2400,2500,2600); |
结果将会是两个部门:40和80。最后,找出相应的员工:
select last_name from employees where department_id in (40,80); |
4、编写一个查询,找出所有工资超过平均水平并且工作在IT部门的员工。这将需要2个子查询,但不是嵌套的:
select last_name from employees where department_id in (select department_id from departments where department_name like 'IT%') and salary > (select avg(salary) from employees); |
翻译
TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。
相关推荐
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
2017年12月数据库流行度排行榜 定格岁末排名瞬间
数据库知识网站DB-engines最近更新的2017年12月份数据库流行度排名情况是否能提供更多的看点呢?TechTarget数据库网站将与您分享12月份的榜单排名情况,让我们拭目以待。
-
2017年11月数据库流行度排行榜 半数以上数据库积分减少
数据库知识网站DB-engines更新了2016年11月份的数据库流行度排行榜。TechTarget数据库网站将与您一同关注11月份的榜单排名情况。
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。