CQL操作

http://docs.datastax.com/en/cql/3.1/pdf/cql31.pdf

CQL是Cassandra Query Language的缩写,目前作为Cassandra默认并且主要的交互接口。CQL和SQL比较类似,主要的区别是Cassandra不支持join或子查询,除了支持通过Hive进行批处理分析。要说这个Cassandra以前的接口主要是Thrift API,这个没有用过,不做评价。

Cassandra在CQL语言层面支持多种数据类型[12]

CQL类型对应Java类型描述
asciiStringascii字符串
bigintlong64位整数
blobByteBuffer/byte[]二进制数组
booleanboolean布尔
counterlong计数器,支持原子性的增减,不支持直接赋值
decimalBigDecimal高精度小数
doubledouble64位浮点数
floatfloat32位浮点数
inetInetAddressipv4ipv6协议的ip地址
intint32位整数
listList有序的列表
mapMap键值对
setSet集合
textStringutf-8编码的字符串
timestampDate日期
uuidUUIDUUID类型
timeuuidUUID时间相关的UUID
varcharstringtext的别名
varintBigInteger高精度整型

cqlsh语法

cqlsh [options] [host [port]]
python cqlsh [options] [host [port]] 

Options

-C, --color
Always use color output.
--debug
Show additional debugging information.
--cqlshrc path
Use an alternative cqlshrc file location, path. (Cassandra 2.1.1)
-e cql_statement, --execute cql_statement
Accept and execute a CQL command in Cassandra 2.1 and later. Useful for  saving CQL output to a file.
-f file_name, --file=file_name
Execute commands from file_name, then exit.
-h, --help
Show the online help about these options and exit.
-k keyspace_name
Use the given keyspace. Equivalent to issuing a USE  keyspace command immediately after starting cqlsh.
--no-color
Never use color output.
-p password
Authenticate using password. Default = cassandra.
-t transport_factory_name, --transport=transport_factory_name
Use the provided Thrift transport factory function.
-u user_name
Authenticate as user. Default = cassandra.
--version
Show the cqlsh version.

 

启动CQL命令是cqlsh,我下面的例子是window上的,cassandra版本是2.1.14

示例:

#debug
D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin>cqlsh.bat --debug
Using CQL driver: <module 'cassandra' from 'D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin\..\lib\cassandra-driver-in
ternal-only-2.7.2.zip\cassandra-driver-2.7.2\cassandra\__init__.py'>
Using connect timeout: 5 seconds
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.14 | CQL spec 3.2.1 | Native protocol v3]
Use HELP for help.
WARNING: pyreadline dependency missing.  Install to enable tab completion.

#version
D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin>cqlsh.bat --version
cqlsh 5.0.1
#Saving CQL output in a file导出
D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin>cqlsh.bat -e "select * from duansf.users">myoutput.txt

导出的文件如下:

D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin>cqlsh.bat

结果:cqlsh Can't detect Python version!

安装python,我安装的是64位的2.7版本,并配置下环境变量path中增加python的安装根路径。安装好后再执行cqlsh.bat

D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin>cqlsh.bat

D:\soft\cassandra\apache-cassandra-2.1.14-bin\bin>cqlsh.bat
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.1.14 | CQL spec 3.2.1 | Native protocol v3]
Use HELP for help.
WARNING: pyreadline dependency missing.  Install to enable tab completion.

一、创建keyspace

作为对照,你可以把keyspace理解成一个SQL数据库实例,当然它们毕竟是不同的:Cassandra的keyspace是用来定义数据是如何在节点间复制的。通常情况下,应该为一个应用程序建立一个keyspace。

CREATE KEYSPACE IF NOT EXISTS pimin_net
WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};

上面语句的意思是判断是否存在keyspace,如果不存在则建立keyspace;使用的副本策略是简单策略,复制因子是1。暂时先不管里面深层次的东西,我们先按照简单原则实现。

二、创建表

虽然说Cassandra是面向列的分布式数据库,但是它也有表的概念。创建之前先use pimin_net。

USE pimin_net;
 
CREATE TABLE users (
id int,
user_name varchar,
PRIMARY KEY (id) );

这样就建立了一张用户表,为了简单起见,就只有两个字段,看起来和oracle、mysql这些是不是很像?

三、对表的CRUD

已经有了一张用户表,我们就向里面插入一些数据,对它进行查询、更新和删除操作。

INSERT INTO users (id,user_name) VALUES (1,'china');
INSERT INTO users (id,user_name) VALUES (2,'taiwan');
SELECT * FROM users;
结果:
cqlsh:pimin_net> SELECT * FROM users;

 id | user_name
----+-----------

(0 rows)
cqlsh:pimin_net> INSERT INTO users (id,user_name) VALUES (1,'china');
cqlsh:pimin_net> INSERT INTO users (id,user_name) VALUES (2,'taiwan');
cqlsh:pimin_net> SELECT * FROM users;

 id | user_name
----+-----------
  1 |     china
  2 |    taiwan

(2 rows)
cqlsh:pimin_net>

 

UPDATE users SET user_name = 'china2014' WHERE id = 1;
SELECT * FROM users;
DELETE FROM users WHERE id = 1;
SELECT * FROM users;

结果:

cqlsh:pimin_net> UPDATE users SET user_name = 'china2014' WHERE id = 1;
cqlsh:pimin_net> SELECT * FROM users;

 id | user_name
----+-----------
  1 | china2014
  2 |    taiwan

(2 rows)
cqlsh:pimin_net> DELETE FROM users WHERE id = 1;
cqlsh:pimin_net> SELECT * FROM users;

 id | user_name
----+-----------
  2 |    taiwan

(1 rows)
cqlsh:pimin_net>
 重要:不同于传统的RDBMS,Cassandra不能使用DELETE FROM users;这样的表达式,必须有WHERE条件!

 重要:不同于传统的RDBMS,Cassandra不能使用DELETE FROM users;这样的表达式,必须有WHERE条件!

示例2:


cqlsh:usermanager> use duansf

1.创建keyspace 

cqlsh:usermanager> create keyspace duansf WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};

创建一个名为duansfkeyspace,副本策略SimpleStrategy,复制因子为1. 

2.创建Column family 

cqlsh>use duansf;
cqlsh:duansf> create columnfamily users(
           key varchar primary key,
           password varchar,
           gender varchar,
           session_token varchar,
           state varchar,
           birth_year bigint);

创建一个名为userscolumn family 

 ...  KEY varchar PRIMARY KEY,columnfamily下有一个Key

和5列 

 ...  password varchar, 

...  gende rvarchar, 

 ...  session_token varchar, 

...  state varchar, 

 ...  birth_year bigint); 

3.插入和检索Columns 

cqlsh:duansf> insert into users(key,password) values('jsmith','chadsfl') using ttl 86400;

向passwod这一列插入数据

cqlsh:duansf> select * from users where key='jsmith';

 key    | birth_year | gender | password | session_token | state
--------+------------+--------+----------+---------------+-------
 jsmith |       null |   null |  chadsfl |          null |  null

(1 rows)
cqlsh:duansf>

向session_token这一列插入数据

cqlsh:duansf> insert into users(key,session_token) values('jsmith','test') using ttl 86400;
cqlsh:duansf> select * from users where key='jsmith';

 key    | birth_year | gender | password | session_token | state
--------+------------+--------+----------+---------------+-------
 jsmith |       null |   null |  chadsfl |          test |  null

3.Column family中增加Column 

cqlsh:duansf> alter table user add coupon_code varchar;

注意:其他已经存在的列不会进行更新。

4. 更改Column的元数据

cqlsh:duansf> alter table users alter coupon_code type int;
ConfigurationException: <ErrorMessage code=2300 [Query invalid because of configuration issue] message="Cannot change co
upon_code from type text to type int: types are incompatible.">

注意:已经存在的数据不会转成此类型,新插入的数据才是该类型的。

5.使用TTL属性设置列的到期时间 

cqlsh:duansf> update users using ttl 432000 set password='asldkjsfsdf' where key = 'jsmith';

更新密码列的到期时间为5天。

6.删除列元数据 

cqlsh:duansf> alter table users drop coupon_code;

7.索引Column 

cqlsh:duansf> create index state_key on users(state);
cqlsh:duansf> create index birth_year_key on users(birth_year);

8.删除列或者行 

cqlsh:duansf> delete session_token from users where key='jsmith';  //删除session_token列
cqlsh:duansf> select * from users;

 key    | birth_year | gender | password    | session_token | state
--------+------------+--------+-------------+---------------+-------
 jsmith |       null |   null | asldkjsfsdf |          null |  null

(1 rows)
cqlsh:duansf> delete from users where key='jsmith';  //删除key=jsmith的行
cqlsh:duansf> select * from users;

 key | birth_year | gender | password | session_token | state
-----+------------+--------+----------+---------------+-------

(0 rows)
cqlsh:duansf>

9. 删除columnfamily和keyspace 

cqlsh:duansf> drop columnfamily users;
cqlsh:duansf> insert into users(key,password) values('jsmith','chadsfl') using ttl 86400;
InvalidRequest: code=2200 [Invalid query] message="unconfigured columnfamily users"
cqlsh:duansf>

删除keyspace

cqlsh:duansf> drop keyspace duansf;
cqlsh:duansf> use duansf;
InvalidRequest: code=2200 [Invalid query] message="Keyspace 'duansf' does not exist"
cqlsh:duansf>

 

10.查看结构信息

cqlsh:usermanager> desc users;

CREATE TABLE usermanager.users (
    key blob PRIMARY KEY,
    age text,
    name text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

 

 

 

 

 

转载于:https://www.cnblogs.com/duanxz/p/5507013.html

<think>好的,用户现在问的是“cql用法”,我需要详细解释CQL(Cassandra Query Language)的基本用法。首先,我应该回顾CQL的基本概念,然后分部分讲解,比如数据定义语言(DDL)、数据操作语言(DML)、查询语句等。 首先,CQL是Cassandra的查询语言,类似于SQL,但针对Cassandra的分布式特性做了调整。需要先介绍CQL的基本特点,比如大小写不敏感(关键字通常大写),使用键空间(Keyspace)作为数据库,表结构设计等。 接下来,DDL部分包括创建键空间(CREATE KEYSPACE)、删除键空间(DROP KEYSPACE)、创建表(CREATE TABLE)、修改表(ALTER TABLE)、删除表(DROP TABLE)等。需要给出具体的语法示例,比如创建键空间时的复制策略(SimpleStrategy或NetworkTopologyStrategy)和一致性级别。 然后是DML部分,包括插入数据INSERT)、更新数据(UPDATE)、删除数据(DELETE)、批量操作(BATCH)等。需要注意CQLINSERT如果主键存在会覆盖原有数据,UPDATE可以指定字段更新,DELETE可以删除行或特定列。 查询语句(DQL)是重点,包括SELECT的基本用法,支持WHERE子句(但必须包含分区键或使用ALLOW FILTERING),排序(ORDER BY,仅支持分区内排序),分页(LIMIT),聚合函数(COUNT、AVG等),以及使用IN操作符处理多个分区键的情况。 另外,需要提到CQL数据类型,比如基本类型(TEXT、INT、UUID)、集合类型(LIST、SET、MAP)、用户自定义类型(UDT)等,以及如何在创建表时使用这些类型。 还要注意CQL的一些限制,比如WHERE子句必须包含分区键,否则需要ALLOW FILTERING(不推荐生产环境使用),ORDER BY只能在同一分区内对聚类列排序等。 最后,可能需要给出一些实际的示例,比如创建键空间、创建表、插入数据、查询数据的完整流程,帮助用户理解。 现在需要组织这些内容,确保覆盖主要用法,结构清晰,示例明确。同时,根据用户的问题,可能需要重点突出常用操作,比如表结构设计、数据插入和查询,因为这些是最常用的部分。 需要避免过于深入的细节,保持内容实用,适合初学者理解。同时,要指出CQL与传统SQL的不同之处,比如分布式特性带来的限制,帮助用户避免常见错误。 总结下来,结构大致如下: 1. 简介(CQL是什么,与SQL的区别) 2. 基本概念(键空间、表、主键、分区键、聚类列) 3. DDL:键空间和表的管理 4. DML:数据插入、更新、删除、批量操作 5. DQL:数据查询(SELECT的各种用法) 6. 数据类型(基本类型、集合类型等) 7. 注意事项(WHERE限制、ORDER BY限制等) 现在需要将这些内容用简洁明了的语言表达,并提供示例代码,帮助用户理解。 </think>CQL(Cassandra Query Language)是Apache Cassandra的官方查询语言,语法与SQL类似,但针对分布式数据库特性进行了优化(如支持分区键、集合类型等)。以下是CQL的核心用法详解,涵盖**数据定义(DDL)、数据操作(DML)、数据查询(DQL)**等核心场景。 ### **一、基础概念** - **Keyspace(键空间)**:类比关系数据库的“数据库”,是表、用户权限等的逻辑容器。 - **Table(表)**:存储数据的二维结构,需定义主键(Partition Key + Clustering Columns)。 - **Primary Key(主键)**:唯一标识一行数据,由`Partition Key`(分区键,决定数据分布的节点)和可选的`Clustering Columns`(聚类列,决定分区内排序)组成。 - **一致性级别**:CQL操作需指定读写时的一致性要求(如`ONE`、`QUORUM`),默认由键空间配置。 ### **二、数据定义语言(DDL)** #### **1. 键空间操作** - **创建键空间** ```sql -- 使用简单复制策略(单数据中心测试用) CREATE KEYSPACE IF NOT EXISTS my_keyspace WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 3 }; -- 使用网络拓扑复制策略(多数据中心生产环境) CREATE KEYSPACE IF NOT EXISTS my_keyspace WITH replication = { 'class': 'NetworkTopologyStrategy', 'DC1': 3, 'DC2': 2 }; ``` - `replication_factor`:副本数(SimpleStrategy)。 - `DC1`、`DC2`:不同数据中心的副本数(NetworkTopologyStrategy)。 - **删除键空间** ```sql DROP KEYSPACE IF EXISTS my_keyspace; ``` - **切换键空间** ```sql USE my_keyspace; ``` #### **2. 表操作** - **创建表** ```sql CREATE TABLE IF NOT EXISTS user ( user_id UUID PRIMARY KEY, -- 分区键(单个字段) username TEXT, email TEXT, age INT, tags SET<TEXT>, -- 集合类型:标签 friends LIST<UUID>, -- 列表类型:好友ID profile MAP<TEXT, TEXT>, -- 映射类型:扩展信息(键值对) created_at TIMESTAMP -- 时间戳 ); ``` - 主键若由多字段组成,需用括号声明: `PRIMARY KEY ((user_id, region), created_at)` 其中`(user_id, region)`是分区键(复合分区键),`created_at`是聚类列(决定分区内排序)。 - **修改表(添加/删除列)** ```sql -- 添加列 ALTER TABLE user ADD phone TEXT; -- 删除列 ALTER TABLE user DROP phone; ``` - **删除表** ```sql DROP TABLE IF NOT EXISTS user; ``` ### **三、数据操作语言(DML)** #### **1. 插入数据INSERT)** ```sql -- 插入单行(主键存在时覆盖旧数据INSERT INTO user (user_id, username, email, age) VALUES ( uuid(), -- 生成随机UUID 'alice', 'alice@example.com', 28 ) IF NOT EXISTS; -- 可选:仅当主键不存在时插入(轻量级事务) ``` - `IF NOT EXISTS`:避免主键冲突(性能略低,适用于低冲突场景)。 - 集合类型赋值示例: ```sql INSERT INTO user (user_id, tags, friends) VALUES ( uuid(), {'java', 'cassandra'}, -- SET类型 [uuid(), uuid()] -- LIST类型 ); ``` #### **2. 更新数据(UPDATE)** ```sql -- 更新指定字段(主键必须存在) UPDATE user SET age = 29, tags = tags + {'python'} -- 向SET添加元素 WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; -- 更新MAP类型(添加/修改键值对) UPDATE user SET profile = profile + {'company': 'abc', 'title': 'engineer'} WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; ``` #### **3. 删除数据(DELETE)** ```sql -- 删除整行 DELETE FROM user WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; -- 删除指定列(或集合中的元素) DELETE age, tags['java'] -- 删除age列,或SET中的'java'元素(需明确元素值) FROM user WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; ``` #### **4. 批量操作(BATCH)** ```sql -- 批量插入/更新(同一分区内的操作会被优化) BEGIN BATCH INSERT INTO user (user_id, username) VALUES (uuid(), 'bob'); UPDATE user SET age = 30 WHERE user_id = xxxx; APPLY BATCH; ``` - 仅推荐**同一分区内**的批量操作(跨分区会降低性能)。 ### **四、数据查询语言(DQL)** #### **1. 基础查询(SELECT)** ```sql -- 查询所有列 SELECT * FROM user; -- 查询指定列 SELECT username, email FROM user; -- 限制返回行数(分页) SELECT * FROM user LIMIT 100; ``` #### **2. 条件查询(WHERE)** - **必须包含分区键**(或使用`ALLOW FILTERING`,不推荐生产环境): ```sql -- 单分区键查询 SELECT * FROM user WHERE user_id = 123e4567-e89b-12d3-a456-426614174000; -- 复合分区键查询((user_id, region) 是分区键) SELECT * FROM user WHERE user_id = '123' AND region = 'Asia'; -- 聚类列范围查询(需分区键精确匹配) SELECT * FROM user WHERE user_id = '123' AND created_at > '2024-01-01' ORDER BY created_at DESC; -- 按聚类列降序排序 ``` - **允许过滤(危险操作)**: ```sql -- 非分区键过滤(必须加ALLOW FILTERING,仅用于测试) SELECT * FROM user WHERE age > 25 ALLOW FILTERING; ``` #### **3. 聚合与统计** ```sql -- 统计行数(仅推荐小表使用) SELECT COUNT(*) FROM user; -- 统计特定条件的行数 SELECT COUNT(username) FROM user WHERE age > 25; -- 聚合函数(需配合GROUP BY,仅支持分区内聚合) SELECT region, COUNT(*) AS user_count FROM user GROUP BY region; ``` #### **4. 集合类型查询** ```sql -- 查询SET包含特定元素的行 SELECT * FROM user WHERE tags CONTAINS 'java'; -- 查询LIST中指定位置的元素(从0开始) SELECT friends[0] FROM user; -- 查询MAP中指定键的值 SELECT profile['company'] FROM user; ``` ### **五、注意事项** 1. **WHERE子句限制**:必须包含分区键(或其前缀),否则需`ALLOW FILTERING`(性能差,仅测试用)。 2. **ORDER BY限制**:仅支持对聚类列排序,且需与分区键一起使用。 3. **主键唯一性**:相同主键的插入会覆盖旧数据(无更新操作时)。 4. **集合类型性能**:LIST/SET/MAP适合小量数据(建议单个集合元素数<100),大数据量应拆分为独立表。 ### **六、常用命令** - 查看所有键空间:`DESCRIBE KEYSPACES;` - 查看表结构:`DESCRIBE TABLE user;` - 查看索引:`DESCRIBE INDEXES;`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值