Oracle DB使用子查询来解决查询(一)

2014-11-24 16:24:35 · 作者: · 浏览: 0
Oracle DB使用子查询来解决查询
定义子查询
描述子查询可以解决的问题类型
列出子查询的类型
编写单行和多行子查询
子查询:类型、语法和准则
单行子查询:
– 子查询中的组函数
– 带有子查询的HAVING子句
多行子查询
– 使用ALL或ANY运算符
使用EXISTS运算符
子查询中的空值
使用子查询解决问题
谁的薪金高于Abel 的薪金?
子查询:
Abel 的薪金是多少?
主查询:
哪些雇员的薪金高于Abel 的薪金?
使用子查询解决问题
假设要编写一个查询来找出谁的薪金高于Abel 的薪金。
要解决此问题,需要使用两个查询:一个查询用于查找Abel 的薪金,另一个查询用于查找薪金超过该金额的人员。
通过组合这两个查询,即将一个查询放在另一个查询中,可以解决此问题。
内部查询(即子查询)会返回一个外部查询(即主查询)要使用的值。使用子查询等同于执行两个连续的查询,而且将第一个查询的结果用作第二个查询中的搜索值。
子查询语法
先执行子查询(内部查询),再执行主查询(外部查询)。
主查询会使用子查询的结果。
SELECT select_list FROM table WHERE expr operator
(SELECT select_list FROM table);
子查询是一个SELECT语句,它嵌入到另一个SELECT语句的子句中。通过使用子查询,可以用简单的语句构建功能强大的语句。当需要从表中选择行,而选择条件却取决于该表自身中的数据时,子查询非常有用。
可以在许多SQL 子句中使用子查询,其中包括以下子句:
WHERE子句
HAVING子句
FROM子句
在该语法中:
operator包括比较条件,例如>、=或IN
注:比较条件分为以下两类:单行运算符(>、=、>=、<、<>、<=)和多行运算符(IN、ANY、ALL、EXISTS)。
子查询通常被称为嵌套SELECT语句、子SELECT语句或内部SELECT语句。通常先执行子查询,然后使用其输出来完善主查询(即外部查询)的查询条件。
使用子查询
SELECT last_name, salary FROM employees
WHERE salary >
(SELECT salary FROM employees WHERE last_name = 'Abel');
在示例中,内部查询确定了雇员Abel 的薪金。外部查询会采用内部查询的结果并根据此结果显示薪金超过雇员Abel 的所有雇员。
使用子查询的准则
子查询必须放在括号中。
子查询放在比较条件的右侧可增加可读性。但是,子查询可出现在比较运算符的任意一侧。
在子查询中可以使用两类比较条件:单行运算符和多行运算符。 对单行子查询使用单行运算符,对多行子查询使用多行运算符。
子查询的类型
单行子查询:从内部SELECT语句中仅返回一行的查询
多行子查询:从内部SELECT语句中返回多行的查询
注:此外,还有多列子查询,此类查询从内部SELECT语句中返回多个列。
单行子查询
仅返回一行
使用单行比较运算符
单行子查询是从内部SELECT语句中返回一行的一种查询。此类子查询使用单行运算符。
上图给出了单行运算符的列表。
示例:
显示其职务ID 与雇员141 的职务ID 相同的雇员:
SELECT last_name, job_id FROM employees
WHERE job_id =
(SELECT job_id FROM employees WHERE employee_id = 141);
执行单行子查询
SELECT last_name,job_id, salary FROM employees
WHERE job_id =
(SELECT job_id FROM employees WHERE last_name= 'Taylor')
AND salary >
(SELECT salary FROM employees WHERE last_name= 'Taylor');
可以将SELECT语句看作一个查询块。示例显示其职务与Taylor 相同但薪金高于Taylor 的雇员。
该示例由三个查询块组成:一个外部查询和两个内部查询。先执行内部查询块,生成的查询结果分别为SA_REP和8600。然后可以处理外部查询块,使用内部查询返回的值来完善其搜索条件。
两个内部查询都返回单个值(分别为SA_REP和8600),因此将此SQL 语句称为单行子查询。
注:外部查询和内部查询可以从不同的表中获得数据。
在子查询中使用组函数
SELECT last_name,job_id, salary FROM employees
WHERE salary =
(SELECT MIN(salary) FROM employees);
通过在子查询中使用组函数来返回单行,可以从主查询中显示数据。子查询包含在括号中,位于比较条件之后。
示例显示其薪金等于最低薪金的所有雇员的姓氏、职务ID 和薪金。MIN组函数将单个值(2500) 返回给外部查询。
带有子查询的HAVING子句
Oracle Server 会先执行子查询。
Oracle Server 会将结果返回到主查询的HAVING子句中。
SELECT department_id, MIN(salary) FROM employees GROUP BY department_id
HAVING MIN(salary) >
(SELECT MIN(salary) FROM employees WHERE department_id = 50);
不仅可以在WHERE子句中使用子查询,还可以在HAVING子句中使用子查询。Oracle 服务器会执行子查询,并将结果返回到主查询的HAVING子句中。
示例中的SQL 语句显示最低薪金高于部门50 的最低薪金的所有部门。
示例:
查找具有最低平均薪金的职务。
SELECT job_id, AVG(salary) FROM employees GROUP BY job_id
HAVING AVG(salary) =
(SELECT MIN(AVG(salary)) FROM employees GROUP BY job_id);
此语句中有什么错误
对多行子查询使用了单行运算符
Connected.
hr@TEST0924> SELECT employee_id, last_name FROM employees
2 WHERE salary =
3 (SELECT MIN(salary) FROM employees GROUP BY department_id);
(SELECT MIN(salary) FROM employees GROUP BY department_id)
*
ERRO