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批量操作

最佳实践:

  1. 使用合理的命名规范
  2. 选择合适的数据类型
  3. 正确设计主键
  4. 合理配置表选项
  5. 使用批处理提高效率

下一步,让我们学习数据类型详解!

最后更新:2026-03-27