1 查询数据

语法
使用 SELECT 、WHERE、LIKE、GROUP BY 、ORDER BY等关键词
SELECT FROM <tablename>
SELECT FROM <table name> WHERE <condition>;

1.1 查询所有数据

Cassandra基本操作(数据)_数据

1.2 根据主键查询

查询id = 1012 的行

select * from student where id = 1012;

2 查询时使用索引

Cassandra对查询时使用索引有一定的要求,具体如下:

  • Primary Key 只能用 = 号查询
  • 第二主键 支持= > < >= <=
  • 索引列 只支持
  • 非索引非主键字段过滤可以使用ALLOW FILTERING
create table test04(
key_one int,
key_two int,
name text,
age int,
primary key(key_one,key_two)
);

create index tage on test04(age);
insert into test04(key_one,key_two,name,age) values(16,13,'rose',27);
insert into test04(key_one,key_two,name,age) values(8,5,'jerry',22);
insert into test04(key_one,key_two,name,age) values(4,2,'tom',20);
insert into test04(key_one,key_two,name,age) values(12,8,'jack',19);

可以看到key_one 是第一主键,key_two是第二主键,age是索引列,name是普通列

Cassandra基本操作(数据)_数据_02

2.1 第一主键 只能用=号查询

key_one列是第一主键 对key_one进行 = 号查询,可以查出结果

Cassandra基本操作(数据)_Cassandra_03


2.2 第二主键 支持 = 、>、 <、 >= 、 <=

key_two是第二主键

不要单独对key_two 进行 查询,

Cassandra基本操作(数据)_主键_04

注意:加上ALLOW FILTERING 后确实可以查询出数据,但是不建议这么做

正确的做法是 ,在查询第二主键时,前面先写上第一主键

Cassandra基本操作(数据)_Cassandra_05

2.3 索引列 只支持=号

Cassandra基本操作(数据)_数据_06

2.4 普通列,非索引非主键字段

name是普通列,在查询时需要使用ALLOW FILTERING

Cassandra基本操作(数据)_数据_07

2.5 集合列

使用student表来测试集合列上的索引使用。

假设已经给集合添加了索引,就可以使用where子句的CONTAINS条件按照给定的值进行过滤。

select * from student where interest CONTAINS '电影';        -- 查询set集合

select * from student where education CONTAINS key  '小学';  --查询map集合的key值

select * from student where education CONTAINS '中心第9小学' allow filtering; --查询map的value值

Cassandra基本操作(数据)_数据_08

2.6 ALLOW FILTERING

ALLOW FILTERING是一种非常消耗计算机资源的查询方式。 如果表包含例如100万行,并且其中95%具有满足查询条件的值,则查询仍然相对有效,这时应该使用ALLOW FILTERING。

如果表包含100万行,并且只有2行包含满足查询条件值,则查询效率极低。Cassandra将无需加载999,998行。如果经常使用查询,则最好在列上添加索引。

ALLOW FILTERING在表数据量小的时候没有什么问题,但是数据量过大就会使查询变得缓慢。

3 查询时排序

cassandra也是支持排序的,order by。 排序也是有条件的

3.1 必须有第一主键的=号查询

cassandra的第一主键是决定记录分布在哪台机器上,cassandra只支持单台机器上的记录排序。

3.2 只能根据第二、三、四…主键进行有序的,相同的排序。

3.3 不能有索引查询

cassandra的任何查询,最后的结果都是有序的,内部就是这样存储的。

Cassandra基本操作(数据)_数据_09

索引列支持

主键支持

4 分页查询

使用limit 关键字来限制查询结果的条数 进行分页

5 添加数据

语法:

INSERT INTO <tablename>(<column1 name>, <column2 name>....) VALUES (<value1>, <value2>....) USING <option>

给student添加2行数据,包含对set,list ,map类型数据,代码:

INSERT INTO student (id,address,age,gender,name,interest, phone,education) VALUES (1011,'中山路21号',16,1,'Tom',{'游泳', '跑步'},['010-88888888','13888888888'],{'小学' : '城市第一小学', '中学' : '城市第一中学'}) ;

INSERT INTO student (id,address,age,gender,name,interest, phone,education) VALUES (1012,'朝阳路19号',17,2,'Jerry',{'看书', '电影'},['020-66666666','13666666666'],{'小学' :'城市第五小学','中学':'城市第五中学'});

执行上面的代码,然后 select * from student ,效果:

Cassandra基本操作(数据)_数据_10

添加TTL,设定的computed_ttl数值秒后,数据会自动删除

INSERT INTO student (id,address,age,gender,name,interest, phone,education) VALUES (1030,'朝阳路30号',20,1,'Cary',{'运动', '游戏'},['020-7777888','139876667556'],{'小学' :'第30小学','中学':'第30中学'}) USING TTL 60;

6 更新列数据

更新表中的数据,可用关键字:

Where - 选择要更新的行

Set - 设置要更新的值

Must - 包括组成主键的所有列

在更新行时,如果给定行不可用,则UPDATE创建一个新行

语法:

UPDATE <tablename>

SET <column name> = <new value>

<column name> = <value>....

WHERE <condition>

6.1 更新简单数据

把student_id = 1012 的数据的gender列 的值改为1,代码:

update student set gender=1 where id=1012;

6.2 更新set类型数据

在student中interest列是set类型

6.2.1 添加一个元素

使用UPDATE命令 和 ‘+’ 操作符

代码:update student set interest = interest + {'打地鼠'} where id = 1012;

Cassandra基本操作(数据)_数据_11

6.2.2 删除一个元素

使用UPDATE命令 和 ‘-’ 操作符

update student set interest = interest - {'电影'} where id =1012;

Cassandra基本操作(数据)_数据_12

6.2.3 删除所有元素

可以使用UPDATA或DELETE命令,效果一样

UPDATE student SET interest = {} WHERE student_id = 1012;

或 DELETE interest FROM student WHERE student_id = 1012;

Cassandra基本操作(数据)_Cassandra_13

一般来说,Set,list和Map要求最少有一个元素,否则Cassandra无法把其同一个空值区分

6.3 更新list类型数据

在student中phone列是list类型

6.3.1 使用UPDATA命令向list插入值

update student set phone = ['020-55555555', '13555555555'] where id = 1012;

Cassandra基本操作(数据)_Cassandra_14

6.3.2 在list前面插入值

update student set phone = ['020-66666666'] + phone where id = 1012;

可以看到新数据的位置在旧数据的前面,效果:

Cassandra基本操作(数据)_主键_15

6.3.3 在list后面插入值

update student set phone = phone + ['020-77777777'] where id = 1012;

6.3.4 使用列表索引设置值,覆盖已经存在的值

这种操作会读入整个list,效率比上面2种方式差

现在把phone中下标为2的数据,也就是 “13555555555”替换,代码:

update student set phone[2] = '13999999999' where id = 1012;

6.3.5【不推荐】使用DELETE命令和索引删除某个特定位置的值

非线程安全的,如果在操作时其它线程在前面添加了一个元素,会导致移除错误的元素

代码:delete phone[2] from student where id = 1012;

6.3.6【推荐】使用UPDATE命令和‘-’移除list中所有的特定值

代码:update student set phone = phone - ['020-66666666'] where id = 1012;

6.4 更新map类型数据

map输出顺序取决于map类型。

6.4.1 使用Insert或Update命令

update student set education = {'中学': '城市第四中学', '小学': '城市第四小学'} where id = 1012;

6.4.2 使用UPDATE命令设置指定元素的value

update student set education['中学'] = '实验中学' where id = 1012;

6.4.3 可以使用如下语法增加map元素。如果key已存在,value会被覆盖,不存在则插入

update student set education = education + {'幼儿园': '兴民幼儿园','中学': '国际中学'} where id = 1012;覆盖“中学”为“国际中学”,添加“幼儿园”数据,效果:

Cassandra基本操作(数据)_主键_16

6.4.4 删除元素

可以用DELETE 和 UPDATE 删除Map类型中的数据使用DELETE删除数据delete education['幼儿园'] from student where id = 1012;使用UPDATE删除数据update student set education = education - {'小学'} where id = 1012;

7 删除行

语法DELETE FROM <identifier> WHERE <condition>;

代码DELETE FROM student WHERE student_id=1012;

8 批量操作

作用:把多次更新操作合并为一次请求,减少客户端和服务端的网络交互。语法
使用BATCH,您可以同时执行多个修改语句(插入,更新,删除)BEGIN BATCH
<insert-stmt>/ <update-stmt>/ <delete-stmt>
APPLY BATCH
1、先把test04数据清空
TRUNCATE  table test04;
2、在批量操作中实现 3个操作:
新增两行数据,key_one=3,key_one=4
更新key_one=3的数据,把年龄改为33,
删除已经存在的key_one=4的数据,代码:
BEGIN BATCH
insert into test04(key_one,key_two,name,age) values(3,3,'zhangsan',3);
insert into test04(key_one,key_two,name,age) values(4,4,'lisi',4);
update test04 set age=33 where key_one=3 and key_two=3;
delete from test04 where key_one=4 and key_two=4;
APPLY BATCH;

执行上面的代码,效果

Cassandra基本操作(数据)_数据_17