CQL基础语法 #
一、CQL概述 #
1.1 什么是CQL #
CQL(Cassandra Query Language)是ScyllaDB的查询语言,语法类似SQL,但针对分布式数据库进行了优化。
sql
-- CQL语法示例
SELECT * FROM users WHERE user_id = 123;
1.2 CQL与SQL对比 #
| 特性 | CQL | SQL |
|---|---|---|
| 语法风格 | 类SQL | 标准SQL |
| JOIN | 不支持 | 支持 |
| GROUP BY | 有限支持 | 完整支持 |
| 事务 | 轻量级事务 | 完整ACID |
| 二级索引 | 支持 | 支持 |
| 聚合函数 | 基本支持 | 完整支持 |
二、标识符命名规范 #
2.1 命名规则 #
text
命名规则:
├── 可包含字母、数字、下划线
├── 必须以字母或下划线开头
├── 不区分大小写(默认)
├── 使用双引号可区分大小写
└── 最大长度48字符
2.2 命名示例 #
sql
-- 合法的标识符
CREATE TABLE users (...);
CREATE TABLE user_profiles (...);
CREATE TABLE _temp_data (...);
-- 区分大小写(使用双引号)
CREATE TABLE "Users" (...);
CREATE TABLE "UserProfile" (...);
-- 不推荐但合法
CREATE TABLE "user-table" (...); -- 包含特殊字符
2.3 保留关键字 #
sql
-- 需要转义的保留字
SELECT "select", "from", "where" FROM my_table;
-- 常见保留字
-- ADD, ALL, ALLOW, ALTER, AND, ANY, APPLY, AS, ASC, AUTHORIZE
-- BATCH, BEGIN, BY
-- COLUMNFAMILY, CREATE
-- DELETE, DESC, DISTINCT, DROP
-- ...
三、数据类型 #
3.1 基本数据类型 #
| 类型 | 描述 | 示例 |
|---|---|---|
| ascii | ASCII字符串 | ‘hello’ |
| bigint | 64位整数 | 1234567890123 |
| blob | 二进制数据 | 0x123456 |
| boolean | 布尔值 | true/false |
| counter | 计数器 | 100 |
| date | 日期 | ‘2024-01-15’ |
| decimal | 高精度小数 | 3.14159265358979 |
| double | 64位浮点 | 3.14159 |
| float | 32位浮点 | 3.14 |
| inet | IP地址 | ‘192.168.1.1’ |
| int | 32位整数 | 12345 |
| smallint | 16位整数 | 32767 |
| text | UTF-8字符串 | ‘你好世界’ |
| time | 时间 | ‘10:30:00’ |
| timestamp | 时间戳 | ‘2024-01-15 10:30:00’ |
| timeuuid | 时间UUID | uuid() |
| tinyint | 8位整数 | 127 |
| uuid | UUID | uuid() |
| varchar | 变长字符串 | ‘hello’ |
| varint | 任意精度整数 | 12345678901234567890 |
3.2 集合类型 #
sql
-- List - 有序列表
CREATE TABLE example (
id INT PRIMARY KEY,
tags LIST<TEXT>
);
INSERT INTO example (id, tags)
VALUES (1, ['tag1', 'tag2', 'tag3']);
-- Set - 无序集合
CREATE TABLE example_set (
id INT PRIMARY KEY,
emails SET<TEXT>
);
INSERT INTO example_set (id, emails)
VALUES (1, {'a@example.com', 'b@example.com'});
-- Map - 键值对
CREATE TABLE example_map (
id INT PRIMARY KEY,
attributes MAP<TEXT, TEXT>
);
INSERT INTO example_map (id, attributes)
VALUES (1, {'key1': 'value1', 'key2': 'value2'});
3.3 用户定义类型(UDT) #
sql
-- 创建UDT
CREATE TYPE address (
street TEXT,
city TEXT,
zip_code TEXT
);
-- 使用UDT
CREATE TABLE users (
user_id UUID PRIMARY KEY,
name TEXT,
address FROZEN<address>
);
INSERT INTO users (user_id, name, address)
VALUES (
uuid(),
'张三',
{street: '朝阳路100号', city: '北京', zip_code: '100020'}
);
四、键空间操作 #
4.1 创建键空间 #
sql
-- 基本语法
CREATE KEYSPACE [IF NOT EXISTS] keyspace_name
WITH replication = {
'class': 'replication_strategy',
'replication_factor': number
};
-- SimpleStrategy示例
CREATE KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
};
-- NetworkTopologyStrategy示例
CREATE KEYSPACE my_keyspace
WITH replication = {
'class': 'NetworkTopologyStrategy',
'datacenter1': 3,
'datacenter2': 2
};
-- 完整选项
CREATE KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 3
}
AND durable_writes = true;
4.2 使用键空间 #
sql
-- 切换键空间
USE my_keyspace;
-- 完全限定名
SELECT * FROM my_keyspace.users;
4.3 修改键空间 #
sql
-- 修改复制因子
ALTER KEYSPACE my_keyspace
WITH replication = {
'class': 'SimpleStrategy',
'replication_factor': 5
};
-- 修改持久化写入
ALTER KEYSPACE my_keyspace
WITH durable_writes = false;
4.4 删除键空间 #
sql
-- 删除键空间
DROP KEYSPACE [IF EXISTS] my_keyspace;
五、表操作 #
5.1 创建表 #
sql
-- 基本语法
CREATE TABLE [IF NOT EXISTS] table_name (
column_name data_type [PRIMARY KEY],
column_name data_type,
...
);
-- 简单主键
CREATE TABLE users (
user_id UUID PRIMARY KEY,
name TEXT,
email TEXT
);
-- 复合主键(分区键+聚簇列)
CREATE TABLE orders (
user_id UUID,
order_id UUID,
order_date TIMESTAMP,
amount DECIMAL,
PRIMARY KEY (user_id, order_id)
);
-- 复合分区键
CREATE TABLE events (
event_type TEXT,
event_date DATE,
event_id UUID,
data TEXT,
PRIMARY KEY ((event_type, event_date), event_id)
);
-- 带表选项
CREATE TABLE users (
user_id UUID PRIMARY KEY,
name TEXT,
email TEXT
) WITH comment = '用户表'
AND compaction = {'class': 'SizeTieredCompactionStrategy'}
AND compression = {'sstable_compression': 'LZ4Compressor'}
AND gc_grace_seconds = 864000
AND default_time_to_live = 0;
5.2 表选项详解 #
sql
-- 常用表选项
CREATE TABLE example (
id INT PRIMARY KEY,
data TEXT
) WITH
-- 注释
comment = '示例表'
-- 压缩策略
AND compression = {
'sstable_compression': 'LZ4Compressor',
'chunk_length_kb': 64
}
-- 压实策略
AND compaction = {
'class': 'SizeTieredCompactionStrategy',
'min_threshold': 4,
'max_threshold': 32
}
-- GC宽限时间
AND gc_grace_seconds = 864000
-- 默认TTL
AND default_time_to_live = 0
-- 布隆过滤器
AND bloom_filter_fp_chance = 0.01
-- 缓存设置
AND caching = {
'keys': 'ALL',
'rows_per_partition': 'NONE'
};
5.3 修改表 #
sql
-- 添加列
ALTER TABLE users ADD age INT;
ALTER TABLE users ADD (
phone TEXT,
address TEXT
);
-- 删除列
ALTER TABLE users DROP phone;
-- 重命名列
ALTER TABLE users RENAME user_id TO id;
-- 修改表选项
ALTER TABLE users WITH comment = '更新后的用户表';
-- 修改压缩策略
ALTER TABLE users WITH compression = {
'sstable_compression': 'ZstdCompressor'
};
5.4 删除表 #
sql
-- 删除表
DROP TABLE [IF EXISTS] users;
-- 清空表数据
TRUNCATE TABLE users;
六、注释 #
6.1 单行注释 #
sql
-- 这是单行注释
SELECT * FROM users; -- 行尾注释
6.2 多行注释 #
sql
/*
* 这是多行注释
* 可以跨越多行
*/
SELECT * FROM users;
七、批处理 #
7.1 批量操作 #
sql
-- 批量插入
BEGIN BATCH
INSERT INTO users (user_id, name) VALUES (uuid(), '张三');
INSERT INTO users (user_id, name) VALUES (uuid(), '李四');
INSERT INTO users (user_id, name) VALUES (uuid(), '王五');
APPLY BATCH;
-- 批量更新
BEGIN BATCH
UPDATE users SET name = '张三新' WHERE user_id = uuid();
UPDATE users SET name = '李四新' WHERE user_id = uuid();
APPLY BATCH;
-- 混合操作
BEGIN BATCH
INSERT INTO users (user_id, name) VALUES (uuid(), '新用户');
UPDATE users SET name = '更新' WHERE user_id = uuid();
DELETE FROM users WHERE user_id = uuid();
APPLY BATCH;
7.2 批处理选项 #
sql
-- 使用时间戳
BEGIN BATCH USING TIMESTAMP 1234567890
INSERT INTO users (user_id, name) VALUES (uuid(), '张三');
APPLY BATCH;
-- 批处理类型
BEGIN LOGGED BATCH -- 默认,记录日志
INSERT INTO users (user_id, name) VALUES (uuid(), '张三');
APPLY BATCH;
BEGIN UNLOGGED BATCH -- 不记录日志,性能更好
INSERT INTO users (user_id, name) VALUES (uuid(), '张三');
APPLY BATCH;
八、函数 #
8.1 内置函数 #
sql
-- UUID函数
SELECT uuid() FROM system.local;
SELECT now() FROM system.local; -- timeuuid
-- 时间函数
SELECT toTimestamp(now()) FROM system.local;
SELECT toDate(now()) FROM system.local;
-- 转换函数
SELECT blobAsInt(0x00000001) FROM system.local;
SELECT intAsBlob(1) FROM system.local;
-- Token函数
SELECT token(user_id) FROM users;
8.2 聚合函数 #
sql
-- COUNT
SELECT COUNT(*) FROM users;
SELECT COUNT(user_id) FROM users;
-- SUM
SELECT SUM(amount) FROM orders;
-- AVG
SELECT AVG(amount) FROM orders;
-- MIN/MAX
SELECT MIN(amount), MAX(amount) FROM orders;
九、操作符 #
9.1 比较操作符 #
sql
-- 等于
SELECT * FROM users WHERE user_id = 123;
-- 不等于
SELECT * FROM users WHERE user_id != 123;
-- 大于/小于
SELECT * FROM orders WHERE amount > 100;
SELECT * FROM orders WHERE amount < 100;
SELECT * FROM orders WHERE amount >= 100;
SELECT * FROM orders WHERE amount <= 100;
-- IN操作符
SELECT * FROM users WHERE user_id IN (1, 2, 3);
9.2 逻辑操作符 #
sql
-- AND
SELECT * FROM users
WHERE user_id = 1 AND name = '张三';
-- OR(需要使用ALLOW FILTERING)
SELECT * FROM users
WHERE name = '张三' OR name = '李四'
ALLOW FILTERING;
9.3 集合操作符 #
sql
-- CONTAINS
SELECT * FROM users WHERE tags CONTAINS 'vip';
-- CONTAINS KEY
SELECT * FROM users WHERE attributes CONTAINS KEY 'email';
-- 集合相等
SELECT * FROM users WHERE tags = ['tag1', 'tag2'];
十、JSON支持 #
10.1 JSON插入 #
sql
-- 使用JSON插入
INSERT INTO users JSON '{
"user_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "张三",
"email": "zhangsan@example.com"
}';
-- 使用JSON插入(带默认值)
INSERT INTO users JSON '{
"user_id": "123e4567-e89b-12d3-a456-426614174000",
"name": "张三"
}' DEFAULT UNSET;
10.2 JSON查询 #
sql
-- 查询结果为JSON
SELECT JSON * FROM users;
-- 输出示例
{"user_id": "...", "name": "张三", "email": "..."}
十一、总结 #
CQL基础语法要点:
| 类别 | 要点 |
|---|---|
| 标识符 | 字母开头,可包含数字和下划线 |
| 数据类型 | 基本类型、集合类型、UDT |
| 键空间 | 创建、修改、删除 |
| 表 | 创建、修改、删除、选项配置 |
| 批处理 | LOGGED/UNLOGGED批量操作 |
最佳实践:
- 使用合理的命名规范
- 选择合适的数据类型
- 正确设计主键
- 合理配置表选项
- 使用批处理提高效率
下一步,让我们学习数据类型详解!
最后更新:2026-03-27