赞
踩
在表中创建数据
您可以使用命令 INSERT 将数据插入表中一行的列中。 下面给出了在表中创建数据的语法。
INSERT INTO <tablename> (<column1 name>, <column2 name>....) VALUES (<value1>, <value2>....) USING <option>
例子
让我们假设有一个名为 emp 的表,其中包含列(emp_id、emp_name、emp_city、emp_phone、emp_sal),您必须将以下数据插入到 emp 表中。
emp_id | emp_name | emp_city | emp_phone | emp_sal |
---|---|---|---|---|
1 | ram | Hyderabad | 9848022338 | 50000 |
2 | robin | Hyderabad | 9848022339 | 40000 |
3 | rahman | Chennai | 9848022330 | 45000 |
- cqlsh:tutorialspoint> INSERT INTO emp (emp_id, emp_name, emp_city,
- emp_phone, emp_sal) VALUES(1,'ram', 'Hyderabad', 9848022338, 50000);
-
- cqlsh:tutorialspoint> INSERT INTO emp (emp_id, emp_name, emp_city,
- emp_phone, emp_sal) VALUES(2,'robin', 'Hyderabad', 9848022339, 40000);
-
- cqlsh:tutorialspoint> INSERT INTO emp (emp_id, emp_name, emp_city,
- emp_phone, emp_sal) VALUES(3,'rahman', 'Chennai', 9848022330, 45000);
确认
插入数据后,使用SELECT语句验证数据是否已经插入。 如果您使用 SELECT 语句验证 emp 表,它将为您提供以下输出。
- cqlsh:tutorialspoint> SELECT * FROM emp;
-
- emp_id | emp_city | emp_name | emp_phone | emp_sal
- --------+-----------+----------+------------+---------
- 1 | Hyderabad | ram | 9848022338 | 50000
- 2 | Hyderabad | robin | 9848022339 | 40000
- 3 | Chennai | rahman | 9848022330 | 45000
-
- (3 rows)
使用 Java API 创建数据
- import com.datastax.driver.core.Cluster;
- import com.datastax.driver.core.Session;
-
- public class Create_Data {
-
- public static void main(String args[]){
-
- //queries
- String query1 = "INSERT INTO emp (emp_id, emp_name, emp_city, emp_phone, emp_sal)"
-
- + " VALUES(1,'ram', 'Hyderabad', 9848022338, 50000);" ;
-
- String query2 = "INSERT INTO emp (emp_id, emp_name, emp_city,
- emp_phone, emp_sal)"
-
- + " VALUES(2,'robin', 'Hyderabad', 9848022339, 40000);" ;
-
- String query3 = "INSERT INTO emp (emp_id, emp_name, emp_city, emp_phone, emp_sal)"
-
- + " VALUES(3,'rahman', 'Chennai', 9848022330, 45000);" ;
-
- //Creating Cluster object
- Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
-
- //Creating Session object
- Session session = cluster.connect("tp");
-
- //Executing the query
- session.execute(query1);
-
- session.execute(query2);
-
- session.execute(query3);
-
- System.out.println("Data created");
- }
- }
更新表中的数据
UPDATE 是用于更新表中数据的命令。 更新表中的数据时使用以下关键字 -
Where - 此子句用于选择要更新的行。
Set - 使用此关键字设置值。
Must - 包括构成主键的所有列。
更新行时,如果给定行不可用,则 UPDATE 会创建一个新行。 下面给出的是 UPDATE 命令的语法 -
UPDATE <tablename> SET <column name> = <new value> <column name> = <value>.... WHERE <condition>
现在让我们将 robin 的 emp_city 更新为德里,并将他的薪水更新为 50000。下面给出的是执行所需更新的查询。
cqlsh:tutorialspoint> UPDATE emp SET emp_city='Delhi',emp_sal=50000 WHERE emp_id=2;
- import com.datastax.driver.core.Cluster;
- import com.datastax.driver.core.Session;
-
- public class Update_Data {
-
- public static void main(String args[]){
-
- //query
- String query = " UPDATE emp SET emp_city='Delhi',emp_sal=50000"
-
- //Creating Cluster object
- Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
-
- //Creating Session object
- Session session = cluster.connect("tp");
-
- //Executing the query
- session.execute(query);
-
- System.out.println("Data updated");
- }
- }
使用 Select 子句读取数据
SELECT 子句用于从 Cassandra 中的表中读取数据。 使用此子句,您可以读取整个表格、单个列或特定单元格。 下面给出的是 SELECT 子句的语法。
SELECT FROM <tablename>
以下示例显示如何使用 SELECT 子句读取整个表。 在这里,我们正在读取一个名为 emp 的表。
- cqlsh:tutorialspoint> select * from emp;
-
- emp_id | emp_city | emp_name | emp_phone | emp_sal
- --------+-----------+----------+------------+---------
- 1 | Hyderabad | ram | 9848022338 | 50000
- 2 | null | robin | 9848022339 | 50000
- 3 | Chennai | rahman | 9848022330 | 50000
- 4 | Pune | rajeev | 9848022331 | 30000
-
- (4 rows)
阅读必填栏目
以下示例显示如何读取表中的特定列。
- cqlsh:tutorialspoint> SELECT emp_name, emp_sal from emp;
-
- emp_name | emp_sal
- ----------+---------
- ram | 50000
- robin | 50000
- rajeev | 30000
- rahman | 50000
-
- (4 rows)
Where 子句
使用 WHERE 子句,您可以对所需的列施加约束。 其语法如下 -
SELECT FROM <table name> WHERE <condition>;
注意 - WHERE 子句只能用于作为主键的一部分或在其上具有二级索引的列。
在下面的示例中,我们正在读取薪水为 50000 的员工的详细信息。首先,将二级索引设置为列 emp_sal。
cqlsh:tutorialspoint> CREATE INDEX ON emp(emp_sal); cqlsh:tutorialspoint> SELECT * FROM emp WHERE emp_sal=50000; emp_id | emp_city | emp_name | emp_phone | emp_sal --------+-----------+----------+------------+--------- 1 | Hyderabad | ram | 9848022338 | 50000 2 | null | robin | 9848022339 | 50000 3 | Chennai | rahman | 9848022330 | 50000
使用Java API
- import com.datastax.driver.core.Cluster;
- import com.datastax.driver.core.ResultSet;
- import com.datastax.driver.core.Session;
-
- public class Read_Data {
-
- public static void main(String args[])throws Exception{
-
- //queries
- String query = "SELECT * FROM emp";
-
- //Creating Cluster object
- Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
-
- //Creating Session object
- Session session = cluster.connect("tutorialspoint");
-
- //Getting the ResultSet
- ResultSet result = session.execute(query);
-
- System.out.println(result.all());
- }
- }
您可以使用命令 DELETE 从表中删除数据。 其语法如下 -
DELETE FROM <identifier> WHERE <condition>;
以下语句删除最后一行的 emp_sal 列 -
cqlsh:tutorialspoint> DELETE emp_sal FROM emp WHERE emp_id=3;
删除整行
以下命令从表中删除整行。
cqlsh:tutorialspoint> DELETE FROM emp WHERE emp_id=3;
使用Java API
- import com.datastax.driver.core.Cluster;
- import com.datastax.driver.core.Session;
-
- public class Delete_Data {
-
- public static void main(String args[]){
-
- //query
- String query = "DELETE FROM emp WHERE emp_id=3;";
-
- //Creating Cluster object
- Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
-
- //Creating Session object
- Session session = cluster.connect("tp");
-
- //Executing the query
- session.execute(query);
-
- System.out.println("Data deleted");
- }
- }
CQL 提供了一组丰富的内置数据类型,包括集合类型。 除了这些数据类型,用户还可以创建自己的自定义数据类型。 下表提供了 CQL 中可用的内置数据类型列表。
数据类型 | 关键字 | 描述 |
---|---|---|
ascii | strings | 表示 ASCII 字符串 |
bigint | bigint | 表示 64-bit signed long |
blob | blobs | 表示任意常数 bytes |
Boolean | booleans | 表示 true or false |
counter | integers | 表示 计数器 column |
decimal | integers, floats | 表示 decimal |
double | integers | 表示64-bit IEEE-754 floating point |
float | integers, floats | 表示 32-bit IEEE-754 floating point |
inet | strings | 表示 IP地址 IPv4 or IPv6 |
int | integers | 表示 32-bit signed int |
text | strings | 表示 UTF8字符串 |
timestamp | integers, strings | 表示 timestamp |
timeuuid | uuids | 表示 UUID |
uuid | uuids | 表示 1 或 4 |
UUID | ||
varchar | strings | 表示uTF8字符串 |
varint | integers | 表示任意精度整数 |
集合类型
Cassandra 查询语言还提供了集合数据类型。 下表提供了 CQL 中可用的集合列表。
集合 | 描述 |
---|---|
list | 列表是一个或多个有序元素的集合。 |
map | 映射是键值对的集合。 |
set | 集合是一个或多个元素的集合。 |
用户定义的数据类型
Cqlsh 为用户提供了创建自己的数据类型的便利。 下面给出了处理用户定义的数据类型时使用的命令。
CREATE TYPE - 创建用户定义的数据类型。
ALTER TYPE - 修改用户定义的数据类型。
DROP TYPE - 删除用户定义的数据类型。
DESCRIBE TYPE - 描述用户定义的数据类型。
DESCRIBE TYPES - 描述用户定义的数据类型。
CQL 提供了使用集合数据类型的便利。 使用这些集合类型,您可以将多个值存储在单个变量中。 本章介绍如何在 Cassandra 中使用集合。
列表
列表用于以下情况
要保持元素的顺序,并且
一个值要存储多次。
您可以使用列表中元素的索引获取列表数据类型的值。
使用列表创建表
下面给出的示例创建了一个包含两列(名称和电子邮件)的示例表。 要存储多封电子邮件,我们使用列表。
CREATE TABLE data(name text PRIMARY KEY, email list<text>)
将数据插入列表
将数据插入列表中的元素时,请在方括号 [ ] 内输入以逗号分隔的所有值,如下所示。
cqlsh:tutorialspoint> INSERT INTO data(name, email) VALUES ('ramu', ['abc@gmail.com','cba@yahoo.com'])
更新列表
下面给出了一个示例,用于更新名为 data 的表中的列表数据类型。 在这里,我们正在向列表中添加另一封电子邮件。
cqlsh:tutorialspoint> UPDATE data ... SET email = email +['xyz@tutorialspoint.com'] ... where name = 'ramu';
确认
如果您使用 SELECT 语句验证表,您将得到以下结果 -
- cqlsh:tutorialspoint> SELECT * FROM data;
-
- name | email
- ------+--------------------------------------------------------------
- ramu | ['abc@gmail.com', 'cba@yahoo.com', 'xyz@tutorialspoint.com']
-
- (1 rows)
Set
Set 是一种数据类型,用于存储一组元素。 集合的元素将按排序顺序返回。
使用 Set 创建表
以下示例创建一个包含两列的示例表,名称和电话。 为了存储多个电话号码,我们使用 set。
CREATE TABLE data2 (name text PRIMARY KEY, phone set<varint>);
将数据插入集合
在将数据插入集合中的元素时,在花括号 { } 内输入以逗号分隔的所有值,如下所示。
INSERT INTO data2(name, phone)VALUES ('rahman', {9848022338,9848022339});
更新集合
以下代码显示如何更新名为 data2 的表中的集合。 在这里,我们正在向集合中添加另一个电话号码。
cqlsh:tutorialspoint> UPDATE data2 ... SET phone = phone + {9848022330} ... where name = 'rahman';
确认
如果您使用 SELECT 语句验证表,您将得到以下结果 -
- cqlsh:tutorialspoint> SELECT * FROM data2;
-
- name | phone
- --------+--------------------------------------
- rahman | {9848022330, 9848022338, 9848022339}
-
- (1 rows)
Map 是一种数据类型,用于存储元素的键值对。
以下示例显示如何创建一个包含两列(名称和地址)的示例表。 为了存储多个地址值,我们使用 map。
CREATE TABLE data3 (name text PRIMARY KEY, address map<timestamp, text>);
将数据插入Map
将数据插入Map中的元素时,在花括号 {} 内输入所有键:值对,以逗号分隔,如下所示。
INSERT INTO data3 (name, address) VALUES ('robin', {'home' : 'hyderabad' , 'office' : 'Delhi' } );
更新Map
以下代码显示如何更新名为 data3 的表中的地图数据类型。 这里我们改变的是key office 的值,也就是说,我们改变的是一个叫robin 的人的办公室地址。
cqlsh:tutorialspoint> UPDATE data3 ... SET address = address+{'office':'mumbai'} ... WHERE name = 'robin';
确认
如果您使用 SELECT 语句验证表,您将得到以下结果 -
- cqlsh:tutorialspoint> select * from data3;
-
- name | address
- -------+-------------------------------------------
- robin | {'home': 'hyderabad', 'office': 'mumbai'}
-
- (1 rows)
CQL 提供了创建和使用用户定义数据类型的便利。 您可以创建一个数据类型来处理多个字段。 本章说明如何创建、更改和删除用户定义的数据类型。
创建用户定义的数据类型
命令 CREATE TYPE 用于创建用户定义的数据类型。 其语法如下 -
CREATE TYPE <keyspace name>. <data typename> ( variable1, variable2).
例子
下面给出了创建用户定义数据类型的示例。 在此示例中,我们正在创建一个包含以下详细信息的 card_details 数据类型。
属性 | 属性名 | 数据类型 |
---|---|---|
credit card no | num | int |
credit card pin | pin | int |
name on credit card | name | text |
cvv | cvv | int |
Contact details of card holder | phone | set |
- cqlsh:tutorialspoint> CREATE TYPE card_details (
- ... num int,
- ... pin int,
- ... name text,
- ... cvv int,
- ... phone set<int>
- ... );
注意 - 用于用户定义数据类型的名称不应与保留类型名称一致。
确认
使用 DESCRIBE 命令验证创建的类型是否已创建。
CREATE TYPE tutorialspoint.card_details ( num int, pin int, name text, cvv int, phone set<int> );
更改用户定义的数据类型
ALTER TYPE - 命令用于改变现有的数据类型。 使用 ALTER,您可以添加新字段或重命名现有字段。
向类型添加字段
使用以下语法将新字段添加到现有的用户定义数据类型。
ALTER TYPE typename ADD field_name field_type;
以下代码将新字段添加到 Card_details 数据类型。 在这里,我们添加了一个名为 email 的新字段。
cqlsh:tutorialspoint> ALTER TYPE card_details ADD email text;
确认
使用 DESCRIBE 命令验证是否添加了新字段。
cqlsh:tutorialspoint> describe type card_details; CREATE TYPE tutorialspoint.card_details ( num int, pin int, name text, cvv int, phone set<int>, );
重命名类型中的字段
使用以下语法重命名现有的用户定义数据类型。
ALTER TYPE typename RENAME existing_name TO new_name;
例子:
cqlsh:tutorialspoint> ALTER TYPE card_details RENAME email TO mail;
验证:
cqlsh:tutorialspoint> describe type card_details; CREATE TYPE tutorialspoint.card_details ( num int, pin int, name text, cvv int, phone set<int>, mail text );
删除用户定义的数据类型
DROP TYPE 是用于删除用户定义数据类型的命令。 下面给出了删除用户定义数据类型的示例。
例子
在删除之前,使用 DESCRIBE_TYPES 命令验证所有用户定义数据类型的列表,如下所示。
cqlsh:tutorialspoint> DESCRIBE TYPES; card_details card
从这两种类型中,删除名为 card 的类型,如下所示。
cqlsh:tutorialspoint> drop type card;
使用 DESCRIBE 命令验证数据类型是否被丢弃。
cqlsh:tutorialspoint> describe types; card_details
推荐大家在实际的环境中使用ScyllaDB,ScyllaDB是用C++重写的Cassandra,其官网宣称其每节点每秒可处理100万TPS。ScyllaDB完全兼容Apache Cassandra,拥有比Cassandra多10X倍的吞吐量,并降低了延迟。ScyllaDB是性能优异的NoSQL列存储数据库。
ScyllaDB在垃圾收集或者Compaction的时候不需要暂停(但是通过压测和Longevity测试发现Compaction的过程中对性能还是有很大影响)。
ScyllaDB在常规生产负载的时候可以添加或删除节点(通过nodetool来同步数据)。
ScyllaDB是一个P2P的分布式系统,集群中各节点之间相互平等。其数据分布于集群中的各节点,各节点之间每秒钟交换一次信息。
其每个节点使用Commit Log提交日志捕获写操作来保持数据的正确性。数据首先被写入MemTable(内存中的数据结构)中。当MemTable满后数据被写入SSTable(存储在硬盘上的数据文件)中。
用户可以使用类似于SQL的CQL来查询数据。用户可以链接至集群中的任意节点。
在集群中,一个Keyspace代表关系数据库中的一个数据库。一个Keyspace中可以包含多个表。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。