select-clause
SELECT 子句指定最终结果表的列。
- 所有
- 保留最终结果表的所有行,并且不会消除冗余重复项。 这是缺省值。
- 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 终止字符串) 不同,那么结果列为变长字符串。 |
| 日期时间列的名称 | 与列的数据类型相同。 |
| 用户定义的类型列的名称 | 与列的数据类型相同。 |
| 引用类型列的名称 | 与列的数据类型相同。 |
