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

2008-12-5    | |
打印本文章
RSS

导读:本文主要介绍如何用子查询声称一个表给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 OCP DBA认证有哪些过程?首先来看看最受欢迎的适用于DBAs的Oracle OCP认证。Oracle OCP DBA认证是所有Oracle认证中最普及的一种认证,这一认证过程是……
 
Oracle的体系很庞大,要学习它,首先要了解Oracle的框架。在这里,简要的讲一下Oracle的架构,让初学者对Oracle有一个整体的认识。
 
Oracle的体系太庞大了,对于初学者来说,难免会有些无从下手的感觉,什么都想学,结果什么都学不好,所以把学习经验共享一下,希望让刚刚入门的人对oracle有一个总体的认识,少走一些弯路。
 
为了进一步提高Oracle认证的可选性,Oracle公司现在可以提供4种不同的认证,这些都是专为从事Oracle领域工作的人员包括DBA、开发人员以及管理人员所设计的。
 
要成为一名成功的DBA应该具备哪些实力和技能?作者详细阐述了成为一名成功的DBA所需要的一些软性技能:沟通能力、解决问题的能力、压力管理、人际交际能力以及时间管理。
在SQL Server中,我们如何进行索引设计来提升系统的性能和对查询进行优化,是许多用户非常关注的问题,在本次技术专题中,我们将分群集索引和非群集索引设计两部分来为您详细分析。
本技术专题主要为使用Oracle SQL Developer和其他开发工具。包括如何使用Oracle SQL Developer和其他开发工具、使用Oracle Database Home Page、在Oracle中使用SQL*Plus等方面。
本专题为QL SELECT语句基础。侧重概述了如何使用SELECT来访问SQL数据库中所有内容以及组成SELECT语句的许多子句名称和功能;同时还阐述了如何使用DISTINCT关键字消除重复的行,以及如何正确使用ORDER BY子句来排序数据。
最新更新
专家答疑
技巧
Brian Fedorko
Oracle数据库审计功能十分强大、灵活并且易于配置,适当并有效地使用数据库审计功能是拥有高效安全策略的基础。
Brian Peasland
Oracle数据库二进制文件和库文件是高版本版本的,而备份的数据库内部如果仍然是较低版本,那么Oracle将不允许你打开数据库,除非你完成了升级过程。
Maria Anderson
在Windows XP环境下,使用数据库升级助手将Oracle从9.2.0.1升级到10g R2,出现DBUA不能识别Oracle数据库的SID问题如何解决。

登录TechTarget中国

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