SQL基础一考试指南:在SQL中使用子查询(二)

日期: 2008-12-04 作者:John WatsonRoopesh Ramklass翻译:曾少宁 来源:TechTarget中国 英文

生成一个表给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

官方微博

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的能源管理》等。

相关推荐