全查询

fullselect 是 SELECT 语句, INSERT 语句和 CREATE VIEW 语句的组件。 它也是某些谓词的组成部分,而这些谓词又是语句的组成部分。

作为谓词组件的全查询称为 子查询,括在括号中的全查询有时称为子查询。
Read syntax diagramSkip visual syntax diagramsubselect(fullselect)values-clauseUNIONUNION ALLEXCEPTEXCEPT ALLINTERSECTINTERSECT ALLsubselect(fullselect)values-clause order-by-clause offset-clause fetch-clause isolation-clause
values-clause
Read syntax diagramSkip visual syntax diagramVALUES,values-row
values-row
Read syntax diagramSkip visual syntax diagramexpressionNULLrow-expression(,expressionNULL)

集合运算符 UNION , EXCEPT 和 INTERSECT 对应于关系运算符并集,差分和交集。

全查询指定结果表。 如果未使用集合运算符,那么全查询的结果是指定的子查询或值-子句的结果。

"SQL 查询" 中的 "授权" 部分描述了 全查询 的授权。

values-子句
通过使用表达式或行表达式为结果表中行的每列指定实际值来派生结果表。 可以指定多行。 如果指定了多行,那么不得使用 DEFAULT 和 UNASSIGNED 的扩展指示符变量值 (SQLSTATE 22539)。 values-clause 中任何表达式的结果类型不能是行类型 (SQLSTATE 428H2)。

NULL 只能与 values-row的多个规范配合使用,可以作为单列结果表的列值,也可以在 row-expression中使用,并且同一列中至少有一行不得为 NULL (SQLSTATE 42608)。

values-row 由以下对象指定:
  • 单个列结果表的单个表达式
  • n 表达式 (或 NULL) 以逗号分隔并括在括号中,其中 n 是结果表中的列数,或者是多列结果表的行表达式。

多行 VALUES 子句必须在每个 值-行 中具有相同的列数 (SQLSTATE 42826)。

以下示例显示了 values-clause 及其含义。
   VALUES (1),(2),(3)          - 3 rows of 1 column
   VALUES 1, 2, 3              - 3 rows of 1 column
   VALUES (1, 2, 3)            - 1 row of 3 columns
   VALUES (1,21),(2,22),(3,23) - 3 rows of 2 columns
values-row, RE1 到 REn(其中 n 大于 1) 的 n 规范组成的 values-clause 等效于:
   RE1 UNION ALL RE2 ... UNION ALL REn

这意味着每个 值行 的相应列必须具有可比性 (SQLSTATE 42825)。

联盟 或者 全部合并
通过组合其他两个结果表 (R1 和 R2) 来派生结果表。 如果指定了 UNION ALL ,那么结果由 R1 和 R2中的所有行组成。 如果指定 UNION 而不指定 ALL 选项,那么结果是 R1 或 R2中的所有行的集合,并且消除了重复的行。 但是,在任一情况下, UNION 表的每一行都是来自 R1 的行或来自 R2的行。
EXCEPT EXCEPT ALL
通过组合其他两个结果表 (R1 和 R2) 来派生结果表。 如果指定了 EXCEPT ALL ,那么结果由 R2中没有相应行的所有行组成,其中重复行很重要。 如果在不使用 ALL 选项的情况下指定 EXCEPT ,那么结果由仅在 R1中的所有行组成,并且在此操作的结果中消除了重复的行。

为了与其他 SQL 实现兼容,可以将 MINUS 指定为 EXCEPT 的同义词。

交集 或者 全部相交
通过组合其他两个结果表 (R1 和 R2) 来派生结果表。 如果指定了 INTERSECT ALL ,那么结果由同时位于 R1 和 R2中的所有行组成。 如果在不使用 ALL 选项的情况下指定了 INTERSECT ,那么结果将由同时位于 R1 和 R2中的所有行组成,并且将消除重复行。

对应于 R1 和 R2 中第 n 列的表达式可以引用具有列掩码的列。 集合操作结果的第 n 列可从 R1 或 R2中的掩码值派生。

通过 set 操作,将基于 R1 和 R2中的未屏蔽值来消除重复行。 由于所有行都来自 R1 或 R2,因此发生以下一个或多个情况时,集合操作的结果表中的输出值可能会有所不同:
  • 对应于 R1 中第 n 列的表达式引用了具有列掩码的列,但对应于 R2 中第 n 列的表达式未引用。 事实也恰恰相反。
  • 对应于 R1 和 R2 引用列中具有不同列掩码的第 n 列的表达式。
  • 列掩码定义引用的列与为其定义列掩码的目标列不同,而这些列不是集合操作的一部分。 建议列掩码定义不引用目标表中的其他列。

例如, R1 中的行派生自掩码值,而 R2 中的行派生自未掩码值。 如果结果表中的行来自 R1,那么将返回掩码值。 如果结果表中的行来自 R2,那么将返回未屏蔽的值。

排序子句
关于按顺序排列的详细信息,请参阅子选择。 不能在 (SQLSTATE 428FJ) 中指定包含 ORDER BY 子句的全查询:
  • 具体化查询表
  • 视图的最外层全查询
注: 全查询中的 ORDER BY 子句不会影响查询返回的行的顺序。 如果在最外面的全查询中指定了 ORDER BY 子句,那么该子句仅影响返回的行的顺序。 如果指定了 offset-clausefetch-clause ,请指定 order-by-clause 以确保可预测的顺序从全查询确定行集。
offset-子句
偏移条款的详情,请参阅子选项。 在下列情况下,不能指定包含 OFFSET 子句的全查询 (SQLSTATE 428FJ):
  • 具体化查询表
  • 视图的最外层全查询
fetch-子句
获取子句的详细信息请参阅子选择。 在下列情况下,不能指定包含 FETCH 子句的全查询 (SQLSTATE 428FJ):
  • 具体化查询表
  • 视图的最外层全查询
隔离子句
隔离条款的详情,请参阅子选项。 如果为全查询指定了 isolation-clause ,并且它可以同样应用于全查询的子查询,那么 isolation-clause 将应用于全查询。 例如,请考虑以下查询。
   SELECT NAME FROM PRODUCT
   UNION
   SELECT NAME FROM CATALOG
   WITH UR
即使隔离子句 WITH UR 只能应用于子查询 SELECT NAME FROM CATALOG ,它也会应用于整个全查询。

结果表 R1 和 R2 中的列数必须相同 (SQLSTATE 42826)。 如果未指定 ALL 关键字,那么 R1 和 R2 不得包含 数据类型为 CLOB , DBCLOB, BLOB ,其中任何类型的单值类型或结构化类型 (SQLSTATE 42907) 的任何列。

结果表的第 n列的列名是 R1 的第 n列的名称 (如果已命名)。 否则,未命名结果表的第 n 列。 如果全查询用作 SELECT 语句,那么在描述语句时将提供生成的名称。 生成的名称不能用于 SQL 语句的其他部分,例如 ORDER BY 子句或 UPDATE 子句。 可以通过执行 SQL 语句的 DESCRIBE 并咨询 SQLNAME 字段来确定生成的名称。

重复行: 如果第一行中的每个值都等于第二行的相应值,那么两行重复。 对于确定重复项,两个空值被视为相等,两个相同数字的十进制浮点表示被视为相等。 例如, 2.00 和 2.0 具有相同的值 (2.00 和 2.0 比较为相等) ,但具有不同的指数,这允许您同时表示 2.00 和 2.0。 因此,例如,如果 UNION 操作的结果表包含十进制浮点列,并且存在相同数字的多个表示,那么返回的值 (例如, 2.00 或 2.0) 不可预测。 有关更多信息,请参阅 数字比较

在表达式中组合多个操作时,将首先执行括号内的操作。 如果没有括号,那么将从左到右执行操作,但在 UNION 或 EXCEPT 操作之前执行所有 INTERSECT 操作除外。

在以下示例中,表 R1 和 R2 的值显示在左侧。 列出的其他标题显示 R1 和 R2上各种集合操作的结果值。

R1 R2 UNION ALL UNION Except All EXCEPT 第一部分 跨节
1 1 1 1 1 2 1 1
1 1 1 2 2 5 1 3
1 3 1 3 2   3 4
2 3 1 4 2 4
2 3 1 5 4
2 3 2 5
3 4 2
4   2          
4   3          
5   3          
    3          
    3          
    3          
    4          
    4          
    4          
    5