全查询

fullselect是 select语句、用于定义具体化查询表的ALTER TABLE语句、CREATE TABLE语句、CREATE VIEW语句、DECLARE GLOBAL TEMPORARY TABLE语句、INSERT语句、UPDATE语句和MERGE语句的组成部分。

授权全选

请参阅查询授权

全选语法

阅读语法图跳过可视化语法图子查询( 全查询)值子句1UNIONEXCEPTINTERSECTDISTINCTALL子查询( 全查询)order-by-clauseoffset-clausefetch-子句
值子句
阅读语法图跳过可视化语法图 VALUES sequence-reference(, sequence-reference)
注意:
  • 1 如果指定了 values-clause ,则不能同时指定 UNION、EXCEPT、INTERSECT、 order-by-clausefetch-clause。 如果 fullselect 包含 values-clause ,则只能在 PREPARE 语句中通过 statement-name 引用的 select 语句中指定 fullselect。

描述

括号中的全选称为子查询。 例如,子查询可用于搜索条件。

标量全选(scalar-fullselect) 是一个全选,用括号括起来,返回一个结果行和一个结果列。 如果全选的结果为空,则返回空值。 如果结果中有多行,则返回错误。 例如,标量全选可用于DELETE、UPDATE和MERGE语句的赋值子句中。

A row-fullselect 是一个返回单行的全选。 如果结果中有多行,则返回错误。 例如,行全选可用于DELETE和UPDATE语句的赋值子句中。

UNIONEXCEPTINTERSECT
集合运算符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.EMPDSN8C10.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;