神木网站建设免费下载优化大师
插入数据
在表中创建数据
您可以使用命令 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 | 500002 | Hyderabad | robin | 9848022339 | 400003 | 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[]){//queriesString 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 objectCluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();//Creating Session objectSession session = cluster.connect("tp");//Executing the querysession.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=50000WHERE 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[]){//queryString query = " UPDATE emp SET emp_city='Delhi',emp_sal=50000"//Creating Cluster objectCluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();//Creating Session objectSession session = cluster.connect("tp");//Executing the querysession.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 | 500002 | null | robin | 9848022339 | 500003 | Chennai | rahman | 9848022330 | 500004 | Pune | rajeev | 9848022331 | 30000(4 rows)
阅读必填栏目
以下示例显示如何读取表中的特定列。
cqlsh:tutorialspoint> SELECT emp_name, emp_sal from emp;emp_name | emp_sal
----------+---------ram | 50000robin | 50000rajeev | 30000rahman | 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 | 500002 | null | robin | 9848022339 | 500003 | 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{//queriesString query = "SELECT * FROM emp";//Creating Cluster objectCluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();//Creating Session objectSession session = cluster.connect("tutorialspoint");//Getting the ResultSetResultSet 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[]){//queryString query = "DELETE FROM emp WHERE emp_id=3;";//Creating Cluster objectCluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();//Creating Session objectSession session = cluster.connect("tp");//Executing the querysession.execute(query);System.out.println("Data deleted");}
}
CQL 数据类型
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集合
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 是一种数据类型,用于存储元素的键值对。
以下示例显示如何创建一个包含两列(名称和地址)的示例表。 为了存储多个地址值,我们使用 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 用户定义的数据类型
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中可以包含多个表。