`
housen1987
  • 浏览: 344552 次
  • 性别: 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)


分享到:
评论

相关推荐

    第11章 子查询.doc

    本章我们将深入探讨如何使用子查询来解决复杂的数据库查询问题。 1. 查询和BLAKE相同部门的员工姓名和雇用日期: 使用子查询来找出与BLAKE相同部门的部门ID,然后在主查询中查找所有属于该部门的员工。 2. 查询...

    第09章_子查询1

    在本章中,我们通过一系列实例来学习如何使用子查询解决实际问题。 1. **查询和Zlotkey相同部门的员工姓名和工资**: 这个例子中,子查询用于获取名为Zlotkey的员工所在部门ID,然后外层查询从employees表中筛选出...

    OCA认证考试指南1Z0-051

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

    数据库系统教程(第3版)电子教案(第7章-第12章)

    第8章“对象数据库系统”介绍了面向对象模型在数据库中的应用。对象数据库允许直接存储复杂的数据结构,如类、对象和继承关系,为处理复杂的现实世界问题提供了强大支持。本章会讲解对象-关系映射、对象查询语言以及...

    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章 使用存储过程和函数  第...

    Oracle基础学习之子查询

    在实际工作中,子查询通常用于解决多表查询的性能问题,特别是解决因笛卡尔积导致的性能降低。 8. **优化子查询**: 在多表查询中,子查询有时能提供更好的性能。通过预先计算子查询结果并存储在一个临时表或视图...

    SQL数据库第五章作业

    在SQL数据库第五章的作业中,你可能会被要求运用上述概念来解决问题,如创建查询、设计合理的数据库结构、优化查询性能等。理解并熟练掌握这些知识点将有助于你在数据库管理领域取得成功。通过实际操作和练习,你...

    数据库原理上机第5-8章

    "数据库原理实验七草稿.doc"和"八草稿"则可能覆盖第7和第8章的内容,涉及数据库设计和事务处理的实践操作。 这些文档不仅对理解数据库原理有极大的帮助,而且提供了实际操作的机会,使得理论知识能够转化为实际技能...

    查询效率提升10倍!3种优化方案,帮你解决MySQL深分页问题.doc

    5. 优化查询:使用子查询和 inner join 关联查询来解决深分页问题。 解决方案: 6. 使用子查询:用子查询查出符合条件的主键,再用主键 ID 做条件查出所有字段,执行时间缩短到 0.05 秒,减少了 0.12 秒,相当于...

    数据库的连接和嵌套查询实验.doc

    第八个查询语句是检索选修课程号为C601和C603的学生学号。这个查询语句使用了相关子查询,首先检索出选修课程号为C601和C603的学生,然后返回学生学号。 第九个查询语句是检索选修全部课程的学生姓名。这个查询语句...

    accp 5.0 s1 SQL 第四章作业

    学习者可能会接触到子查询、联接(JOIN)、聚合函数(如COUNT、SUM、AVG、MAX、MIN)以及分组(GROUP BY)和排序(ORDER BY)等高级查询技巧。 2. **INSERT语句**:用于向数据库表中插入新的记录。掌握正确的字段名...

    SQL数据库第四章作业

    在完成第四章的作业时,学生可能需要结合这些概念,编写实际的SQL语句来解决问题。这将涉及理解表结构、设计有效的查询、掌握不同类型的连接,并熟悉如何正确使用数据操作语句。通过实践,可以加深对SQL的理解,为更...

    (第二卷)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章 事务和...

    面试必刷:MySQL练习题-基础查询(子查询、连接查询、分组查询...)

    它可以用来解决复杂的查询问题。例如,找出所有选修了某门课程的学生姓名: `SELECT Sname FROM Student WHERE SId IN (SELECT SId FROM SC WHERE CId = '某门课程的编号');` 3. 连接查询: 连接查询(Join)是...

    arcObjects Gis 应用开发(C#.NET)第八章配套程序

    《arcObjects GIS 应用开发(C#.NET)第八章配套程序》主要涵盖了使用C#.NET进行GIS应用开发的相关技术,特别是在使用ESRI的arcObjects库时的一些关键概念、方法和最佳实践。arcObjects是ESRI提供的一个强大的SDK,...

    第三章实验代码

    1. 数据结构与算法:作为程序设计的基础,数据结构用于高效存储和组织数据,而算法则是解决问题的具体步骤。在旅游资源管理中,可能会用到如链表、树、图等数据结构,以及搜索、排序、图遍历等算法,以便快速查询和...

    C#开发实战宝典第8章

    在"C#开发实战宝典第8章"中,我们聚焦于C#编程语言的实际应用,这一章的内容无疑是为了提升开发者解决实际问题的能力。C#,由微软公司开发,是一种广泛应用于构建Windows桌面应用、Web应用以及游戏开发的强大编程...

Global site tag (gtag.js) - Google Analytics