Cassandra 查询语言
1. 简介
有时,我们需要一个快速参考指南来开始我们的学习路径。特别是,备忘单是包含所有关键信息的文档。
在本教程中,我们将学习 Cassandra 查询语言 (CQL) 的基本概念以及如何使用我们将在此过程中构建的备忘单来应用它们。
2. Cassandra 概览
Apache Cassandra 是一个开源、NoSQL 和分布式数据存储系统 。这意味着它不能只存在于一台服务器上,而是分布在多台服务器上。它还以其高可用性和分区容错性而闻名。
换句话说,Cassandra 数据库的设计灵感来自于CAP 定理 的“AP” 。
此外,Cassandra 是一种无主架构,可大规模扩展,最重要的是,它提供了简单的故障检测和恢复。
3. 数据类型
一般来说,Cassandra 支持一组丰富的数据类型 。这些包括本机类型、集合类型、用户定义类型和元组,以及自定义类型。
3.1. 原生类型
本机类型是内置类型,并为 Cassandra 中的一系列常量提供支持。
首先,字符串是编程世界中非常流行的数据类型。
CQL 为字符串提供了四种不同的数据类型:
数据类型 | 支持的常量 | 描述 |
ASCII | string | ASCII 字符串 |
网络 | string | IPv4 或 IPv6 地址字符串 |
文本 | string | UTF8 编码字符串 |
varchar | string | UTF8 编码字符串 |
布尔值具有两个可能值之一,true或false:
数据类型 | 支持的常量 | 描述 |
布尔值 | boolean | true或false |
使用 blob 数据类型,我们可以将图像或多媒体数据作为二进制流存储在数据库中:
数据类型 | 支持的常量 | 描述 |
blob | blob | 任意字节 |
Duration 是一个三符号整数,表示月、日和纳秒:
数据类型 | 支持的常量 | 描述 |
duration | duration | 持续时间值 |
Cassandra 为整数数据提供了广泛的数据类型:
数据类型 | 支持的常量 | 描述 |
微小的 | integer | 8 位有符号整数 |
小字 | integer | 16 位有符号整数 |
整数 | integer | 32 位有符号整数 |
大整数 | integer | 64 位有符号长 |
变体 | integer | 任意精度整数 |
柜台 | integer | 计数器列(64 位有符号) |
对于整数和浮点数,我们有三种数据类型:
数据类型 | 支持的常量 | 描述 |
十进制 | integer,float | 可变精度小数 |
双倍的 | integer,float | 64 位浮点 |
漂浮 | integer,float | 32 位浮点 |
对于与日期和时间相关的需求,Cassandra 提供了三种数据类型:
数据类型 | 支持的常量 | 描述 |
日期 | integer,string | 日期值(无时间) |
时间 | integer,string | 时间值(无日期) |
时间戳 | integer,string | 时间戳(带日期和时间) |
通常,我们必须在使用 INSERT 或 UPDATE 命令时避免冲突:
数据类型 | 支持的常量 | 描述 |
uuid | uuid | UUID(任何版本) |
timeuuid | uuid | 版本 1 UUID |
3.2. 集合类型
当用户对关系数据库中的一个字段有多个值时,通常将它们存储在单独的表中。例如,用户有许多银行账户、联系信息或电子邮件地址。因此,在这种情况下,我们需要在两个表之间应用连接来检索所有数据。
Cassandra 提供了一种使用集合类型将数据分组和存储在列中的方法。
让我们快速看一下这些类型:
- set – 唯一值;存储为无序
- list – 可以包含重复值;订单很重要
- map – 以键值对形式存储的数据
3.3. 用户定义的类型
用户定义的类型使我们可以自由地将多个数据字段附加到单个列中:
CREATE TYPE student.basic_info (
birthday timestamp,
race text,
weight text,
height text
);
3.4. 元组类型
元组是用户定义类型的替代方案。它是使用尖括号和逗号分隔符创建的,以分隔它包含的元素类型。
下面是一个简单元组的命令:
-- create a tuple
CREATE TABLE subjects (
k int PRIMARY KEY,
v tuple<int, text, float>
);
-- insert values
INSERT INTO subjects (k, v) VALUES(0, (3, 'cs', 2.1));
-- retrieve values
SELECT * FROM subjects;
4. Cassandra CQL 命令
让我们看几个类别的 CQL 命令。
4.1.键空间命令
首先要记住的是,Cassandra 中的键空间很像 RDBMS 中的数据库。它是定义复制策略和其他选项的最外层数据容器,特别是对于所有键空间表。考虑到这一点,一个好的一般规则是每个应用程序一个键空间。
我们来看看相关的命令:
命令 | 例子 | 描述 |
创建键空间 | CREATE KEYSPACE keyspace_name WITH replication = {‘class’:‘SimpleStrategy’, ‘replication_factor’: 2}; | 创建一个键空间。 |
描述键空间 | DESCRIBE KEYSPACES; | 它将列出所有关键空间。 |
使用键空间 | USE keyspace_name; | 此命令将客户端会话连接到键空间。 |
ALTER 键空间 | ALTER KEYSPACE keyspace_name WITH REPLICATION = { ‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : 3 } AND DURABLE_WRITES = false; | 更改键空间。 |
删除键空间 | DROP KEYSPACE keyspace_name ; | 删除一个键空间。 |
4.2. 表命令
在 Cassandra 中,表也称为列族 。我们已经知道主键的重要性。但是,必须在创建表时定义主键。
让我们回顾一下这些命令:
命令 | 例子 | 描述 |
创建表 | CREATE TABLE table_name ( column_name UUID PRIMARY KEY, column_name text, column_name text, column_name timestamp); | 创建一个表。 |
更改表 | ALTER TABLE table_name ADD column_name int; | 它将向表中添加一个新列。 |
更改表 | ALTER TABLE table_name ALTER column_name TYPE datatype; | 我们可以更改现有列的数据类型。 |
更改表 | ALTER TABLE table_name WITH caching = {‘keys’ : ‘NONE’, ‘rows_per_partition’ : ‘1’ }; | 此命令有助于更改表的属性。 |
删除表 | DROP TABLE table_name; | 删除一张表。 |
TRUNCATE 表 | TRUNCATE table_name; | 永久删除所有数据。 |
4.3. 索引命令
我们可以使用索引来加速查询,而不是扫描整个表并等待结果。但是,我们必须记住 Cassandra 中的主键已经被索引。因此,它不能再次用于相同的目的。
让我们看一下命令:
命令 | 例子 | 描述 |
创建索引 | CREATE INDEX index_name on table_name (column_name); | 创建索引。 |
删除索引 | DROP INDEX IF EXISTS index_name; | 删除索引。 |
4.4. 基本命令
这些命令用于读取和操作表值:
命令 | 例子 | 描述 |
INSERT | INSERT INTO table_name ( column_name1 , column_name2 ) VALUES( value1 , value2 ); | 在表中插入记录。 |
SELECT | SELECT * FROM table_name; | 该命令用于从特定表中获取数据。 |
WHERE | SELECT * FROM table_name WHERE column_name = value ; | 过滤记录。 |
UPDATE | UPDATE table_name SET column_name2 = value2 WHERE column_name1 = value1 ; | 编辑记录。 |
DELETE | DELETE identifier FROM table_name WHERE condition; | 此语句从表中删除值。 |
4.5. 其他命令
Cassandra 有两种不同类型的键:分区键和集群键。分区键指示存储数据的节点。
相比之下,集群键决定了分区键中数据的顺序:
命令 | 例子 | 描述 |
ORDER BY | SELECT * FROM table_name WHERE column_name1 = value ORDER BY cloumn_name2 ASC; | 必须在 WHERE 子句中定义分区键。此外,ORDER BY 子句表示用于排序的聚类列。 |
GROUP BY | SELECT column_name FROM table_name GROUP BY condition1 , condition2 ; | 此子句仅支持 Partition Key 或 Partition Key 和 Clustering Key。 |
LIMIT | SELECT * FROM table_name LIMIT 3; | 限制检索的行数。 |
5. 运算符
Cassandra 支持算术和条件类型的运算符。在算术运算符下,我们有 +、-、*、/、% 和 –(一元)分别表示加法、减法、乘法、除法、提醒和否定。
WHERE 子句在 Cassandra 中很重要。本条款中使用的条件运算符有一定的场景和限制 。这些运算符是 CONTAINS、CONTAINS KEY、IN、=、>、>=、< 和 <=。
6.常用功能
毫无疑问,无论是聚合函数还是标量函数,在将值从一个值转换为另一个值时都发挥着重要作用。出于这个原因,Cassandra 在这两个类别中都提供了几个原生函数。
让我们看看这些功能:
- Blob 转换函数
- UUID 和 Timeuuid 函数
- Token 函数
- WRITETIME 函数
- TTL 函数
- TOKEN 函数
- MIN(), MAX(), SUM(), AVG()
除了这些原生函数,它还允许用户定义函数和聚合。