全查询
fullselect是 select语句、用于定义具体化查询表的ALTER TABLE语句、CREATE TABLE语句、CREATE VIEW语句、DECLARE GLOBAL TEMPORARY TABLE语句、INSERT语句、UPDATE语句和MERGE语句的组成部分。
授权全选
请参阅查询授权。
全选语法
描述
括号中的全选称为子查询。 例如,子查询可用于搜索条件。
标量全选(scalar-fullselect) 是一个全选,用括号括起来,返回一个结果行和一个结果列。 如果全选的结果为空,则返回空值。 如果结果中有多行,则返回错误。 例如,标量全选可用于DELETE、UPDATE和MERGE语句的赋值子句中。
A row-fullselect 是一个返回单行的全选。 如果结果中有多行,则返回错误。 例如,行全选可用于DELETE和UPDATE语句的赋值子句中。
- UNION、 EXCEPT或 INTERSECT
- 集合运算符UNION、EXCEPT和INTERSECT分别对应关系运算符并集、差集和交集。 一个fullselect 指定一个结果表。 如果没有使用集合运算符,则fullselect的结果就是指定的子选择的结果。 否则,结果表是通过组合其他两个结果表( R1 和 R2 )并使用指定的集合运算符得出的。
- UNION DISTINCT 或者 UNION ALL
- 如果指定了 UNION ALL,则结果由 R1 和 R2 中的所有行组成。 使用UNION DISTINCT,结果为 R1 或 R2 中所有行的集合,其中重复的行被删除。 无论哪种情况,联合结果表的每一行要么来自 R1 ,要么来自 R2。
R1 和 R2 中第n列的表达式可以引用带有列掩码的列。 联合结果的第n列可以从 R1 或 R2 中的掩码值中得出。
在UNION DISTINCT中,根据 R1 和 R2 中未屏蔽的值来消除重复行。 由于所有行都来自 R1 或 R2 ,当出现以下一种或多种情况时,并集结果表中的输出值可能会有所不同:
- R1 中第n列的表达式引用了带有列掩码的列,但 R2 中第n列的表达式没有引用列掩码,反之亦然。
- R1 和 R2 中第n列的表达式对应于具有不同列掩码的参考列。
- 列掩码定义引用了与列掩码定义的目标列不同的列,这些列不属于UNION DISTINCT操作的一部分。 建议列掩码定义不要引用目标表中的其他列。
例如, R1 中的某一行来自掩码值,而 R2 中的某一行来自未掩码值。 如果结果表中的行来自 R1 ,则返回掩码值。 如果结果表中的行来自 R2 ,则返回未屏蔽的值。
如果 R1 和 R2 中EXCEPT和INTERSECT的行没有引用带有列掩码的列,则EXCEPT和INTERSECT可以与UNION混合使用。
为了与其他SQL实现兼容,UNIQUE可以被指定为DISTINCT的同义词。
- EXCEPT DISTINCT 或者 EXCEPT ALL
- 如果指定了 EXCEPT ALL,则结果仅包含来自 R1 的所有行,包括重要的冗余重复行。 使用 EXCEPT DISTINCT,结果由仅存在于 R1 中的所有行组成,并删除了冗余重复行。 无论哪种情况,结果表中每行差异都是 R1 中不存在 R2 中匹配行的行。
如果用于生成最终结果表的集合运算符是 EXCEPT ALL 或 EXCEPT DISTINCT,则列掩码不能应用于生成最终结果表的集合运算的选定列表。
为了与其他SQL实现兼容,MINUS可以被指定为EXCEPT的同义词,UNIQUE可以被指定为DISTINCT的同义词。
- INTERSECT DISTINCT 或者 INTERSECT ALL
- 如果指定了INTERSECT ALL,则结果包括 R1 和 R2 中的所有行,包括重要的冗余重复行。 使用INTERSECT DISTINCT,结果包括 R1 和 R2 中的所有行,并删除了冗余重复行。 无论哪种情况,交集结果表的每一行都同时存在于 R1 和 R2 中。
如果用于生成最终结果表的集合运算符是INTERSECT ALL或INTERSECT DISTINCT,则列掩码不能应用于生成最终结果表的集合运算的选定列表。
为了与其他SQL实现兼容,UNIQUE可以被指定为DISTINCT的同义词。
- 值子句
- 通过为结果表中的每一行的每一列指定实际值,使用序列表达式,来生成结果表。
价值条款由以下内容构成:
- 单列结果表的单个序列表达式。
- n 序列表达式,以逗号分隔,并用括号括起来。 n 是结果表中的列数。
值子句中的所有结果列都是未命名的。
只能在 PREPARE 语句的 select-statement 的外部全查询中指定 values-clause。
排序子句
FL 500 有关 order-by-clause 的详细信息,请参阅 subselect。 在以下情况下,不能指定包含排序子句的完整选择:
- 最外层全选视图注意 :全选查询中的 ORDER BY 子句可能不会影响查询返回的行的顺序。 ORDER BY子句仅影响查询返回的行的顺序,前提是它被指定在最外层的fullselect中。 如果指定了偏移量子句或获取子句 ,则应指定按子句排序 ,以确保从全选中的行集确定可预测的顺序。
- 在SQL表函数的RETURN语句的外部fullselect中。
- 最外层全选视图
偏移条款
FL 500 详见 偏置条款。 在以下情况下,不能指定包含偏移子句的完全选择:
- 风景的定义
- 实体化查询表的定义
- 在SQL表函数的返回语句中
- 排队的定义
- 列掩码的定义
- 最外层全选,用于敏感动态光标
取语句
FL 500 详见 取语句。 在以下情况下,不能指定包含取语句的全选择:
- 实体化查询表的定义
- 最外层全选视图定义
- “SQL 表函数”的 RETURN 语句中的外层全查询
- 最外层全选,用于敏感动态光标
- 专栏规则
- R1 和 的列数必须相同,且 R2 R1 第n列的数据类型必须与 R2 第n列的数据类型兼容。
- 集合运算符结果的第n列来自 R1 和 R2 的第n列。 结果列的属性使用结果列的规则确定。
- R1 和 不得包含数据类型为CLOB、BLOB、DBCLOB、XML或基于上述任何类型的特定类型的列。 R2 但是,当UNION ALL与集合运算符一起使用时,此规则不适用。
- 如果 R1 的第n列和 R2 的第n列具有相同的列名,则集合运算结果表中的第n列具有相同的列名。 否则,集合运算结果表的第n列将没有名称。
- 当指定集合运算符时,限定列名不能用于ORDER BY子句。
有关操作数列的有效组合和结果列的数据类型的信息,请参阅结果数据类型规则。
- 重复行
如果第一行中每列的值与第二行中对应列的值相等,则这两行是重复的。 在判断重复项时,两个空值被视为相等。
DECFLOAT数据类型允许同一数字有多种位表示。 例如, 2.00 和 2.0 是两个系数相同但指数值不同的数字。 更多信息请参阅 “数字比较” 部分。 因此,如果UNION的结果表包含DECFLOAT列,并且同一个数字存在多个位表示,那么返回的结果是不可预测的。
- Operator precedence
- 当多个集合运算在表达式中组合时,括号内的集合运算优先执行。 如果未用括号指定顺序,则从左到右执行集合运算,但所有交集运算必须在任何并集运算或任何差集运算之前执行。
- 集合运算符的结果
- 下表显示了所有集合操作的结果,结果表 R1 和 R2 中的行作为前两列, R1 和 R2 的每个操作结果在相应的列标题下。
表 1. 结果表 R1 和 R2 上的UNION、EXCEPT和INTERSECT集合运算示例。 行数 R1 行数 R2 UNION ALL的结果 UNION DISTINCT的结果 结果 除了全部 结果 除了 不同 INTERSECT ALL的结果 INTERSECT DISTINCT的结果 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
全部选择示例
示例1:查询 指定了结果表 R1 和 R2 的并集。 R1 中有一列的数据类型为CHAR(10),子类型为BIT。 R2 中的相应列的数据类型为CHAR(15),子类型为SBCS。 因此,联合中的列具有数据类型 CHAR(15) 和子类型 BIT。 通过在第一个列中添加五个空格,将数值转换为 CHAR(15)。
示例 2:
显示 DSN8C10.EMP 的所有行。
SELECT * FROM DSN8C10.EMP;
示例 3:使用 示例表 DSN8C10.EMP 和 DSN8C10.EMPPROJACT ,列出满足以下任一条件的员工编号:
- 他们部门的号码以“
D
”开头。 - 他们被分配到项目编号以“
AD
”开头的项目。
SELECT EMPNO FROM DSN8C10.EMP WHERE WORKDEPT LIKE 'D%' UNION SELECT EMPNO FROM DSN8C10.EMPPROJACT WHERE PROJNO LIKE 'AD%';
结果是将两个结果表合并,一个由示例表 DSN8C10.EMP 组成,另一个由示例表 DSN8C10.EMPPROJACT 组成。 结果——一个单列表格——是员工编号列表。 因为使用的是UNION而非UNION ALL,所以列表中的条目是不同的。 如果使用 UNION ALL,某些员工编号会在列表中出现多次。 这些数字代表以“
D
”开头的部门员工,而他们的项目则以“AD
”开头。- 他们部门的号码以“
示例4:指定 一系列并集,并按最终结果表的第一列对结果排序。
SELECT * FROM T1 UNION SELECT * FROM T2 UNION SELECT * FROM T3 ORDER BY 1;
示例 5:指定 一系列并集,并按最终结果表的第一列对结果排序。 第一个ORDER BY子句根据结果表的第一个列对第一个并集的结果行进行排序。 第二个ORDER BY子句作为外部全选的一部分应用,它使最终结果表的行按最终结果表的第一列排序。
(SELECT * FROM T1 UNION SELECT * FROM T2 ORDER BY 1) UNION SELECT * FROM T3 ORDER BY 1;
例6:假设 表 T1 和 T2 存在,且每个表包含相同数量的列,分别命名为 C1、 C2 等。 EXCEPT运算符的示例:生成 T1 中所有行,但不包括 T2 中的行,并删除重复行:
(SELECT * FROM T1) EXCEPT DISTINCT (SELECT * FROM T2);
例7:假设 表 T1 和 T2 存在,且每个表包含相同数量的列,分别命名为 C1、 C2 等。 INTERSECT运算符的此示例将生成 T1 表和 T2 表中的所有行,并删除重复行:
(SELECT * FROM T1) INTERSECT DISTINCT (SELECT * FROM T2);
例8:获取 序列最近生成的值 MYSEQ1:
VALUES PREVIOUS VALUE FOR MYSEQ1;
- 示例9:获取 序列的下一个值 MYSEQ1:
VALUES NEXT VALUE FOR MYSEQ1;