子查询:
用子查询能解决的问题
假想你想要写一个查询来找出挣钱比陆涛的薪水还多的人。为了解决这个问题,你需要两个查询:一
个找出陆涛的收入,第二个查询找出收入高于陆涛的人。
你可以用组合两个查询的方法解决这个问题,放置一个查询到另一个查询中。
内查询或子查询返回一个值给外查询或主查询。使用一个子查询相当于执行两个连续查询并且用第一个
查询的结果作为第二个查询的搜索值。
子查询语法:
SELECT select_list
FROM table
WHERE expr operator
1.子查询(内查询)
2.子查询的结果被用于主查询(外查询)
首先执行子查询
子查询可嵌套的位置:
子查询是一个SELECT
另一个
使用子查询你可以用简单的语句构建功能强大的语句。当你需要从表中用依赖于表本身的数据选择行时
它们是非常有用的。
也可以放在
WHERE
在语法中:
operator
比较条件分为两个种类:单行运算符
子查询通常涉及一个嵌套的
另外,子查询可以被放在
使用子查询的原则:
1.
2.将子查询放在比较条件的右边,
在子查询中的ORDER BY
Oracle8i
3.在单行子查询中用单行运算符,在多行子查询中用多行运算符,
在子查询中可以使用两种比较条件:单行运算符和多行运算符。
子查询的个数:
Oracle
子查询的类型:
1.
2.
3.
单行子查询
单行子查询是从内查询返回一行的查询。在该子查询类型中用一个单行操作符
SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE employee_id = 141);
SELECT
FROM employees
WHERE job_id =
(SELECT
该例子可以由三个查询块组成:外查询和两个内查询。内查询块首先被执行,产生查询结果分别为
两个内查询返回单个值
注:外和内查询可以从不同的表中取得数据。
在子查询中使用组函数:
SELECT
FROM
WHERE
(SELECT
你可以从主查询中显示数据,该主查询使用一个带组函数的单行子查询。子查询放在圆括号中并且放在比较条件的后面。
例子显示所有其薪水等于最低薪水的雇员的
带子查询的HAVING
1.Oracle
2.Oracle
例
找出平均薪水为最低平均薪水的工作岗位。
SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
FROM employees
GROUP BY job_id);
子查询错误
使用子查询的一个常见的错误是单行子查询返回返回了多行。
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary) FROM employees
ERROR at line 4:ORA-01427: single-rowsubqueryreturns more thanone rowERROR
子查询包含一个
外查询得到子查询的结果
为了纠正该错误,改变
子查询的另一个常见问题是内查询没有返回行。
,子查询包含一个
没有名叫
多行子查询:
多行子查询
子查询返回多行被称为多行子查询。对多行子查询要使用多行运算符而不是单行运算符。多行运算符期待多个值。
例
查找各部门收入为部门最低的那些雇员。
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
FROM employees
GROUP BY department_id);
内查询先被执行,产生一个查询结果,然后主查询块处理和使用由内查询返回的值完成它的搜索条件。事实上,在
SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (2500, 4200, 4400, 6000, 7000, 8300, 8600, 17000);
在多行子查询中使用ANY
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY(SELECT salaryFROM employeesWHERE job_id = 'IT_PROG')
AND
ANY
<ANY