Skip to main content

ClickHouse SQL方言 与ANSI SQL的兼容性

note

本文参考Annex G所著的ISO/IEC CD 9075-2:2011标准.

行为差异

下表列出了ClickHouse能够使用,但与ANSI SQL规定有差异的查询特性。

功能ID功能名称差异
E011数值型数据类型带小数点的数字被视为近似值 (Float64)而不是精确值 (Decimal)
E051-05SELECT 的列可以重命名字段重命名的作用范围不限于进行重命名的SELECT子查询(参考表达式别名
E141-01NOT NULL(非空)约束ClickHouse表中每一列默认为NOT NULL
E011-04算术运算符ClickHouse在运算时会进行溢出,而不是四舍五入。此外会根据自定义规则修改结果数据类型(参考溢出检查

功能状态

功能ID功能名称状态注释
E011数值型数据类型部分{.text-warning}
E011-01INTEGER (整型)和SMALLINT (小整型)数据类型是 {.text-success}
E011-02REAL (实数)、DOUBLE PRECISION (双精度浮点数)和FLOAT(单精度浮点数)数据类型数据类型是 {.text-success}
E011-03DECIMAL (精确数字)和NUMERIC (精确数字)数据类型是 {.text-success}
E011-04算术运算符是 {.text-success}
E011-05数值比较是 {.text-success}
E011-06数值数据类型之间的隐式转换否 {.text-danger}ANSI SQL允许在数值类型之间进行任意隐式转换,而ClickHouse针对不同数据类型有对应的比较函数和类型转换函数
E021字符串类型部分{.text-warning}
E021-01CHARACTER (字符串)数据类型是 {.text-success}
E021-02CHARACTER VARYING (可变字符串)数据类型是 {.text-success}
E021-03字符字面量是 {.text-success}
E021-04CHARACTER_LENGTH 函数部分 {.text-warning}不支持 using 从句
E021-05OCTET_LENGTH 函数否 {.text-danger}使用 LENGTH 函数代替
E021-06SUBSTRING部分 {.text-warning}不支持 SIMILARESCAPE 从句,没有SUBSTRING_REGEX 函数
E021-07字符串拼接部分 {.text-warning}不支持 COLLATE 从句
E021-08大小写转换是 {.text-success}
E021-09裁剪字符串是 {.text-success}
E021-10固定长度和可变长度字符串类型之间的隐式转换部分 {.text-warning}ANSI SQL允许在数据类型之间进行任意隐式转换,而ClickHouse针对不同数据类型有对应的比较函数和类型转换函数
E021-11POSITION 函数部分 {.text-warning}不支持 INUSING 从句,不支持POSITION_REGEX函数
E021-12字符串比较是 {.text-success}
E031标识符部分{.text-warning}
E031-01分隔标识符部分 {.text-warning}Unicode文字支持有限
E031-02小写标识符是 {.text-success}
E031-03标识符最后加下划线是 {.text-success}
E051基本查询规范部分{.text-warning}
E051-01SELECT DISTINCT是 {.text-success}
E051-02GROUP BY 从句是 {.text-success}
E051-04GROUP BY 从句中的列可以包含不在 <select list>中出现的列是 {.text-success}
E051-05SELECT 的列可以重命名是 {.text-success}
E051-06HAVING 从句是 {.text-success}
E051-07SELECT 选择的列中允许出现*是 {.text-success}
E051-08FROM 从句中的关联名称是 {.text-success}
E051-09重命名 FROM 从句中的列否 {.text-danger}
E061基本谓词和搜索条件部分{.text-warning}
E061-01比较谓词是 {.text-success}
E061-02BETWEEN 谓词部分 {.text-warning}不支持 SYMMETRICASYMMETRIC 从句
E061-03IN 谓词后可接值列表是 {.text-success}
E061-04LIKE 谓词是 {.text-success}
E061-05LIKE 谓词后接 ESCAPE 从句否 {.text-danger}
E061-06NULL 谓词是 {.text-success}
E061-07量化比较谓词(ALL、SOME、ANY)否 {.text-danger}
E061-08EXISTS 谓词否 {.text-danger}
E061-09比较谓词中的子查询是 {.text-success}
E061-11IN 谓词中的子查询是 {.text-success}
E061-12量化比较谓词(BETWEEN、IN、LIKE)中的子查询否 {.text-danger}
E061-13相关子查询否 {.text-danger}
E061-14搜索条件是 {.text-success}
E071基本查询表达式部分{.text-warning}
E071-01UNION DISTINCT 表运算符是 {.text-success}
E071-02UNION ALL 表运算符是 {.text-success}
E071-03EXCEPT DISTINCT 表运算符否 {.text-danger}
E071-05通过表运算符组合的列不必具有完全相同的数据类型是 {.text-success}
E071-06子查询中的表运算符是 {.text-success}
E081基本权限{.text-success}
E081-01表级别的SELECT(查询)权限是 {.text-success}
E081-02DELETE(删除)权限是 {.text-success}
E081-03表级别的INSERT(插入)权限是 {.text-success}
E081-04表级别的UPDATE(更新)权限是 {.text-success}
E081-05列级别的UPDATE(更新)权限是 {.text-success}
E081-06表级别的REFERENCES(引用)权限是 {.text-success}
E081-07列级别的REFERENCES(引用)权限是 {.text-success}
E081-08WITH GRANT OPTION是 {.text-success}
E081-09USAGE(使用)权限是 {.text-success}
E081-10EXECUTE(执行)权限是 {.text-success}
E091集合函数{.text-success}
E091-01AVG是 {.text-success}
E091-02COUNT是 {.text-success}
E091-03MAX是 {.text-success}
E091-04MIN是 {.text-success}
E091-05SUM是 {.text-success}
E091-06ALL修饰词否。 {.text-danger}
E091-07DISTINCT修饰词是 {.text-success}并非所有聚合函数都支持该修饰词
E101基本数据操作部分{.text-warning}
E101-01INSERT(插入)语句是 {.text-success}注:ClickHouse中的主键并不隐含UNIQUE 约束
E101-03可指定范围的UPDATE(更新)语句部分 {.text-warning}ALTER UPDATE 语句用来批量更新数据
E101-04可指定范围的DELETE(删除)语句部分 {.text-warning}ALTER DELETE 语句用来批量删除数据
E111返回一行的SELECT语句{.text-danger}
E121基本游标支持{.text-danger}
E121-01DECLARE CURSOR否 {.text-danger}
E121-02ORDER BY 涉及的列不需要出现在SELECT的列中是 {.text-success}
E121-03ORDER BY 从句中的表达式是 {.text-success}
E121-04OPEN 语句否 {.text-danger}
E121-06受游标位置控制的 UPDATE 语句否 {.text-danger}
E121-07受游标位置控制的 DELETE 语句否 {.text-danger}
E121-08CLOSE 语句否 {.text-danger}
E121-10FETCH 语句中包含隐式NEXT否 {.text-danger}
E121-17WITH HOLD 游标否 {.text-danger}
E131空值支持{.text-success}有部分限制
E141基本完整性约束部分{.text-warning}
E141-01NOT NULL(非空)约束是 {.text-success}注: 默认情况下ClickHouse表中的列隐含NOT NULL约束
E141-02NOT NULL(非空)列的UNIQUE(唯一)约束否 {.text-danger}
E141-03主键约束部分 {.text-warning}
E141-04对于引用删除和引用更新操作,基本的FOREIGN KEY(外键)约束默认不进行任何操作(NO ACTION)否 {.text-danger}
E141-06CHECK(检查)约束是 {.text-success}
E141-07列默认值是 {.text-success}
E141-08在主键上推断非空是 {.text-success}
E141-10可以按任何顺序指定外键中的名称否 {.text-danger}
E151事务支持{.text-danger}
E151-01COMMIT(提交)语句否 {.text-danger}
E151-02ROLLBACK(回滚)语句否 {.text-danger}
E152基本的SET TRANSACTION(设置事务隔离级别)语句{.text-danger}
E152-01SET TRANSACTION语句:ISOLATION LEVEL SERIALIZABLE(隔离级别为串行化)从句否 {.text-danger}
E152-02SET TRANSACTION语句:READ ONLY(只读)和READ WRITE(读写)从句否 {.text-danger}
E153具有子查询的可更新查询{.text-success}
E161使用“--”符号作为SQL注释{.text-success}
E171SQLSTATE支持{.text-danger}
E182主机语言绑定{.text-danger}
F031基本架构操作部分{.text-warning}
F031-01使用 CREATE TABLE 语句创建持久表部分 {.text-warning}不支持 SYSTEM VERSIONING, ON COMMIT, GLOBAL, LOCAL, PRESERVE, DELETE, REF IS, WITH OPTIONS, UNDER, LIKE, PERIOD FOR 从句,不支持用户解析的数据类型
F031-02CREATE VIEW(创建视图)语句部分 {.text-warning}不支持 RECURSIVE, CHECK, UNDER, WITH OPTIONS 从句,不支持用户解析的数据类型
F031-03GRANT(授权)语句是 {.text-success}
F031-04ALTER TABLE语句:ADD COLUMN从句是 {.text-success}不支持 GENERATED 从句和以系统时间做参数
F031-13DROP TABLE语句:RESTRICT从句否 {.text-danger}
F031-16DROP VIEW语句:RESTRICT子句否 {.text-danger}
F031-19REVOKE语句:RESTRICT子句否 {.text-danger}
F041基本连接关系部分{.text-warning}
F041-01Inner join(但不一定是INNER关键字)是 {.text-success}
F041-02INNER 关键字是 {.text-success}
F041-03LEFT OUTER JOIN是 {.text-success}
F041-04RIGHT OUTER JOIN是 {.text-success}
F041-05外连接可嵌套是 {.text-success}
F041-07左外部连接或右外连接中的内部表也可用于内部联接是 {.text-success}
F041-08支持所有比较运算符(而不仅仅是=)否 {.text-danger}
F051基本日期和时间部分{.text-warning}
F051-01DATE(日期)数据类型(并支持用于表达日期的字面量)是 {.text-success}
F051-02TIME(时间)数据类型(并支持用于表达时间的字面量),小数秒精度至少为0否 {.text-danger}
F051-03时间戳数据类型(并支持用于表达时间戳的字面量),小数秒精度至少为0和6是 {.text-danger}
F051-04日期、时间和时间戳数据类型的比较谓词是 {.text-success}
F051-05DateTime 类型和字符串形式表达的时间之间的显式转换是 {.text-success}
F051-06CURRENT_DATE否 {.text-danger}使用today()替代
F051-07LOCALTIME否 {.text-danger}使用now()替代
F051-08LOCALTIMESTAMP否 {.text-danger}
F081视图的UNION和EXCEPT操作部分{.text-warning}
F131分组操作部分{.text-warning}
F131-01在具有分组视图的查询中支持 WHERE、GROUP BY 和 HAVING 子句是 {.text-success}
F131-02在分组视图中支持多张表是 {.text-success}
F131-03分组视图的查询中支持集合函数是 {.text-success}
F131-04带有 GROUP BYHAVING 从句,以及分组视图的子查询是 {.text-success}
F131-05带有 GROUP BYHAVING 从句,以及分组视图的仅返回1条记录的SELECT查询否 {.text-danger}
F181多模块支持{.text-danger}
F201CAST 函数{.text-success}
F221显式默认值{.text-danger}
F261CASE 表达式{.text-success}
F261-01简单 CASE 表达式是 {.text-success}
F261-02搜索型 CASE 表达式是 {.text-success}
F261-03NULLIF是 {.text-success}
F261-04COALESCE是 {.text-success}
F311架构定义语句部分{.text-warning}
F311-01CREATE SCHEMA部分 {.text-warning}CREATE DATABASE
F311-02用于创建持久表的 CREATE TABLE是 {.text-success}
F311-03CREATE VIEW是 {.text-success}
F311-04CREATE VIEW: WITH CHECK OPTION否 {.text-danger}
F311-05GRANT 语句是 {.text-success}
F471标量子查询{.text-success}
F481扩展 NULL 谓词{.text-success}
F812基本标志位{.text-danger}
S011用于不重复数据的数据类型{.text-danger}
T321基本的SQL调用例程{.text-danger}
T321-01没有重载的用户定义函数否{.text-danger}
T321-02没有重载的用户定义存储过程否{.text-danger}
T321-03功能调用否 {.text-danger}
T321-04CALL 语句否 {.text-danger}
T321-05RETURN 语句否 {.text-danger}
T631IN 谓词后接一个列表{.text-success}