Advanced Oracle SQL: Subquery Inline View
Advanced Oracle SQL: Subquery Inline View Oracle Tips by Laurent Schneider Laurent Schneider is considered one of the top Oracle SQLexperts, and he is the author of the book Advanced SQL Programming by Rampant TechPress. The following is a
Advanced Oracle SQL: Subquery Inline View Oracle Tips by Laurent Schneider |
Laurent Schneider is considered one of the top Oracle SQLexperts, and he is the author of the book "Advanced SQL Programming"by Rampant TechPress. The following is an excerpt from the book.
In the FROM clause below, a subquery acts as a table:
SELECT
ENAME
FROM
(
SELECT
EMPNO,
ENAME,
SAL
FROM
EMP
WHERE
DEPTNO=10
)
WHERE
SAL
ENAME
----------
CLARK
MILLER
--------------------------------------------------------------------------
| Id | Operation | Name |Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 1| 13 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
1 - filter("DEPTNO"=10 AND "SAL"
The subquery returns all employees of department 10, and the main queryreturns only those with a salary less than 2500.
The subquery could be saved as a view, providing the necessary privilegesare granted. In fact, a subquery in the FROM clause is called an inline viewand might look like the following where the view is created before theselection. The selection starts with the WITH statement:
CREATE VIEW
DEPT10
AS
SELECT
EMPNO,
ENAME,
SAL
FROM
EMP
WHERE
DEPTNO=10
/
SELECT
ENAME
FROM
DEPT10
WHERE
SAL
WITH
DEPT10
AS
(
SELECT
EMPNO,
ENAME,
SAL
FROM
EMP
WHERE
DEPTNO=10
)
SELECT
ENAME
FROM
DEPT10
WHERE
SAL
Subquery factoring was introduced in Oracle 9i. Instead of using asubquery, the two conditions, salary less than 2500 and department equal 10,could be combined by an AND logical operator.
Nested subquery
Subqueries can be used in logical statements like =ALL, >SOME,
The three queries that follow create the same result and the same plan:
SELECT
DEPTNO
FROM
DEPT
WHERE
DEPTNO!=ALL
(
SELECT
EMP.DEPTNO
FROM
EMP
WHERE
EMP.DEPTNO IS NOT NULL
);
DEPTNO
----------
40
------------------------------------------------------------------------------
| Id | Operation |Name | Rows | Bytes | Cost (%CPU)|Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3| 18 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN ANTI | | 3| 18 | 5 (20)| 00:00:01 |
| 2 | INDEX FULL SCAN | PK_DEPT | 4 | 12 | 1 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| EMP | 14 | 42 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
1 - access("DEPTNO"="EMP"."DEPTNO")
3 - filter("EMP"."DEPTNO" IS NOT NULL)
Or:
SELECT
DEPTNO
FROM
DEPT
WHERE
DEPTNO NOT IN
(
SELECT
EMP.DEPTNO
FROM
EMP
WHERE
EMP.DEPTNO IS NOT NULL
);
DEPTNO
----------
40
------------------------------------------------------------------------------
| Id | Operation |Name | Rows | Bytes | Cost (%CPU)|Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 18 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN ANTI | | 3| 18 | 5 (20)| 00:00:01 |
| 2 | INDEX FULL SCAN | PK_DEPT| 4 | 12 | 1 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| EMP | 14 | 42 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
1 - access("DEPTNO"="EMP"."DEPTNO")
3 - filter("EMP"."DEPTNO" IS NOT NULL)
Or:
SELECT
DEPTNO
FROM
DEPT
WHERE
NOT EXISTS
(
SELECT
*
FROM
EMP
WHERE
EMP.DEPTNO=DEPT.DEPTNO
);
DEPTNO
----------
40
------------------------------------------------------------------------------
| Id | Operation |Name | Rows | Bytes | Cost (%CPU)|Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3| 18 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN ANTI | | 3| 18 | 5 (20)| 00:00:01 |
| 2 | INDEX FULL SCAN | PK_DEPT| 4 | 12 | 1 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 14 | 42 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
1 -access("EMP"."DEPTNO"="DEPT"."DEPTNO")
From the department table, the department that is different from alldepartments in EMP is returned.
A subquery in the WHERE clause is called a nested subquery. The joinbetween the two tables is an antijoin.
It is important to note the NOT NULL condition in NOT IN and !=ALL. If onedepartment is null in EMP, it should not exclude department 40:
SELECT
DEPTNO
FROM
DEPT
WHERE
DEPTNO=SOME
(
SELECT
EMP.DEPTNO
FROM
EMP
);
DEPTNO
----------
10
20
30
-------------------------------------------------------------------------------
| Id |Operation |Name | Rows | Bytes | Cost (%CPU)|Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 18 | 4 (25)| 00:00:01 |
| 1 | NESTED LOOPS | | 3| 18 | 4 (25)| 00:00:01 |
| 2 | SORT UNIQUE | | 14| 42 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL|EMP | 14 | 42| 3 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 3 | 0 (0)|00:00:01 |
-------------------------------------------------------------------------------
4 - access("DEPTNO"="EMP"."DEPTNO")
Or:
SELECT
DEPTNO
FROM
DEPT
WHERE
DEPTNO IN
(
SELECT
EMP.DEPTNO
FROM
EMP
);
DEPTNO
----------
10
20
30
-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3| 18 | 4 (25)| 00:00:01 |
| 1 | NESTED LOOPS | | 3| 18 | 4 (25)| 00:00:01 |
| 2 | SORT UNIQUE | | 14| 42 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL|EMP | 14 | 42| 3 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 3 | 0 (0)|00:00:01 |
-------------------------------------------------------------------------------
4 -access("DEPTNO"="EMP"."DEPTNO")
Or:
SELECT
DEPTNO
FROM
DEPT
WHERE
EXISTS
(
SELECT
*
FROM
EMP
WHERE
EMP.DEPTNO=DEPT.DEPTNO
);
DEPTNO
----------
10
20
30
-------------------------------------------------------------------------------
| Id | Operation | Name |Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3| 18 | 4 (25)| 00:00:01 |
| 1 | NESTED LOOPS | | 3| 18 | 4 (25)| 00:00:01 |
| 2 | SORT UNIQUE | | 14| 42 | 3 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL|EMP | 14 | 42| 3 (0)| 00:00:01 |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT | 1 | 3 | 0 (0)|00:00:01 |
-------------------------------------------------------------------------------
4 -access("EMP"."DEPTNO"="DEPT"."DEPTNO")
This type of join is called a semijoin.

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Oracle 环境变量配置指南:创建 ORACLE_HOME 环境变量,指向 Oracle 主目录。将 Oracle 二进制文件目录添加到 PATH 环境变量。设置 TNS_ADMIN 环境变量(如果使用 TNS 命名文件)。验证环境变量设置,确保输出显示已设置的变量。

Oracle 提供多种去重查询方法:DISTINCT 关键字返回每列的唯一值。GROUP BY 子句对结果分组并返回每个分组的非重复值。UNIQUE 关键字用于创建仅包含唯一行的索引,查询该索引将自动去重。ROW_NUMBER() 函数分配唯一数字并过滤出仅包含第 1 行的结果。MIN() 或 MAX() 函数可返回数字列的非重复值。INTERSECT 运算符返回两个结果集的公共值(无重复项)。

数据导入方法:1. 使用 SQLLoader 实用程序:准备数据文件、创建控制文件、运行 SQLLoader;2. 使用 IMP/EXP 工具:导出数据、导入数据。提示:1. 大数据集推荐 SQL*Loader;2. 目标表应存在,列定义匹配;3. 导入后需验证数据完整性。

Oracle 乱码问题可以通过以下步骤解决:检查数据库字符集以确保与数据相匹配。设置客户端字符集以与数据库相匹配。转换数据或修改列字符集以匹配数据库字符集。使用 Unicode 字符集,并避免多字节字符集。检查数据库和客户端的语言设置是否正确。

存储过程是一组可存储在数据库中的 SQL 语句,可作为独立单元重复调用。它们可以接受参数(IN、OUT、INOUT),并提供代码重用、安全性、性能和模块化的优势。示例:创建存储过程 calculate_sum 来计算两个数字的总和并将其存储在 OUT 参数中。

使用 ALTER TABLE 语句,具体语法如下:ALTER TABLE table_name ADD column_name data_type [constraint-clause]。其中:table_name 为表名,column_name 为字段名,data_type 为数据类型,constraint-clause 为可选的约束。示例:ALTER TABLE employees ADD email VARCHAR2(100) 为 employees 表添加 email 字段。

要查询 Oracle 表空间大小,请遵循以下步骤:确定表空间名称,方法是运行查询:SELECT tablespace_name FROM dba_tablespaces;查询表空间大小,方法是运行查询:SELECT sum(bytes) AS total_size, sum(bytes_free) AS available_space, sum(bytes) - sum(bytes_free) AS used_space FROM dba_data_files WHERE tablespace_

主键是唯一标识表中每一行的特殊列或列组合,它确保表中的记录都是独一无二的,可以通过以下步骤创建:使用 ALTER TABLE 语句指定表名。添加 PRIMARY KEY 关键字后跟要指定为主键的列名。主键约束有助于确保数据唯一性、提高查询速度、防止重复记录并简化表连接。
