阶段一 · 概念入门

快速上手:安装部署与第一个查询

一句话总结

ClickHouse 的安装极其简单--官方提供 Docker 镜像,各平台原生包和二进制文件.
最快的方式是 Docker 一行命令启动,然后通过 clickhouse-client 连上去写 SQL. 对 SQL 语法兼容度很高,用过 MySQL 的话上手几乎没有障碍.

Docker 一键启动(推荐)

Docker 是最快,最干净的方式,不会在系统里留下残留文件. 以下命令在 macOS,Linux,Windows 上都可用:

# 启动 ClickHouse 服务端,暴露 8123(HTTP)和 9000(Native)端口
$ docker run -d \
--name ch-server \
-p 8123:8123 \
-p 9000:9000 \
clickhouse/clickhouse-server

一行命令,等镜像拉取完成(首次约 30 秒),服务就启动了.验证一下:

# 查看容器是否正常运行
$ docker ps --filter name=ch-server

# 直接进入容器,用内置客户端操作
$ docker exec -it ch-server clickhouse-client

如果看到 ClickHouse client version ... 和一个 :) 提示符,说明已经进入了 ClickHouse 的交互式客户端. 试试第一条命令:

SELECT 1;
SELECT 1

Query id: a1b2c3d4-...

┌─1─┐
1. │ 1 │
└───┘

1 row in set. Elapsed: 0.002 sec.

这条查询没有查任何表,只是在验证:服务端的连接,解析,执行,返回这一整条链路是通的.这就够了,接下来正式动手.

Docker 常用管理命令

docker stop ch-server停止服务
docker start ch-server重新启动
docker rm -f ch-server删除容器(数据会丢失,除非挂载了 volume)
docker exec -it ch-server bash进入容器的 shell

其他安装方式

如果不想用 Docker,官方也提供了各平台的原生安装包:

macOS(Homebrew)

$ brew install clickhouse
$ clickhouse server # 启动服务端
$ clickhouse client # 新终端窗口,启动客户端

Linux(Debian/Ubuntu)

# 添加官方仓库并安装
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
$ curl -fsSL 'https://packages.clickhouse.com/rpm/lts/repodata/repomd.xml.key' \
| sudo gpg --dearmor -o /etc/apt/keyrings/clickhouse.gpg
$ echo "deb [signed-by=/etc/apt/keyrings/clickhouse.gpg] \
https://packages.clickhouse.com/deb stable main" \
| sudo tee /etc/apt/sources.list.d/clickhouse.list
$ sudo apt-get update
$ sudo apt-get install -y clickhouse-server clickhouse-client
$ sudo service clickhouse-server start

Linux(RHEL/CentOS)

$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo \
https://packages.clickhouse.com/rpm/clickhouse.repo
$ sudo yum install -y clickhouse-server clickhouse-client
$ sudo service clickhouse-server start

本篇后续用 Docker 方式 演示,进入客户端的方式统一为:

$ docker exec -it ch-server clickhouse-client

连接到 ClickHouse

ClickHouse 提供两种通信协议,各自对应一个端口:

协议 默认端口 用途 客户端
Native TCP 9000 高性能二进制协议,生产环境首选 clickhouse-client,各语言原生驱动
HTTP 8123 RESTful 接口,方便调试和轻量集成 curl,浏览器,任何 HTTP 客户端

clickhouse-client 默认连本机 9000 端口.如果要连远程服务器:

# 连接远程 ClickHouse
$ clickhouse-client --host 192.168.1.100 --port 9000 --user default --password yourpass

# 不进入交互模式,直接执行一条查询
$ clickhouse-client --query "SELECT count() FROM mydb.orders"

进入客户端后,先看看环境:

-- 查看所有数据库
SHOW DATABASES;
┌─name───────────────┐
1. │ INFORMATION_SCHEMA │
2. │ default │
3. │ information_schema │
4. │ system │
└────────────────────┘

和 MySQL 的体验几乎一样--SHOW DATABASES,SHOW TABLES,DESCRIBE table 这些命令全都可以用,这是 ClickHouse 刻意做的兼容设计.

第一个数据库和表

创建一个练习用的数据库,然后建一张"电商订单"表--后续的查询都在这张表上操作:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS learn;
-- 切换到 learn 库
USE learn;
-- 创建订单表
CREATE TABLE orders (
order_id UInt64,
customer_id UInt64,
product String,
category String,
amount Decimal(10, 2),
quantity UInt8,
status Enum8('pending' = 1, 'paid' = 2, 'shipped' = 3, 'cancelled' = 4),
created_at DateTime
)
ENGINE = MergeTree()
ORDER BY (created_at, order_id);

这条建表语句值得逐行看一下,因为有几个 ClickHouse 特有的要素:

说明
UInt64, UInt8 无符号整数.ClickHouse 类型系统精确到位宽,没有 INT 这种模糊类型.
Decimal(10, 2) 定点小数,适合金额.不用 FLOAT 避免精度问题.
Enum8(...) 枚举类型.存的是 1 字节的整数,查出来是 'paid' 这样的字符串.既省空间又可读.
DateTime 精确到秒的日期时间.不做时区转换,原文存储.
ENGINE = MergeTree() 这是 ClickHouse 最核心的表引擎.MergeTree 家族是 ClickHouse 高性能的基石,后续进阶篇会深入.现在先记住:建表必选引擎.
ORDER BY (created_at, order_id) 排序键(Sorting Key).数据在磁盘上按这个顺序排列,直接影响查询效率.时间列放第一位是经典选择.

表引擎 = MySQL 中的存储引擎(InnoDB/MyISAM),但选择更多,代价更大.
MySQL 建表时 ENGINE=InnoDB 几乎不需要思考,但 ClickHouse 的引擎决定了数据的存储方式,是否支持副本,是否自动聚合. 现阶段认准 MergeTree 及其变体即可,后面会专门讲引擎选择.

验证一下表结构:

DESCRIBE orders;
┌─name────────┬─type──────────┬─default_type─┬─default_expression─┐
1. │ order_id │ UInt64 │ │ │
2. │ customer_id │ UInt64 │ │ │
3. │ product │ String │ │ │
4. │ category │ String │ │ │
5. │ amount │ Decimal(10,2) │ │ │
6. │ quantity │ UInt8 │ │ │
7. │ status │ Enum8(...) │ │ │
8. │ created_at │ DateTime │ │ │
└─────────────┴───────────────┴──────────────┴────────────────────┘

写入第一批数据

ClickHouse 的 INSERT 语法和标准 SQL 一致,写入一批模拟数据:

INSERT INTO orders VALUES
(1, 101, 'iPhone 16', '数码', 6999.00, 1, 'paid', '2025-01-15 10:30:00'),
(2, 102, 'AirPods Pro', '数码', 1899.00, 2, 'paid', '2025-01-15 11:00:00'),
(3, 101, 'MacBook Pro', '数码', 14999.00, 1, 'shipped','2025-01-16 09:00:00'),
(4, 103, '瑜伽垫', '运动', 129.00, 1, 'paid', '2025-01-16 14:00:00'),
(5, 102, '蛋白粉', '运动', 299.00, 3, 'paid', '2025-01-17 08:00:00'),
(6, 104, '键盘', '数码', 599.00, 1, 'cancelled','2025-01-17 16:00:00'),
(7, 101, '数据线', '数码', 39.00, 5, 'shipped', '2025-01-18 10:00:00'),
(8, 105, '跑鞋', '运动', 899.00, 1, 'paid', '2025-01-18 12:00:00'),
(9, 103, '运动手环', '数码', 349.00, 1, 'paid', '2025-01-19 09:00:00'),
(10, 102,'瑜伽裤', '运动', 199.00, 1, 'paid', '2025-01-19 15:00:00');

确认数据写入成功:

SELECT count() FROM orders;
┌─count()─┐
1. │ 10 │
└─────────┘

小细节

ClickHouse 习惯用 count() 而非 COUNT(*),两者等效,但 count() 更简洁. ClickHouse 的函数名大多用小写驼峰或全小写,不过标准大写的 COUNT(*),SUM() 也完全支持.

体验分析查询

10 行数据看不出 ClickHouse 的性能优势,但足以展示分析类 SQL 的写法--这些就是 ClickHouse 最擅长的查询模式:

聚合:各品类销售概况

SELECT
category,
count() AS order_cnt,
sum(amount) AS total_revenue,
round(avg(amount), 2) AS avg_order_value
FROM orders
WHERE status != 'cancelled' -- 排除取消的订单
GROUP BY category
ORDER BY total_revenue DESC;
┌─category─┬─order_cnt─┬─total_revenue─┬─avg_order_value─┐
1. │ 数码 │ 5 │ 22285.00 │ 4457.00 │
2. │ 运动 │ 4 │ 1526.00 │ 381.50 │
└──────────┴───────────┴───────────────┴─────────────────┘

时间维度:每日订单量

SELECT
toDate(created_at) AS day,
count() AS orders,
sum(amount) AS revenue
FROM orders
GROUP BY day
ORDER BY day;
┌────────day─┬─orders─┬─revenue─┐
1. │ 2025-01-15 │ 2 │ 8898.00 │
2. │ 2025-01-16 │ 2 │ 15128.00│
3. │ 2025-01-17 │ 2 │ 898.00 │
4. │ 2025-01-18 │ 2 │ 938.00 │
5. │ 2025-01-19 │ 2 │ 548.00 │
└────────────┴────────┴─────────┘

toDate() 是 ClickHouse 内置的日期转换函数,把 DateTime 截断到天.这类时间函数非常丰富--toStartOfHour(),toStartOfWeek(),toYYYYMM() 等,是日常分析的高频工具.

Top-N:消费最高的客户

SELECT
customer_id,
count() AS orders,
sum(amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
ORDER BY total_spent DESC
LIMIT 3;
┌─customer_id─┬─orders─┬─total_spent─┐
1. │ 101 │ 3 │ 7037.00 │
2. │ 102 │ 2 │ 2198.00 │
3. │ 103 │ 1 │ 129.00 │
└─────────────┴────────┴─────────────┘

条件过滤:枚举列的使用

-- 按订单状态统计
SELECT
status,
count() AS cnt,
round(count() * 100.0 / (SELECT count() FROM orders), 1) AS pct
FROM orders
GROUP BY status
ORDER BY cnt DESC;
┌─status────┬─cnt─┬──pct─┐
1. │ paid │ 7 │ 70.0 │
2. │ shipped │ 2 │ 20.0 │
3. │ cancelled │ 1 │ 10.0 │
└───────────┴─────┴──────┘

注意:Enum8 列在查询结果中自动显示为人类可读的字符串('paid'),但存储时只占 1 字节.这是 ClickHouse 在可读性和存储效率之间的巧妙平衡.

一个 ClickHouse 风味查询

ClickHouse 内建了大量聚合函数,下面这条查询展示几个有代表性的:

SELECT
category,
groupArray(product) AS products, -- 把分组内的值收集成数组
sum(amount * quantity) AS total_revenue, -- 表达式内可直接做计算
avg(amount) AS avg_price,
max(amount) - min(amount) AS price_range -- 表达式可以直接作为列输出
FROM orders
WHERE status != 'cancelled'
GROUP BY category;
┌─category─┬─products──────────────────────────┬─total_revenue─┬─avg_price─┬─price_range─┐
1. │ 数码 │ ['iPhone 16','AirPods Pro',...] │ 22375.00 │ 4457.00 │ 14960.00 │
2. │ 运动 │ ['瑜伽垫','蛋白粉','跑鞋','瑜伽裤']│ 1826.00 │ 381.50 │ 770.00 │
└──────────┴───────────────────────────────────┴───────────────┴───────────┴─────────────┘

groupArray 是 ClickHouse 的特色函数--把每个分组内的值收集成一个数组.这在 OLAP 场景下非常实用:比如查询"每个用户最近 10 次购买的商品",用标准 SQL 要用窗口函数绕一圈,ClickHouse 直接一个 groupArray 配合数组函数就解决了.

HTTP 接口速览

除了 clickhouse-client,ClickHouse 的 HTTP 接口同样可用,调试和轻量集成时很方便:

# 用 curl 执行查询(默认返回 TabSeparated 格式)
$ curl -s 'http://localhost:8123/?query=SELECT%20count()%20FROM%20learn.orders'

# 指定返回 JSON 格式
$ curl -s 'http://localhost:8123/?query=SELECT%20*%20FROM%20learn.orders%20LIMIT%203&default_format=JSONEachRow'

也可以直接在浏览器打开 http://localhost:8123/play,ClickHouse 内置了一个简易的 Web UI 查询界面,适合快速验证.

本篇要点

  • 安装零门槛: Docker 一行命令启动,docker exec -it ch-server clickhouse-client 进入客户端.
  • 两种协议: Native TCP(9000,高性能二进制)和 HTTP(8123,RESTful 调试),各自有适用场景.
  • 建表核心要素: 精确的类型系统(UInt8/Decimal/Enum8),ENGINE = MergeTree()(必选),ORDER BY 决定数据的物理排列.
  • SQL 兼容度高: SELECT/WHERE/GROUP BY/ORDER BY/LIMIT 和标准 SQL 一致,count()COUNT(*) 更常见.
  • ClickHouse 特色函数: toDate() 等时间转换,groupArray() 等聚合函数,日常分析的高频工具.

动手练习

  1. Docker 启动 -- 用 Docker 启动 ClickHouse,进入客户端
  2. 建库建表 -- 创建 learn 库和 orders 表,插入模拟数据
  3. 聚合查询 -- 分别按品类,日期,客户维度做聚合查询
  4. HTTP 接口 -- 用 curl 或浏览器执行同一条查询
  5. 探索系统表 -- SELECT * FROM system.tables WHERE database = 'learn';

下一站

现在已经有了一个运行中的 ClickHouse 和第一张表. 后续的 03 - 表引擎入门会展开讲 MergeTree 家族和其他引擎类型,建立"选引擎"的决策框架.