ClickHouse 语法详解
ClickHouse有2类解析器:完整SQL解析器(递归式解析器),以及数据格式解析器(快速流式解析器) 除了 INSERT 查询,其它情况下仅使用完整SQL解析器。 INSERT查询会同时使用2种解析器:
INSERT INTO t VALUES (1, 'Hello, world'), (2, 'abc'), (3, 'def')
含INSERT INTO t VALUES 的部分由完整SQL解析器处理,包含数据的部分 (1, 'Hello, world'), (2, 'abc'), (3, 'def') 交给快速流式解析器解析。通过设置参数 input_format_values_interpret_expressions,你也可以对数据部分开启完整SQL解析器。当 input_format_values_interpret_expressions = 1 时,ClickHouse优先采用快速流式解析器来解析数据。如果失败,ClickHouse再尝试用完整SQL解析器来处理,就像处理SQL expression 一样。
数据可以采用任何格式。当CH接收到请求时,服务端先在内存中计算不超过 max_query_size 字节的请求数据(默认1 mb),然后剩下部分交给快速流式解析器。
当 INSERT 语句中使用 Values 格式时,看起来数据部分的解析和解析SELECT 中的表达式相同,但并不是这样的。 Values 格式有非常多的限制。
本文的剩余部分涵盖了完整SQL解析器。关于格式解析的更多信息,参见 Formats 章节。
空白
sql语句的语法结构部分之间(标识符之间、部分符号之间、包括sql的起始和结束)可以有任意的空白字符,这些空字符类型包括:空格字符,tab制表符,换行符,CR符,换页符等。
注释
ClickHouse支持SQL风格或C语言风格的注释:
SQL风格的注释以 -- 开始,直到行末,-- 后紧跟的空格可以忽略
C语言风格的注释以 /* 开始,以 */ 结束,可以跨行,同样可以省略 /* 后的空格
关键字
以下场景的关键字是大小写不敏感的:
标准SQL。例如,SELECT, select 和 SeLeCt 都是允许的
在某些流行的RDBMS中被实现的关键字,例如,DateTime 和 datetime是一样的
你可以在系统表 system.data_type_families 中检查某个数据类型的名称是否是大小写敏感型。
和标准SQL相反,所有其它的关键字都是 大小写敏感的,包括函数名称。
关键字不是保留的;它们仅在相应的上下文中才会被认为是关键字。如果你使用和关键字同名的 标识符 ,需要使用双引号或反引号将它们包含起来。例如:如果表 table_name 包含列 "FROM",那么 SELECT "FROM" FROM table_name 是合法的
标识符
标识符包括:
集群、数据库、表、分区、列的名称
函数
数据类型
表达式别名
变量名可以被括起或不括起,后者是推荐做法。
没有括起的变量名,必须匹配正则表达式 ^[a-zA-Z_][0-9a-zA-Z_]*$,并且不能和 关键字相同,合法的标识符名称:x,_1,X_y__Z123_等。
如果想使用和关键字同名的变量名称,或者在变量名称中包含其它符号,你需要通过双引号或反引号,例如: "id", `id`
字符
字符包含数字,字母,括号,NULL值等字符。
数字
数字类型字符会被做如下解析:
首先,当做64位的有符号整数,使用函数 strtoull
如果失败,解析成64位无符号整数,同样使用函数 strtoull
如果还失败了,试图解析成浮点型数值,使用函数 strtod
最后,以上情形都不符合时,返回异常
数字类型的值类型为能容纳该值的最小数据类型。 例如:1 解析成 UInt8型,256 则解析成 UInt16。更多信息,参见 数据类型
例如: 1, 18446744073709551615, 0xDEADBEEF, 01, 0.1, 1e100, -1e-100, inf, nan.
字符串
ClickHouse只支持用单引号包含的字符串。特殊字符可通过反斜杠进行转义。下列转义字符都有相应的实际值: \b, \f, \r, \n, \t, \0, \a, \v, \xHH。其它情况下,以 \c形式出现的转义字符,当c表示任意字符时,转义字符会转换成c。这意味着你可以使用 \'和\\。该值将拥有String类型。
在字符串中,你至少需要对 ' 和 \ 进行转义。单引号可以使用单引号转义,例如 'It\'s' 和 'It''s' 是相同的。
复合字符串
数组都是使用方括号进行构造 [1, 2, 3],元组则使用圆括号 (1, 'Hello, world!', 2) 从技术上来讲,这些都不是字符串,而是包含创建数组和元组运算符的表达式。 创建一个数组必须至少包含一个元素,创建一个元组至少包含2个元素 当元组出现在 SELECT 查询的 IN 部分时,是一种例外情形。查询结果可以包含元组,但是元组类型不能保存到数据库中(除非表采用 内存表引擎)
NULL值
代表不存在的值。
为了能在表字段中存储NULL值,该字段必须声明为 空值 类型。 根据数据的格式(输入或输出),NULL值有不同的表现形式。更多信息参见文档 数据格式
在处理 NULL时存在很多细微差别。例如,比较运算的至少一个参数为 NULL ,则该结果也是 NULL 。与之类似的还有乘法运算, 加法运算,以及其它运算。更多信息,请参阅每种运算的文档部分。
在语句中,可以通过 IS NULL 以及 IS NOT NULL 运算符,以及 isNull 、 isNotNull 函数来检查 NULL 值
函数
函数调用的写法,类似于一个标识符后接被圆括号包含的参数列表(可能为空)。与标准SQL不同,圆括号是必须的,不管参数列表是否为空。例如: now()。
函数分为常规函数和聚合函数(参见“Aggregate functions”一章)。有些聚合函数包含2个参数列表,第一个参数列表中的参数被称为“parameters”。不包含“parameters”的聚合函数语法和常规函数是一样的。
运算符
在查询解析阶段,运算符会被转换成对应的函数,使用时请注意它们的优先级。例如: 表达式 1 + 2 * 3 + 4 会被解析成 plus(plus(1, multiply(2, 3)), 4).
数据类型及数据库/表引擎
CREATE 语句中的数据类型和表引擎写法与变量或函数类似。 换句话说,它们可以包含或不包含用括号包含的参数列表。更多信息,参见“数据类型,” “数据表引擎” 和 “CREATE语句”等章节
表达式别名
别名是用户对表达式的自定义名称
expr AS alias
AS — 用于定义别名的关键字。可以对表或select语句中的列定义别名(AS 可以省略) 例如, SELECT table_name_alias.column_name FROM table_name table_name_alias.
在 CAST函数 中,AS有其它含义。请参见该函数的说明部分。
expr — 任意CH支持的表达式.
例如, SELECT column_name * 2 AS double FROM some_table.
alias — expr 的名称。别名必须符合 标识符 语法.
例如, SELECT "table t".column_name FROM table_name AS "table t".
用法注意
别名在当前查询或子查询中是全局可见的,你可以在查询语句的任何位置对表达式定义别名
别名在当前查询的子查询及不同子查询中是不可见的。例如,执行如下查询SQL: SELECT (SELECT sum(b.a) + num FROM b) - a.a AS num FROM a ,ClickHouse会提示异常 Unknown identifier: num.
如果给select子查询语句的结果列定义其别名,那么在外层可以使用该别名。例如, SELECT n + m FROM (SELECT 1 AS n, 2 AS m).
注意列的别名和表的别名相同时的情形,考虑如下示例:
CREATE TABLE t( a Int, b Int)ENGINE = TinyLog()
SELECT argMax(a, b), sum(b) AS bFROM t
Received exception from server (version 18.14.17):Code: 184. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Aggregate function sum(b) is found inside another aggregate function in query.
在这个示例中,先声明了表 t 以及列 b。然后,在查询数据时,又定义了别名 sum(b) AS b。由于别名是全局的,ClickHouse使用表达式 sum(b) 来替换表达式 argMax(a, b) 中的变量 b。这种替换导致出现异常。
星号
select查询中,星号可以代替表达式使用。详情请参见“select”部分
表达式
表达式是函数、标识符、字符、使用运算符的语句、括号中的表达式、子查询或星号。它也可以包含别名。 表达式列表是用逗号分隔的一个或多个表达式。 反过来,函数和运算符可以将表达式作为参数。
相关文章:
ClickHouse 语法详解
ClickHouse有2类解析器:完整SQL解析器(递归式解析器),以及数据格式解析器(快速流式解析器) 除了 INSERT 查询,其它情况下仅使用完整SQL解析器。 INSERT查询会同时使用2种解析器:INSE…...

手把手教你将微信小程序放到git上
背景 首先,要创建一个自己的git仓库,这里默认大家都能够自己创建了git仓库了。如果不会创建仓库的话,百度一下,很容易就能够创建了!(后续,如有不知道在哪里,怎么创建仓库的话&#…...
功能测试3年,回顾一路走来的艰辛
不论你是什么时候开始接触测试这个行业的,你首先听说的应该是功能测试。通过一些测试手段来验证开发做出的代码是否符合产品的需求?当然你也有自己对功能测试的理解,但是最近两年感觉功能测试好像不太受欢迎,同时不少同学真的是功…...

作为Linux C/C++程序员必备的工具
Linux系统 可以选择centOS或者ubautu server(不建议选择桌面版本的)。不建议裸机安装,玩坏了就特别麻烦。不建议使用有桌面版本的ubautu,在一定程度有桌面的版本的会消耗性能。 如果经济实力允许,可以购买云服务器。 参考文章: Ubuntu server…...
docker Alpine一个只有5M小而美的Docker镜像
docker Alpine一个只有5M小而美的Docker镜像 参考链接: Alpine 一个只有5M的Docker镜像 http://www.infoq.com/cn/news/2016/01/Alpine-Linux-5M-Docker?utm_sourcetuicool&utm_mediumreferral 使用alpinelinux 构建 golang http 启动了才15mb http://blog.csdn.net/fre…...

Springboot扩展点之InstantiationAwareBeanPostProcessor
Springboot扩展点系列实现方式、工作原理集合:Springboot扩展点之ApplicationContextInitializerSpringboot扩展点之BeanFactoryPostProcessorSpringboot扩展点之BeanDefinitionRegistryPostProcessorSpringboot扩展点之BeanPostProcessorSpringboot扩展点之Instant…...

基于 U-Net 网络的遥感图像语义分割 完整代码+论文
一、研究目的U-Net 是一种由全卷积神经网络启发的对称结构网络,在医疗影像分割领域取得了很好的效果。 此次研究尝试使用 U-Net 网络在对多光谱遥感影像数据集上进行训练,尝试使用卷积神经网络自动分割出建筑,希望能够得到一种自动分割遥感影…...

Codeql 编译Shiro1.2.4爬坑
0x00 前言 这个Codeql一定要编译才能生成Database,是真的比较恼火,很多项目都不一定可以生成,环境就是一个非常大的坑,为了防止以后,所以将shiro1.2.4编译过程进行记录。 0x01 正文 首先是需要下载到shiro1.2.4的源…...

新C++(9):谈谈,翻转那些事儿
"相信羁绊,相信微光,相信一切无常。"一、AVL树翻转那些事儿(1)什么是AVL树?在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。…...
Java深克隆的几种方式
目录 1、通过继承Cloneable接口,重写clone方法实现深克隆 2、通过序列化与反序列化的方式实现深克隆 3、第三方工具类实现深克隆,克隆对象需继承Serializable接口 3.1、Apache Commons Lang的SerializationUtils.clone方法 3.2、Gson工具类 3.3、F…...

PointNet++的源码运行
首先,从github上下载源码https://github.com/yanx27/Pointnet_Pointnet2_pytorch也可以从百度网盘下载链接:https://pan.baidu.com/s/1sgTYuqnBVC9p3bib450SOQ 提取码:gujd再下载对应的测试数据分类数据modelnet40_normal_resampled下载&…...

npm 上传自己的包
mkdir demo 创建一个新的文件夹 npm init 初始化项目 生成一个package.json文件 name version description等等touch index.js 创建一个node 可执行脚本新的js 文件 #!/usr/bin/env node // 必须在文件头加如上内容指定运行环境为node console.log(hello cli)在package.json 中…...

【Linux】常用命令大全(二)
目录 4. Linux常用命令 4.1 Linux命令初体验 4.2 文件目录操作命令 4.3 拷贝移动命令 4.4 打包压缩命令 4.5 文本编辑命令 4.6 查找命令 4. Linux常用命令 4.1 Linux命令初体验 4.1.1 常用命令演示 在这一部分中,我们主要介绍几个常用的命令,…...

第一章 操作系统概述
目录一、什么是操作系统?1、操作系统的概念2、计算系统的构成3、主要作用二、操作系统有哪些功能?1、操作系统的目标2、操作系统的功能三、操作系统有哪些特征?1、并发性2、共享性3、虚拟性4、异步性四、操作系统的运行机制是怎样的ÿ…...

ChatGPT为什么不受开发者喜欢?
记得 ChatGPT 最开始上线不久的时候,看到的大部分尝鲜和测试结果都是开发者在做进行敲代码测试,可以说职业危机感非常强的一群人了。 再者,加上 ChatGPT 要使用起来其实是有一些技术门槛的,愿意折腾的人也多是程序员,…...
Lua table
Table(表) table 是 lua 中唯一的数据结构,可以用于表示 数组,字典与结构体。它非常强大,可以储存任何数据类型。 table 的数据单元为一对键值。 table 是不固定大小的,你可以根据自己需要进行扩容。 构…...

JavaScript:使用for in不是一个很好的抉择
for in 如果让你遍历对象中的key和value,你第一个想到的一定是使用for in const o{name:"chengqige",age:23 } for (let key in o){console.log(key,o[key]); }看起来是没有问题的,但是如果我在下面加一行代码,输出的结果就可能让…...
Go语言学习小笔记(一)
Go语言学习小笔记(一) 入口 项目的主入口:一般在main.go 包导入 一个包定义一组编译过的代码,包的名字类似命名空间,可以用来间接访问包内声明的标识符 所有处于同一个文件夹中的代码文件,必须使用同一…...

前端Docker部署方案
一、Docker容器和镜像概念 首先明确镜像和容器的概念。我们可以用 docker 构建一个镜像,这个镜像可以导入导出,用于传输,重复利用。然后如果把他 run 起来,则称为一个容器。容器是运行时,会包括运行时上下文ÿ…...
Java——无重叠区间
题目链接 leetcode在线oj题——无重叠区间 题目描述 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 题目示例 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释…...
数据库和数据表创建与管理操作
数据库和数据表创建与管理操作 MySQL中,一个完整的而数据存储过程主要分成4步: 创建数据库确认字段创建数据表插入数据 标识符命名规则 数据库名、表名不得超过30个字符,变量名限制为29个必须只能包含 A–Z, a–z, 0–9, _共63个字符数据…...
buu [ACTF新生赛2020]crypto-rsa3 1
题目描述: from flag import FLAG from Cryptodome.Util.number import * import gmpy2 import random e65537 p getPrime(512) q int(gmpy2.next_prime) n p*q m bytes_to_long(FLAG) c pow(m,e,n) print(n) print( c ) n 177606504836499246970959030226871…...

知识库:在医疗行业的知识管理有着怎样的意义与实际影响?
知识库中还可存在一个通常被称作典型方法库的特殊部分。如果对于某些问题的解决途径是肯定和必然的,就可以把其作为一部分相当肯定的问题解决途径直接存储在典型方法库中。这种宏观的存储将构成知识库的另一部分。在使用这部分时,机器推理将只限于选用典…...

带你一步步搭建Web自动化测试框架
测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程。另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人。本章和下一张…...

Redis进阶-缓存问题
Redis 最常用的一个场景就是作为缓存,本文主要探讨Redis作为缓存,在实践中可能会有哪些问题?比如一致性、击穿、穿透、雪崩、污染等。 为什么要理解Redis缓存问题 在高并发业务场景下,数据库大多数情况都是用户并发访问最薄弱的…...

VS Code Spring 全新功能来了!
大家好,欢迎来到我们 2023 年的第一篇博客!我们想与您分享几个与 Spring 插件、代码编辑和性能相关的激动人心的更新,让我们开始吧! Spring 插件包的新入门演练 演练(Walkthrough) 是一种多步骤、向导式的体…...
关于大数据导入流程引擎ccflow的方案
问题: 1. 现在的流程系统里有几百万条已经运行的流程其它的流程架构上 2. 需要把这样的数据导入到ccflow流程引擎里面去。 数据结构分析: 1. ccflow有流程引擎注册表,工作人表,业务数据表与日志表4大表. 2. ccflow的流程实例是一个int类型的…...

AI 生成二次元女孩,免费云端部署(仅需5分钟)
首先需要google的colab,免费版本GPU有额度。其次,打开github网站,选择一个进入colab,修改代码 !apt-get -y install -qq aria2 !pip install -q https://github.com/camenduru/stable-diffusion-webui-colab/releases/download/0.0.16/xforme…...

掌握MySQL分库分表(六)解决主键重复问题--Snowflake雪花算法
文章目录问题及需求常用ID解决方案数据库自增IDUUIDRedis发号器Snowflake雪花算法分布式 ID 生成算法Snowflake原理关于bit与byte雪花算法的位数Snowflake必须注意的地方全局唯⼀、不能重复保证各个系统时间一致Snowflake雪花算法实现雪花算法测试结果问题及需求 单库下⼀般使…...

Melis4.0[D1s]:1.启动流程(与adc按键初始化相关部分)跟踪笔记
文章目录1.启动流程1.1 最先进入的文件:head_s.S1.2 start_kernel()函数所在的文件:init.c1.3 input_init()函数所在文件:sys_input.c1.4 INPUT_LKeyDevInit()所在文件:keyboarddev.c1.5 esINPUT_RegLdev()所在文件:in…...