select-clause

SELECT 子句指定最终结果表的列。

Read syntax diagramSkip visual syntax diagramSELECTALLDISTINCT,*expressionASnew-column-nameexposed-name.*
列值由 选择列表 应用程序生成到最终结果表 R。 选择列表是 SELECT 子句中指定的名称或表达式, R 是子查询的先前操作的结果。 例如,如果指定的唯一子句是 SELECT , FROM 和 WHERE ,那么 R 是该 WHERE 子句的结果。
所有
保留最终结果表的所有行,并且不会消除冗余重复项。 这是缺省值。
DISTINCT
消除最终结果表的所有重复行,但每组重复行中的一个。 如果使用 DISTINCT ,那么结果表 的任何字符串列都不能是 LOB 类型,基于 LOB 的单值类型或结构化类型。 可在子查询中多次使用 DISTINCT。 这包括 SELECT DISTINCT ,在 SELECT 列表或 HAVING 子句的聚集函数中使用 DISTINCT 以及子查询的子查询。

仅当第一行中的每个值都等于第二行中的相应值时,这两行才是彼此重复的。 对于确定重复项,两个空值被视为相等,两个相同数字的不同十进制浮点表示被视为相等。 例如, -0 等于 + 0 , 2.0 等于 2.00。 每个十进制浮点特殊值也被视为相等: -NAN 等于 -NAN , -SNAN 等于 -SNAN , -INFINITY 等于 -INFINITY , INFINITY 等于 INFINITY , SNAN 等于 SNAN , NAN 等于 NAN

当列的数据类型为十进制浮点,并且该列中存在多个相同数字的表示时,针对 SELECT DISTINCT 返回的特定值可以是该列中的任何一个表示。 有关更多信息,请参阅 数字比较

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

选择列表表示法

*
表示用于标识表 R的列的名称列表,不包括定义为隐式 HIDDEN的任何列。 列表中的第一个名称标识 R的第一列,第二个名称标识 R的第二列,依此类推。

当绑定包含 SELECT 子句的程序时,将建立名称列表。 因此,在绑定包含表引用的语句之后,星号 (*) 不会标识已添加到表中的任何列。

expression
指定结果列的值。 可以是任何作为有效 SQL 语言元素的表达式,但通常包括列名。 选择列表中使用的每个列名都必须明确标识 R 列。 表达式的结果类型不能是行类型 (SQLSTATE 428H2)
new-column-name AS new-column-name
对结果列进行命名或重命名。 名称不得限定,也不必唯一。 列名称的后续用法限制如下:
  • 可以在 order-by 子句中使用 AS 子句中指定的 new-column-name ,前提是该名称是唯一的。
  • 在选择列表的 AS 子句中指定的 new-column-name 不能用于子查询中的任何其他子句 (where-clause , group-by-clause 或 having-clause)。
  • 不能在 update-子句中使用 AS 子句中指定的 new-column-name
  • 在 AS 子句中指定的 new-column-name 在嵌套表表达式,公共表表达式和 CREATE VIEW 的全查询外部已知。
已公开-名称 .*
表示用于标识由 公开名称标识的结果表的列的名称列表,不包括定义为隐式 HIDDEN的任何列。 公开名称 可以是表名,视图名称,昵称或相关名称,并且必须指定在 FROM 子句中指定的表,视图或昵称。 列表中的第一个名称标识表的第一列,视图或昵称,列表中的第二个名称标识表的第二列,视图或昵称等。

当绑定包含 SELECT 子句的语句时,将建立名称列表。 因此, * 不会标识在绑定语句之后已添加到表中的任何列。

SELECT 结果中的列数与选择列表的操作形式 (即,准备语句时建立的列表) 中的表达式数相同,对于 4K 页大小,不能超过 500; 对于 8K, 16K或 32K 页大小,不能超过 1012。

对字符串列的限制

有关在选择列表上使用变长字符串的限制,请参阅 字符串

应用选择列表

将选择列表应用于 R 的某些结果取决于是使用 GROUP BY 还是 HAVING。 结果在两个单独的列表中进行了描述。

如果使用 GROUP BY 或 HAVING

  • 在选择列表中使用的表达式 X (不是聚集函数) 必须具有具有以下内容的 GROUP BY 子句:
    • 分组表达式 ,其中每个 表达式或 列名称明确地标识 R 的列 (请参阅 group-by-clause) 或
    • X 中引用的 R 的每个列作为单独的 分组表达式
  • 选择列表将应用于 R 的每个组,结果包含的行数与 R 中的组数相同。 当选择列表应用于 R 组时,该组是选择列表中聚集函数的自变量的源。

如果既不使用 GROUP BY 也不使用 HAVING

  • 选择列表不得包含任何聚集函数,或者选择列表中的每个 column-name 都必须在聚集函数中指定,或者必须是相关的列引用。
  • 如果选择不包含聚集函数,那么选择列表将应用于 R 的每行,并且结果包含 R 中的行数。
  • 如果选择列表是聚集函数的列表,那么 R 是函数自变量的源,应用选择列表的结果是一行。

在任一情况下,结果的第 n列都包含通过以选择列表的操作形式应用第 n个表达式指定的值。

结果列的属性为空

如果结果列派生自以下内容,那么不允许空值:
  • 不允许空值的列
  • 常量
  • COUNT 或 COUNT_BIG 函数
  • 没有指示符变量的主变量
  • 不包含允许为空的操作数的标量函数或表达式
  • 具有结果类型的表达式,该结果类型是使用 NOT NULL 数据类型约束定义的弱类型单值类型
如果空值派生自以下内容,那么结果列允许空值:
  • 除 COUNT 或 COUNT_BIG 以外的任何聚集函数
  • 允许空值的列
  • 包含允许为空的操作数的标量函数或表达式
  • 自变量包含相等值的 NULLIF 函数
  • 具有指示符变量, SQL 参数, SQL 变量或全局变量 的主变量
  • 如果选择列表中的至少一个相应项可空,那么集合操作的结果
  • 派生自算术表达式和数据库的算术表达式或视图列,并将 dft_sqlmathwarn 设置为 "是"
  • 标量子查询
  • 取消引用操作
  • GROUPING SETS 分组表达式

结果列的名称

  • 如果指定了 AS 子句,那么结果列的名称是在 AS 子句上指定的名称。
  • 如果未指定 AS 子句,并且在关联子句中指定了列列表,那么结果列的名称是关联列列表中的相应名称。
  • 如果既未指定 AS 子句,也未指定关联子句中的列列表,并且如果结果列仅派生自单个列 (没有任何函数或运算符) ,那么结果列的名称是该列的非限定名。
  • 如果既未指定 AS 子句,也未指定关联子句中的列列表,并且如果结果列仅派生自单个 SQL 变量或 SQL 参数 (没有任何函数或运算符) ,那么结果列的名称是该 SQL 变量或 SQL 参数的非限定名。
  • 如果既未指定 AS 子句,也未指定关联子句中的列列表,并且如果使用取消引用操作来派生结果列,那么结果列的名称是取消引用操作的目标列的非限定名。
  • 所有其他结果列都未命名。 系统将临时数字 (作为字符串) 分配给这些列。

结果列的数据类型

SELECT 结果的每列都从从中派生数据类型的表达式中获取数据类型。

当表达式是 ... 结果列的数据类型为 ...
任何数字列的名称 与列的数据类型相同,对于 DECIMAL 列具有相同的精度和小数位, 或 DECFLOAT 列的相同精度
常量 与常量的数据类型相同。
任何数字变量的名称 与变量的数据类型相同,对于 DECIMAL 变量具有相同的精度和小数位, 或 DECFLOAT 变量的相同精度
任何字符串列的名称 与列的数据类型相同,具有相同的长度属性。
任何字符串变量的名称 与变量的数据类型相同,具有相同的长度属性; 如果变量的数据类型与 SQL 数据类型 (例如, C 中的 NUL 终止字符串) 不同,那么结果列为变长字符串。
日期时间列的名称 与列的数据类型相同。
用户定义的类型列的名称 与列的数据类型相同。
引用类型列的名称 与列的数据类型相同。