【TechTarget中国原创】第8章:使用子查询解决问题
内容大纲:
- 定义SQL子查询
- 在SQL中使用子查询
- 列举SQL的子查询类型
- 编写单行和多行的子查询
本书有两章阐述了如何将两个或更多的SELECT命令整合到一个语句中,这是其中的第一章。第一种整合SELECT命令的方法(本文所介绍的)是使用子查询。子查询指的是将一个SELECT的语句的输出作为另一个SELECT语句(或一个DML语句,在第10章中所介绍的)的输入进行查询。第二种方法是使用集合操作符,它可以将几个SELECT命令的结果整合到一个结果集中。
定义SQL子查询
子查询是一个嵌套在SELECT、INSERT、UPDATE 或DELETE语句,或者另一个子查询里的查询。一个子查询可以返回一行或多行结果给父查询。标量子查询是只返回一个值的查询:只有一个字段的一行记录。标量子查询可以在SQL语句的大多数位置,其中你可以使用一个表达式或一个实际值。
查询中可能会用到子查询的有如下几个位置:
- 用于字段映射的SELECT列
- 在FROM子句中
- 在WHERE子句中
- 在HAVING子句中
子查询经常是作为内查询使用,而它所在的查询语句则称为外查询。这个专业术语没有任何的问题,只是它可能让人误解为只能有内和外两个级别的查询。事实上,Oracle实现的子查询并没有硬性限制查询嵌套级数:FROM子句中的语句中的嵌套深度没有限制,而WHERE子句上的嵌套上限为255。
子查询可以使用任何一种常用的选择和映射子句。而下面就是必须的子句:
下面是可选的子句:
SQL语句中的子查询必须在调用它的父查询之前执行,这样子查询的结果才可以传递给父查询。
练习8-1子查询的类型
在这个练习中,你将要编写代码来演示可以使用子查询的位置。你可以使用SQL*Plus或SQL Developer来编写代码。所有查询在连接到HR Schema后都应该能执行通过。
1、作为HR登陆你的数据库
2、作为HR登陆你的数据库
select sysdate Today, (select count(*) from departments) Dept_count, (select count(*) from employees) Emp_count from dual; |
3、编写一个查询,确定所有是经理的员工。这需要在WHERE子句中使用子查询来选择所有以MANAGER_ID字段出现在EMPLOYEE_ID字段中的员工:
select last_name from employees where (employee_id in (select manager_id from employees)); ch08.indd 359 4/28/08 10:48:49 AM |
4、编写一个查询,确定每一个国家的最高薪水。这需要在FROM子句中使用子查询:
select max(salary),country_id from (select salary,department_id,location_id,country_id from employees natural join departments natural join locations) group by country_id; |