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 aliasAS — 用于定义别名的关键字。可以对表或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 tReceived 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 解释…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
