1 查询数据
语法
使用 SELECT 、WHERE、LIKE、GROUP BY 、ORDER BY等关键词
SELECT FROM <tablename>
SELECT FROM <table name> WHERE <condition>;
1.1 查询所有数据
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是普通列
2.1 第一主键 只能用=号查询
key_one列是第一主键 对key_one进行 = 号查询,可以查出结果
2.2 第二主键 支持 = 、>、 <、 >= 、 <=
key_two是第二主键
不要单独对key_two 进行 查询,
注意:加上ALLOW FILTERING 后确实可以查询出数据,但是不建议这么做
正确的做法是 ,在查询第二主键时,前面先写上第一主键
2.3 索引列 只支持=号
2.4 普通列,非索引非主键字段
name是普通列,在查询时需要使用ALLOW FILTERING
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值
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的任何查询,最后的结果都是有序的,内部就是这样存储的。
索引列支持
主键支持
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 ,效果:
添加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;
6.2.2 删除一个元素
使用UPDATE命令 和 ‘-’ 操作符
update student set interest = interest - {'电影'} where id =1012;
6.2.3 删除所有元素
可以使用UPDATA或DELETE命令,效果一样
UPDATE student SET interest = {} WHERE student_id = 1012;
或 DELETE interest FROM student WHERE student_id = 1012;
一般来说,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;
6.3.2 在list前面插入值
update student set phone = ['020-66666666'] + phone where id = 1012;
可以看到新数据的位置在旧数据的前面,效果:
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;覆盖“中学”为“国际中学”,添加“幼儿园”数据,效果:
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;
执行上面的代码,效果