`
housen1987
  • 浏览: 340393 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

第八章 使用子查询解决问题

 
阅读更多

认证目标:


  • 定义子查询
  • 描述子查询能够解决的问题的类型
  • 列举子查询的类型
  • 写单行和多行子查询

8.1 定义子查询

子查询是嵌套在select、insert、update或delete语句内或者其他子查询内的查询。

子查询为父查询返回一行或多行。

标量子查询(scalar subquery):只返回一个值的查询,一行或一列。


查询中可以使用子查询的位置:

    • 列投影的select列表
    • from字句中
    • where字句中
    • having字句中

子查询又叫做内部查询(inner query),含有内部查询的语句称为外部查询(outer query)。

  • 练习8.1

子查询的类型:

(1) 写一个子查询,在列投影使用子查询,该查询会报告当前部门和员工数量:

select sysdate today,(
select count(*) from departments) department_number,
(select count(*) from employees) employee_number
from dual

  

(2) 写一个子查询,来确定所有是经理的员工:

思路:首先找出经理的MANAGER_ID是什么,然后再用子查询在employees表中寻找。

 

select * from employees
where employee_id in 
(select manager_id from employees)

 

   (3) 写一个子查询,来确定每个国家支付的最高薪水

 

select max(a.salary),c.country_id from employees a 
join departments b on(a.department_id=b.department_id) 
join locations c on(b.location_id=c.location_id)
group by country_id

 

 

 8.2 描述子查询能够解决的问题的类型

在许多情况下,需要将一个查询的结果作为另一个查询的输入。


  • 将子查询的结果用于比较

  哪些员工的薪水低于平均薪水?

 

select * from employees where 
salary < (select avg(salary) sal from employees)

 


查询拥有一名或多名员工的部门:

 

select * from departments where department_id in
(select distinct department_id from employees)

 

 或者:

 

select department_name from departments  join employees
using(department_id) group by department_name;


 

【注意】:使用NOT IN会因为SQL处理NULL的方式带来问题,因此,通常不要使用NOT IN,除非您确定结果集中不包含NULL。

  • 星形转换(Star Transformation)

Oracle内部有一个实例初始化参数STAR_TRANSFORMATION_ENABLED,如果设置它为true时,Oracle查询优化器会讲代码重写为星形查询。



  • 生成执行select语句的表

可以在from字句中使用子查询,称为内联视图(inline views)

如果查询一个国家的员工的平均薪水:

 

select avg(salary) average,country_name from
(select * from employees a 
join departments b on a.department_id =b.department_id 
join locations c on b.location_id=c.location_id
join countries d on c.country_id=d.country_id
) group by country_name
 

 

  • 生成投影值

在查询select中使用子查询。


最高薪水的员工,有最高的佣金率,那么需要支付的佣金是多少?

 

 

select
(select max(salary) from employees)
*(select max(commission_pct) from employees)
sal
from dual;
  •  生成传递给DML语句的行

我想插入一条名称来自于departments的表的数据到regions表中。

 

 

insert into regions 
select 104,department_name from where manager_id=200
 

【注意】:


  1. 不能再values字句中出现select,除非它是单个值
  2. DML中的select子句的列投影名称可以与目标列不同,但是数据类型必须一一对应。
  3. 已知的值,可以直接写在子句select中充当一列。

查询在英国的部门工作的员工:

 

select * from employees where department_id 
in (select department_id from departments where location_id 
in(select location_id from locations where country_id = 'UK'))
 

确定薪水高于平均值,且在IT部门工作的员工

 

select * from employees where salary > 
(select avg(salary) from employees) and department_id in
(select department_id from departments where department_name like '%IT%')
 

8.3 列举子查询的类型

子查询可以分为3类:

 

  • 单行子查询
  • 多行子查询
  • 关联子查询


  • 单行和多行子查询

单行子查询返回一行。

标量子查询返回一行一列。

多行子查询返回行集合。


可以在父查询的where和having子句中使用单行和多行子查询。


适用于单行子查询的比较运算符:=,>,>=,<,<=,<>

适用于多行子查询的比较运算符:IN,NOT IN,ANY,ALL

 

写一个查询,获得高于本部门平均工资的员工:

 

select * from employees a,
(select avg(salary) salary,department_id from employees group by department_id) b
where a.department_id = b.department_id and a.salary > b.salary;
 


写一个查询确定谁的工资比Mr.Tobias高:

 

select * from employees where salary > 
(select salary from employees where lower(last_name) = 'tobias')
 

ANY和ALL的使用:

运算符 含义
<ANY 小于最高
>ANY 大于最低
=ANY 等于IN
>ALL 大于最高
<ALL 小于最低


查询工资高于80部门的任何员工的员工:

select * from employees where salary > ALL
(select salary from employees where department_id = 80)


分享到:
评论

相关推荐

    OCA认证考试指南1Z0-051

    第8章 使用子查询解决问题 8.1 定义子查询 8.2 描述子查询能够解决的问题的类型 8.2.1 将子查询的结果集用于比较 8.2.2 星型转换(StarTransformation) 8.2.3 生成执行SELECT语句的表 8.2.4 生成投影值 ...

    精通SQL 结构化查询语言详解

    第8章 聚合分析与分组  8.1 聚合分析的基本概念  8.1.1 聚合分析  8.1.2 聚合函数  8.2 聚合函数的应用  8.2.1 求和函数-SUM()  8.2.2 计数函数-COUNT()  8.2.3 最大/最小值函数-MAX()/MIN()  8.2.4...

    SQL_SERVER应用与开发范例宝典_12357672.part2

     第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第15章 使用存储过程和函数  第...

    SQL_SERVER应用与开发范例宝典_12357672.part1

     第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第15章 使用存储过程和函数  第...

    SQL应用开发范例宝典:SQL应用开发范例宝典.iso (源码光盘)

     第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第15章 使用存储过程和函数  第...

    SQL_SERVER应用与开发范例宝典_12357672.part3

     第8章 使用子查询  第9章 多表查询  第10章 高级查询  第11章 插入数据  第12章 更新和删除数据  第13章 创建、操纵数据库和表  第14章 使用视图  第15章 使用存储过程和函数  第...

    (第二卷)Microsoft SQL Server 2008技术内幕:T-SQL语言基础

    第8章 数据修改 8.1 插入数据 8.2 删除数据 8.3 更新数据 8.4 合并数据 8.5 通过表表达式修改数据 8.6 带有TOP选项的数据更新 8.7 OUTPUT子句 8.8 总结 8.9 练习 8.10 解决方案 第9章 事务和...

    智能公交电子站牌解决方案.pptx

    01 三面式电子站牌 02 候车亭一体化电子站牌 03 嵌入式电子站牌 04 悬挂式电子站牌 安装方式 智能公交电子站牌解决方案全文共20页,当前为第8页。 无线WiFi功能 乘客投诉及 报警功能 全状态故障 检测功能 公交预报...

    (第一卷)Microsoft.SQL.Server.2008技术内幕:T-SQL语言基础

    第8章 数据修改 8.1 插入数据 8.2 删除数据 8.3 更新数据 8.4 合并数据 8.5 通过表表达式修改数据 8.6 带有TOP选项的数据更新 8.7 OUTPUT子句 8.8 总结 8.9 练习 8.10 解决方案 第9章 事务和并发 9.1 ...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决方案。  作为一本讲述T-SQL高级查询的专业图书,《Microsoft...

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书是Inside Microsoft SQL Server ...第4章 子查询、表表达式和排名函数 第5章 联接和集合操作 第6章 聚合和旋转数据 第7章 TOP和ALLPY 第8章 数据修改 第9章 图、树、层次结构和递归查询 附录A 逻辑难题 索引

    考试试题库管理系统论文

    第一章 引言 1. 本课题的研究意义 2. 本课题要实现的功能 第二章 开发平台 1.VB介绍 2.Access介绍 3.数据库的基本概念 4.数据访问对象(DAO) 5.ActiveX数据对象(ADO) ...第八章 结束语 致谢 参考文献

    PHP和MySQL WEB开发(第4版)

    第8章 设计Web数据库 8.1 关系数据库的概念 8.1.1 表格 8.1.2 列 8.1.3 行 8.1.4 值 8.1.5 键 8.1.6 模式 8.1.7 关系 8.2 如何设计Web数据库 8.2.1 考虑要建模的实际对象 8.2.2 避免保存冗余数据 8.2.3 使用原子列值...

    PHP和MySQL Web开发第4版pdf以及源码

    第8章 设计Web数据库 8.1 关系数据库的概念 8.1.1 表格 8.1.2 列 8.1.3 行 8.1.4 值 8.1.5 键 8.1.6 模式 8.1.7 关系 8.2 如何设计Web数据库 8.2.1 考虑要建模的实际对象 8.2.2 避免保存冗余数据 8.2.3 ...

    PHP和MySQL Web开发第4版

    第8章 设计Web数据库 8.1 关系数据库的概念 8.1.1 表格 8.1.2 列 8.1.3 行 8.1.4 值 8.1.5 键 8.1.6 模式 8.1.7 关系 8.2 如何设计Web数据库 8.2.1 考虑要建模的实际对象 8.2.2 避免保存冗余数据 8.2.3 ...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    7.3.2 使用子查询创建表 221 7.3.3 在创建之后更改表定义 222 7.3.4 删除和截断表 222 7.4 创建和使用临时表 225 7.5 索引 227 7.5.1 为什么说索引是必需的 227 7.5.2 索引类型 228 7.5.3 创建和使用索引 ...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    7.3.2 使用子查询创建表 221 7.3.3 在创建之后更改表定义 222 7.3.4 删除和截断表 222 7.4 创建和使用临时表 225 7.5 索引 227 7.5.1 为什么说索引是必需的 227 7.5.2 索引类型 228 7.5.3 创建和使用索引 ...

    Access+2000中文版高级编程

    8.7 用查询解决问题 213 8.7.1 分组以获得百分比 213 8.7.2 查找并删除重复的记录 215 8.7.3 用组的嵌套彻底解决问题 217 8.7.4 区分新旧记录 217 8.7.5 在交叉表查询中使用“总计”行 220 8.8 查询过程...

    Access 2000中文版高级编程(part1)

    8.7 用查询解决问题 213 8.7.1 分组以获得百分比 213 8.7.2 查找并删除重复的记录 215 8.7.3 用组的嵌套彻底解决问题 217 8.7.4 区分新旧记录 217 8.7.5 在交叉表查询中使用“总计”行 220 8.8 查询过程的结构...

Global site tag (gtag.js) - Google Analytics