默认别名
📄字数 2.4K
👁️阅读量 加载中...
通常在 SELECT 查询中,会出现查询的结果集不是一个单纯的字段名,而是一个表达式的情况,例如:UPPER(employee_name), salary * 1.5 等,其中 employee_name 和 salary 是字段名。在这种情形下,数据库建议为表达式显式指定一个别名,这个别名应该是便于理解的。如果不指定,数据库会根据一定的规则生成一个默认的别名。默认别名根据不同的数据库兼容模式,遵循的规则也不尽相同。
接下来将详细介绍不同的数据库兼容模式下的默认别名规则。
默认数据库模式
当数据库的兼容模式参数 COMPATIBLE_MODE 被设置为 NONE 时,默认别名统一为 EXPR1, EXPR2, ..., EXPRN 格式,其中,EXPR1 表示查询结果集中第一个表达式的默认别名,EXPR2 表示查询结果集中第二个表达式的默认别名,EXPRN 表示查询结果集中第n个表达式的默认别名。
例如:
sql
SELECT name, UPPER(name), salary, salary * 1.5 from employees;
+------+-------+--------+-------+
| NAME | EXPR1 | SALARY | EXPR2 |
+------+-------+--------+-------+
| bob | BOB | 6000 | 9000 |
+------+-------+--------+-------+Oracle数据库兼容模式
当数据库的兼容模式参数 COMPATIBLE_MODE 被设置为 ORACLE 时,默认别名遵循以下规则,详见表1。
- 表1
| 类别 | 默认别名规则说明 | 其他说明 |
|---|---|---|
| 字面量 | 字面量表达式大写,去掉空格 | |
| NULL 值表达式 | 表达式大写,删除空格 | |
| 层次查询伪列 | 层次查询伪列表达式大写,删除空格 | |
| 序列伪列 | 表达式大写,删除空格 | Oracle 只显示 NEXTVAL 或 CURRVAL 大写形式(去掉序列名) |
| COLUMN_VALUE 伪列 | 返回⼀个单列的 COLUMN_VALUE 伪列大写形式 | |
| ROWID 伪列 | 返回 ROWID 伪列大写形式 | |
| ROWNUM 假列 | 返回 ROWNUM 伪列大写形式 | |
| 算术运算符 | 表达式大写,删除空格 | |
| || 运算符 | 表达式大写(整个拼接表达式),删除空格 | |
| 层级查询操作符 | 表达式大写(PRIOR操作符+列名),删除空格 | |
| 集合运算符 | 第一个SELECT 结果集表达式大写,删除空格 | |
| 简单表达式 | 表达式大写,删除空格 | |
| 复合表达式 | 表达式大写,删除空格 | |
| CASE 表达式 | 表达式大写,删除空格 | |
| 列表达式 | 表达式大写,删除空格 | |
| 日期时间表达式 | 日期时间表达式大写,删除空格 | |
| 函数表达式 | 函数表达式大写,删除空格 | |
| 间隔表达式 | 时间间隔表达式大写,删除空格 | |
| 标量子查询表达式 | 整个子查询表达式大写,删除空格 | |
| 类型构造表达式 | 类型构造表达式大写,删除空格 | |
| 表达式列表 | 整个表达式列表大写,删除空格 | |
| BOOLEAN 表达式 | 表达式大写,删除空格 | |
| 比较条件 | 表达式大写,删除空格 | |
| 浮点条件 | 表达式大写,删除空格 | |
| 逻辑条件 | 表达式大写,删除空格 | |
| 模式匹配条件 | 表达式大写,删除空格 | |
| NULL 条件 | 表达式大写,删除空格 | |
| 复合条件 | 表达式大写,删除空格 | |
| BETWEEN 条件 | 表达式大写,删除空格 | |
| EXISTS 条件 | 表达式大写,删除空格 | |
| IN 条件 | 表达式大写,删除空格 | |
| 布尔测试条件 | 表达式大写,删除空格 | |
| 聚合函数 | 表达式大写,删除空格 | |
| 分析函数 | 表达式大写,删除空格 | |
| 系统函数 | 表达式大写,删除空格 | 包括数值、字符串、日期时间等系统函数 |
| 用户自定义函数 | 表达式大写,删除空格 | |
| XML 函数 | 表达式大写,删除空格 | |
| JSON 函数 | 表达式大写,删除空格 | |
| 列被表名或者模式名限定 | 删除限定的表和模式,列或表达式大写,删除空格 |
其他规则
- 默认别名的最大长度为255字节(单字节字符最大长度为251个字节,多字节字符的最大长度为255个字节),若表达式超过最大长度则发生截断。
- 如果列是带双引号的简单列名,则默认别名是去掉双引号的列名,大小写保持不变。
注意
- 未尽事宜,以实际显示结果为准。
- ORACLE 兼容模式下,生成的默认别名均为大写形式。
MySQL数据库兼容模式
当数据库的兼容模式参数 COMPATIBLE_MODE 被设置为 MYSQL 时,默认别名遵循以下规则。
- 默认别名的最大长度为255,若表达式超过最大长度则发生截断。
- 如果列是简单列名,默认别名是该列名。
- 如果列是带反引号的简单列名,默认别名为去掉反引号的列名,大小写保持不变。
- MySQL 兼容模式下的默认别名和 Oracle 兼容模式下的默认别名相似,都是将整个表达式作为默认别名。最大的区别在于:MySQL 不删除表达式的空格,且大小写和输入保持一致。
PostgreSQL数据库兼容模式
当数据库的兼容模式参数 COMPATIBLE_MODE 被设置为 POSTGRESQL 时,默认别名遵循以下规则,详见表2。
- 表2
| 类别 | 默认别名规则说明 | 其他说明 |
|---|---|---|
| NULL | 默认别名是 ?column? | |
| 简单或者被限定的列名 | 默认别名是最后一个字段名 | 例如:().attr_name,默认别名是attr_name |
| 数组下标 | 默认别名是数组名 | |
| 函数 | 默认别名为函数名 | |
| NULLIF() 表达式 | 默认别名为nullif | 注:nullif()表达式被视为函数,类似decode()表达式,也应该被视为函数 |
| 类型转换表达式 | 默认别名为参数名,或者最后一个类型名 | |
| EXISTS_SUBLINK 子查询 | 默认别名为exists | 例如:exists (select ... from table_name) |
| EXPR_SUBLINK 子查询 | 默认别名为子查询中第一个查询结果,不是子查询,则为 ?column? | |
| ALL_SUBLINK 子查询 | 默认别名为 ?column? | |
| ANY_SUBLINK 子查询 | 默认别名为 ?column? | |
| case表达式 | 默认别名为默认值,或为case | |
| 数组表达式 | 默认别名为array | 例如:ARRAY[1,2,3],默认别名为array |
| 类型构造器 | 默认别名为自定义类型名 | |
| Coalesce表达式 | 默认别名为coalesce | 注:被视为函数 |
| greatest表达式 | 默认别名为greatest | 注:被视为函数 |
| least表达式 | 默认别名为least | 注:被视为函数 |
| xml表达式 | 默认别名为xml表达式的名字 | 注:被视为函数 |
| json表达式 | 默认别名为json表达式的名字 | 注:被视为函数 |
| 以上均不满足 | 默认别名为 ?column? |
注意
- 强烈建议 POSTGRESQL 兼容模式下,为表达式显式指定别名。
- POSTGRESQL 兼容模式下,生成的默认别名均为小写形式。
- 未尽事宜,以实际显示结果为准。
