ClickHouse SQL 方言的 ANSI SQL 兼容性
注意
本文依赖于 ISO/IEC CD 9075-2:2011 附录 F 中的表 38“强制功能的特征分类和定义”。
行为差异
下表列出了查询功能在 ClickHouse 中有效,但行为与 ANSI SQL 中指定的不同之处。
功能 ID | 功能名称 | 差异 |
---|---|---|
E011 | 数值数据类型 | 带小数点的数值字面量被解释为近似值 (Float64 ),而不是精确值 (Decimal ) |
E051-05 | 选择项可以重命名 | 项重命名具有比 SELECT 结果更广泛的可见范围 |
E141-01 | NOT NULL 约束 | 默认情况下,表列隐含 NOT NULL |
E011-04 | 算术运算符 | ClickHouse 会溢出,而不是进行检查算术运算,并根据自定义规则更改结果数据类型 |
功能状态
功能 ID | 功能名称 | 状态 | 评论 |
---|---|---|---|
E011 | 数值数据类型 | 部分 | |
E011-01 | INTEGER 和 SMALLINT 数据类型 | 是 | |
E011-02 | REAL、DOUBLE PRECISION 和 FLOAT 数据类型 | 是 | |
E011-03 | DECIMAL 和 NUMERIC 数据类型 | 是 | |
E011-04 | 算术运算符 | 是 | |
E011-05 | 数值比较 | 是 | |
E011-06 | 数值数据类型之间的隐式转换 | 否 | ANSI SQL 允许在数值类型之间进行任意隐式转换,而 ClickHouse 依赖于具有多个重载的函数,而不是隐式转换 |
E021 | 字符字符串类型 | 部分 | |
E021-01 | CHARACTER 数据类型 | 是 | |
E021-02 | CHARACTER VARYING 数据类型 | 是 | |
E021-03 | 字符字面量 | 是 | |
E021-04 | CHARACTER_LENGTH 函数 | 部分 | 没有 USING 子句 |
E021-05 | OCTET_LENGTH 函数 | 否 | LENGTH 的行为类似 |
E021-06 | SUBSTRING | 部分 | 不支持 SIMILAR 和 ESCAPE 子句,没有 SUBSTRING_REGEX 变体 |
E021-07 | 字符串连接 | 部分 | 没有 COLLATE 子句 |
E021-08 | UPPER 和 LOWER 函数 | 是 | |
E021-09 | TRIM 函数 | 是 | |
E021-10 | 固定长度和可变长度字符字符串类型之间的隐式转换 | 部分 | ANSI SQL 允许在字符串类型之间进行任意隐式转换,而 ClickHouse 依赖于具有多个重载的函数,而不是隐式转换 |
E021-11 | POSITION 函数 | 部分 | 不支持 IN 和 USING 子句,没有 POSITION_REGEX 变体 |
E021-12 | 字符比较 | 是 | |
E031 | 标识符 | 部分 | |
E031-01 | 分隔标识符 | 部分 | Unicode 字面量支持有限 |
E031-02 | 小写标识符 | 是 | |
E031-03 | 尾随下划线 | 是 | |
E051 | 基本查询规范 | 部分 | |
E051-01 | SELECT DISTINCT | 是 | |
E051-02 | GROUP BY 子句 | 是 | |
E051-04 | GROUP BY 可以包含不在 <select list> 中的列 | 是 | |
E051-05 | 选择项可以重命名 | 是 | |
E051-06 | HAVING 子句 | 是 | |
E051-07 | 限定*在选择列表中 | 是 | |
E051-08 | FROM 子句中的相关名称 | 是 | |
E051-09 | 在 FROM 子句中重命名列 | 否 | |
E061 | 基本谓词和搜索条件 | 部分 | |
E061-01 | 比较谓词 | 是 | |
E061-02 | BETWEEN 谓词 | 部分 | 没有 SYMMETRIC 和 ASYMMETRIC 子句 |
E061-03 | 带有值列表的 IN 谓词 | 是 | |
E061-04 | LIKE 谓词 | 是 | |
E061-05 | LIKE 谓词:ESCAPE 子句 | 否 | |
E061-06 | NULL 谓词 | 是 | |
E061-07 | 量化比较谓词 | 否 | |
E061-08 | EXISTS 谓词 | 否 | |
E061-09 | 比较谓词中的子查询 | 是 | |
E061-11 | IN 谓词中的子查询 | 是 | |
E061-12 | 量化比较谓词中的子查询 | 否 | |
E061-13 | 相关子查询 | 否 | |
E061-14 | 搜索条件 | 是 | |
E071 | 基本查询表达式 | 部分 | |
E071-01 | UNION DISTINCT 表运算符 | 是 | |
E071-02 | UNION ALL 表运算符 | 是 | |
E071-03 | EXCEPT DISTINCT 表运算符 | 否 | |
E071-05 | 通过表运算符组合的列不必具有完全相同的数据类型 | 是 | |
E071-06 | 子查询中的表运算符 | 是 | |
E081 | 基本权限 | 是 | |
E081-01 | 表级别的 SELECT 权限 | 是 | |
E081-02 | DELETE 权限 | ||
E081-03 | 表级别的 INSERT 权限 | 是 | |
E081-04 | 表级别的 UPDATE 权限 | 是 | |
E081-05 | 列级别的 UPDATE 权限 | ||
E081-06 | 表级别的 REFERENCES 权限 | ||
E081-07 | 列级别的 REFERENCES 权限 | ||
E081-08 | WITH GRANT OPTION | 是 | |
E081-09 | USAGE 权限 | ||
E081-10 | EXECUTE 权限 | ||
E091 | 集合函数 | 是 | |
E091-01 | AVG | 是 | |
E091-02 | COUNT | 是 | |
E091-03 | MAX | 是 | |
E091-04 | MIN | 是 | |
E091-05 | SUM | 是 | |
E091-06 | ALL 量词 | 是 | |
E091-07 | DISTINCT 量词 | 是 | 并非所有聚合函数都受支持 |
E101 | 基本数据操作 | 部分 | |
E101-01 | INSERT 语句 | 是 | 注意:ClickHouse 中的主键不暗示 UNIQUE 约束 |
E101-03 | 带搜索条件的 UPDATE 语句 | 部分 | 有一个 ALTER UPDATE 语句用于批处理数据修改 |
E101-04 | 带搜索条件的 DELETE 语句 | 部分 | 有一个 ALTER DELETE 语句用于批处理数据删除 |
E111 | 单行 SELECT 语句 | 否 | |
E121 | 基本游标支持 | 否 | |
E121-01 | DECLARE CURSOR | 否 | |
E121-02 | ORDER BY 列不必出现在选择列表中 | 是 | |
E121-03 | ORDER BY 子句中的值表达式 | 是 | |
E121-04 | OPEN 语句 | 否 | |
E121-06 | 定位 UPDATE 语句 | 否 | |
E121-07 | 定位 DELETE 语句 | 否 | |
E121-08 | CLOSE 语句 | 否 | |
E121-10 | FETCH 语句:隐式 NEXT | 否 | |
E121-17 | WITH HOLD 游标 | 否 | |
E131 | 空值支持(空值代替值) | 是 | 有一些限制 |
E141 | 基本完整性约束 | 部分 | |
E141-01 | NOT NULL 约束 | 是 | 注意:默认情况下,表列隐含 NOT NULL |
E141-02 | NOT NULL 列的 UNIQUE 约束 | 否 | |
E141-03 | PRIMARY KEY 约束 | 部分 | |
E141-04 | 基本 FOREIGN KEY 约束,对引用删除操作和引用更新操作都使用 NO ACTION 默认值 | 否 | |
E141-06 | CHECK 约束 | 是 | |
E141-07 | 列默认值 | 是 | |
E141-08 | PRIMARY KEY 上推断的 NOT NULL | 是 | |
E141-10 | 外键中的名称可以按任何顺序指定 | 否 | |
E151 | 事务支持 | 否 | |
E151-01 | COMMIT 语句 | 否 | |
E151-02 | ROLLBACK 语句 | 否 | |
E152 | 基本 SET TRANSACTION 语句 | 否 | |
E152-01 | SET TRANSACTION 语句:ISOLATION LEVEL SERIALIZABLE 子句 | 否 | |
E152-02 | SET TRANSACTION 语句:READ ONLY 和 READ WRITE 子句 | 否 | |
E153 | 带有子查询的可更新查询 | 是 | |
E161 | 使用前导双减号的 SQL 注释 | 是 | |
E171 | SQLSTATE 支持 | 否 | |
E182 | 宿主语言绑定 | 否 | |
F031 | 基本模式操作 | 部分 | |
F031-01 | CREATE TABLE 语句用于创建持久基本表 | 部分 | 没有 SYSTEM VERSIONING 、ON COMMIT 、GLOBAL 、LOCAL 、PRESERVE 、DELETE 、REF IS 、WITH OPTIONS 、UNDER 、LIKE 、PERIOD FOR 子句,也不支持用户解析的数据类型 |
F031-02 | CREATE VIEW 语句 | 部分 | 没有 RECURSIVE 、CHECK 、UNDER 、WITH OPTIONS 子句,也不支持用户解析的数据类型 |
F031-03 | GRANT 语句 | 是 | |
F031-04 | ALTER TABLE 语句:ADD COLUMN 子句 | 是 | 不支持 GENERATED 子句和系统时间段 |
F031-13 | DROP TABLE 语句:RESTRICT 子句 | 否 | |
F031-16 | DROP VIEW 语句:RESTRICT 子句 | 否 | |
F031-19 | REVOKE 语句:RESTRICT 子句 | 否 | |
F041 | 基本联接表 | 部分 | |
F041-01 | 内联接(但不一定是 INNER 关键字) | 是 | |
F041-02 | INNER 关键字 | 是 | |
F041-03 | LEFT OUTER JOIN | 是 | |
F041-04 | RIGHT OUTER JOIN | 是 | |
F041-05 | 外联接可以嵌套 | 是 | |
F041-07 | 左或右外联接中的内部表也可以用于内联接 | 是 | |
F041-08 | 支持所有比较运算符(而不仅仅是 =) | 否 | |
F051 | 基本日期和时间 | 部分 | |
F051-01 | DATE 数据类型(包括 DATE 字面量的支持) | 是 | |
F051-02 | TIME 数据类型(包括 TIME 字面量的支持),小数秒精度至少为 0 | 否 | |
F051-03 | TIMESTAMP 数据类型(包括 TIMESTAMP 字面量的支持),小数秒精度至少为 0 和 6 | 是 | |
F051-04 | 对 DATE、TIME 和 TIMESTAMP 数据类型的比较谓词 | 是 | |
F051-05 | 日期时间类型和字符字符串类型之间的显式 CAST | 是 | |
F051-06 | CURRENT_DATE | 否 | today() 类似 |
F051-07 | LOCALTIME | 否 | now() 类似 |
F051-08 | LOCALTIMESTAMP | 否 | |
F081 | 视图中的 UNION 和 EXCEPT | 部分 | |
F131 | 分组操作 | 部分 | |
F131-01 | WHERE、GROUP BY 和 HAVING 子句在包含分组视图的查询中受支持 | 是 | |
F131-02 | 包含分组视图的查询中支持多个表 | 是 | |
F131-03 | 包含分组视图的查询中支持集合函数 | 是 | |
F131-04 | 包含 GROUP BY 和 HAVING 子句以及分组视图的子查询 | 是 | |
F131-05 | 包含 GROUP BY 和 HAVING 子句以及分组视图的单行 SELECT | 否 | |
F181 | 多模块支持 | 否 | |
F201 | CAST 函数 | 是 | |
F221 | 显式默认值 | 否 | |
F261 | CASE 表达式 | 是 | |
F261-01 | 简单 CASE | 是 | |
F261-02 | 搜索 CASE | 是 | |
F261-03 | NULLIF | 是 | |
F261-04 | COALESCE | 是 | |
F311 | 模式定义语句 | 部分 | |
F311-01 | CREATE SCHEMA | 部分 | 参见 CREATE DATABASE |
F311-02 | 用于持久基本表的 CREATE TABLE | 是 | |
F311-03 | CREATE VIEW | 是 | |
F311-04 | CREATE VIEW: WITH CHECK OPTION | 否 | |
F311-05 | GRANT 语句 | 是 | |
F471 | 标量子查询值 | 是 | |
F481 | 扩展 NULL 谓词 | 是 | |
F812 | 基本标记 | 否 | |
S011 | 不同数据类型 | ||
T321 | 基本 SQL 调用例程 | 否 | |
T321-01 | 无重载的用户定义函数 | 否 | |
T321-02 | 无重载的用户定义存储过程 | 否 | |
T321-03 | 函数调用 | 否 | |
T321-04 | CALL 语句 | 否 | |
T321-05 | RETURN 语句 | 否 | |
T631 | 包含一个列表元素的 IN 谓词 | 是 |