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

 
   | |

导读:本文主要介绍如何用子查询声称一个表给SELECT子句、如何用子查询来生成映射以及生成传递给DMK语句的记录行。

关键词:Oracle Oracle SQL 在SQL中使用子查询 Oracle 11g

正在加载数据... 【TechTarget中国原创】子查询也可以用在FROM子句中,这里它们有时是被作为内嵌视图使用。我们可以设想HR Schema上的另一个问题:员工被分配到一个部门,而部门有一个位置。每一个位置是在一个国家中。即便他们为不同的部门工作,你又如何找出一个国家中员工的平均工资呢?

【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);

 
查看全文
 
 
 
 
 

Oracle认证与培训

 
在被问及DBA的终极目标时,有相当一部分人认为架构师才是他们理想中的工作,他们都希望在数据库领域有所建树,而工作环境和待遇最好能同Google看齐。
 
数据库工程师在所有的日常工作中,数据库占到了39%,应用程序的维护占到了20%,其它还包括了服务器、存储以及网络的维护等工作。
 
一个人的收入不仅同能力经验以及地域相关,而且所在公司情况也会有直接的影响,这也就是为什么每年都有那么多的人忙着跳槽。
 
参与本次调查的人员来自于中国大陆的13余个行业,而其中IT服务、金融以及制造业是人数最多的三个行业。
 
在中国,学历还是会和薪酬待遇直接相关。在同等条件下,学历越高薪酬就越高,而且有的硕士甚至会比大专生高出一倍还多。
 

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
电子邮件地址:
请输入您的电子邮件地址
密码:
下次自动登录