“子查询”就是查询中嵌套着另一个查询,也即通过SELECT语句的嵌套使用形成子查询。当我们不知道特定的查询条件时,可以用子查询来为父查询提供查询条件以获得查询结果。
ORACLE中常见的子查询有下面几类:
A、单行子查询(Single-row subqueries)。
B、多行子查询(Multirow subqueries)。
C、内部视图型子查询(Inline views)。
D、多列子查询(Multiple-column subqueries)。
在我们继续详细讨论子查询之前,先看看写子查询的一些特别要注意的地方:
A、子查询必须放在括号内。
B、子查询也必须放在比较操作符号的右边。
C、子查询最多可以嵌套到255级。
子查询中不能使用ORDER BY子句,即ORDER BY必须位于查询的最外层。
一、单行子查询(Single-Row Subqueries)
单行子查询并不是最后输出的结果只能返回一行,而是指子查询只能返回一行。
有一条规则我们必须记住:
当我们用“等于”比较操作符把子查询和父查询嵌套在一起时,父查询期望从子查询那里只得到一行返回值。
例一:
SELECT ename,deptno,sal FROM EMP
WHERE deptno=(SELECT deptno FROM dept
WHERE loc=’New York’);
在这个例子中,如果子查询“SELECT deptno FROM dept WHERE loc=’New York’”只返回一行,则这个例子能正确运行,否则将出错。原因见前面规则。
其它一些表明是单行子查询的比较操作符有“>,>=,<,<=,<>”。
二、多行子查询(Multirow Subqueries)
多行子查询,意味着子查询返回的结果子集可以是多行。因此,我们通常用集合比较操作符(如:IN, NOT IN)把父查询和子查询连接起来。
例二:
SELECT ename,job,sal FROM EMP
WHERE deptno in ( SELECT deptno FROM dept
WHERE dname LIKE ‘A%’);
三、多列子查询(Multiple-Column Subqueries):
前面两个例子中,主查询的WHERE子句中都只有一列。然而,有时需要主查询处理多列。例如,为了得到每个部门工资最高的员工信息,可以使用下面的例子。
例三:
SELECT deptno,ename,job,sal FROM EMP
WHERE (deptno,sal) IN (SELECT deptno,MAX(sal) FROM EMP
GROUP BY deptno);
(有关本节演示请参见实验演示)
在使用多列子查询时必须注意:
A、 主查询中,必须把WHERE子句中需要的多个列用括号括起来,否则发生错误。
B、 主查询WHERE子句中的列与子查询中返回的列必须匹配。
四、内联视图子查询(inline view Subqueries):
通常的查询中,FROM子句后面都是具体的表名。然而,我们也可以在FROM后面跟上一个子查询作为中间
数据结果集,这个中间结果集就是内联视图(inline view)。带有内联视图的子查询就是内联视图子查
询。
例四:
SELECT ename,job,sal,rownum
FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);
从这个例子我们应该注意到:
FROM子句后面的内联视图是可以使用ORDER BY子句进行排序的。然而,其它视图或子查询是不能用ORDER
BY进行排序的。
另外,我们在内联视图可以排序的基础上,可以使用“TOP-N”查询得到一些有意义的结果集。例如,可
以用下面的例子在EMP表中找出工资最低的五个员工的信息。
例五:
SELECT ename,job,sal,rownum
FROM ( SELECT ename,job,sal FROM EMP ORDER BY sal)
WHERE rownum<=5;
Rownum是表内部的一个指示行号的列。
五、到此,我们已经了解了四类子查询,但在使用子查询时还要注意以下几点:
A、 在HAVING子句中也可以使用子查询。
例:
SELECT deptno,job,AVG(sal) FROM EMP
GROUP BY deptno,job
HAVING AVG(sal)>(SELECT sal FROM EMP WHERE ename=’MARTIN’);
(有关本节演示请参见实验演示)
B、 在一些比较复杂的子查询中,可能需要多次处理同一个子查询,为了优化这一步骤,ORACLE9i引入了“WITH”子句来提高这类子查询的性能。
例:
SELECT dname,SUM(sal) AS dept_total
FROM EMP,DEPT
WHERE EMP.deptno=DEPT.deptno
GROUP BY dname
HAVING SUM(sal)>(SELECT SUM(sal)*1/3
FROM EMP,DEPT
WHERE EMP.deptno=DEPT.deptno)
ORDER BY SUM(sal) DESC;
显然,子查询“SELECT SUM(sal) FROM EMP,DEPT WHERE EMP.deptno=DEPT.deptno”处理了两次。因此,可以利用O9i中的下来语法来改善性能:
WITH summary AS
( SELECT dname,SUM(sal) AS dept_total
FROM EMP,DEPT
WHERE EMP.deptno=DEPT.deptno
GROUP BY dname )
SELECT dname,dept_total FROM summary
WHERE dept_total>(SELECT SUM(dept_total)*1/3 FROM summary)
ORDER BY dept_total DESC;
C、在一些子查询操作,诸如数据分组,可能会产生空值。然而,在子查询把这些数据集返回给主查询时又会忽略空值。因此,应特别小心这种情况。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cowbane/archive/2009/10/15/4675468.aspx
分享到:
相关推荐
oracle笔记子查询,有子查询相关的知识点笔记和具体的案例代码!
Oracle子查询是构建复杂查询的基石,通过合理利用单行或多行子查询,结合`IN`、`ANY`、`SOME`、`ALL`、`EXISTS`等关键字,可以极大地提高查询的灵活性和效率。理解并熟练掌握子查询的使用,对于提升数据库操作技能和...
ORACLE子查询
复杂相关子查询 动画版
oracle笔记高级子查询,oracle中的高级子查询有点难度,不太好理解,有具体的案例代码!
子查询的灵活性使其在复杂查询中扮演了重要角色。 然后是**PL/SQL**,它是Oracle数据库提供的过程化语言,结合了SQL查询和传统编程语言的特性。PL/SQL包括声明变量、控制流程结构(如IF-THEN-ELSE、CASE、FOR循环)...
在学习Oracle子查询时,学员需要通过实践来熟悉不同场景下子查询的使用方法,掌握其返回的数据类型,以及如何在WHERE、HAVING、FROM子句中嵌入子查询,解决实际问题。同时,理解子查询返回空值对主查询的影响,以及...
Oracle子查询知识点总结 Oracle子查询是指在SQL语句中嵌套使用SELECT语句,以解决复杂的查询问题。下面是Oracle子查询的知识点总结: 一、子查询的定义和类型 * 子查询是一个完整的SELECT语句,嵌套在另一个...
在Oracle数据库中,`IN`操作符是一种常用的查询方式,它允许我们检查某个值是否在一个给定的集合或子查询结果中。例如,如果我们有一个表`employees`,包含`column1`和`column2`列,我们可以用如下SQL查询来找出`...
在Oracle中,子查询是一个非常关键的概念,尤其对于初学者来说,理解和掌握子查询是提升SQL技能的基础。子查询,也称为嵌套查询,是在一个SQL语句中嵌入另一个查询,用于获取数据或对主查询进行条件判断。 1. **子...
oracle select group 子查询 表连接
Oracle子查询是数据库查询中的一个重要概念,它是指在SQL语句中嵌套另一个查询语句,用于获取数据或满足特定条件。子查询可以被用在SELECT、INSERT、UPDATE和DELETE命令中,甚至可以在一个子查询内部再嵌套其他子...
Oracle子查询的语法结构如下: ```sql SELECT [DISTINCT] * | 列名 1 [别名 1], 列名 2 [别名 2]… FROM 表名, (SELECT [DISTINCT] * | 列名 1 [别名 1], 列名 2 [别名 2]… FROM 表名 [WHERE 条件] [GROUP BY...
- **减少子查询使用**:将复杂的子查询转换为连接操作或者使用物化视图等技术来减少查询复杂度。 - **合理使用JOIN操作**:正确使用内连接(`INNER JOIN`)、外连接(`LEFT JOIN`, `RIGHT JOIN`)等连接方式,确保只获取...
oracle子查询学习教案.pptx
通过本章学习,您将可以: 书写多列子查询 ...在 FROM 子句中使用子查询 在SQL中使用单列子查询 相关子查询 书写相关子查询 使用子查询更新和删除数据 使用 EXISTS 和 NOT EXISTS 操作符 使用 WITH 子句
Oracle子查询是数据库查询语言SQL中的一个重要概念,它在数据处理和分析中起着至关重要的作用。子查询,也称为嵌套查询,是指在另一个查询内部的查询,它作为一个独立的查询被执行,并且其结果被主查询使用。下面...
子查询是Oracle SQL查询中的一个重要概念,它允许在单个SQL语句中嵌套其他SQL查询,以实现复杂的数据检索和分析。本教程主要关注Oracle基础使用子查询的知识点。 首先,子查询并不具有特殊的语法结构,它只是SQL...