当前位置:   article > 正文

cassandra数据库入门-4_cassandra 创建表

cassandra 创建表

插入数据

在表中创建数据
您可以使用命令 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_idemp_nameemp_cityemp_phoneemp_sal
1ramHyderabad984802233850000
2robinHyderabad984802233940000
3rahmanChennai984802233045000
  1. cqlsh:tutorialspoint> INSERT INTO emp (emp_id, emp_name, emp_city,
  2. emp_phone, emp_sal) VALUES(1,'ram', 'Hyderabad', 9848022338, 50000);
  3. cqlsh:tutorialspoint> INSERT INTO emp (emp_id, emp_name, emp_city,
  4. emp_phone, emp_sal) VALUES(2,'robin', 'Hyderabad', 9848022339, 40000);
  5. cqlsh:tutorialspoint> INSERT INTO emp (emp_id, emp_name, emp_city,
  6. emp_phone, emp_sal) VALUES(3,'rahman', 'Chennai', 9848022330, 45000);

确认
插入数据后,使用SELECT语句验证数据是否已经插入。 如果您使用 SELECT 语句验证 emp 表,它将为您提供以下输出。

  1. cqlsh:tutorialspoint> SELECT * FROM emp;
  2. emp_id | emp_city | emp_name | emp_phone | emp_sal
  3. --------+-----------+----------+------------+---------
  4. 1 | Hyderabad | ram | 9848022338 | 50000
  5. 2 | Hyderabad | robin | 9848022339 | 40000
  6. 3 | Chennai | rahman | 9848022330 | 45000
  7. (3 rows)

 使用 Java API 创建数据

  1. import com.datastax.driver.core.Cluster;
  2. import com.datastax.driver.core.Session;
  3. public class Create_Data {
  4. public static void main(String args[]){
  5. //queries
  6. String query1 = "INSERT INTO emp (emp_id, emp_name, emp_city, emp_phone, emp_sal)"
  7. + " VALUES(1,'ram', 'Hyderabad', 9848022338, 50000);" ;
  8. String query2 = "INSERT INTO emp (emp_id, emp_name, emp_city,
  9. emp_phone, emp_sal)"
  10. + " VALUES(2,'robin', 'Hyderabad', 9848022339, 40000);" ;
  11. String query3 = "INSERT INTO emp (emp_id, emp_name, emp_city, emp_phone, emp_sal)"
  12. + " VALUES(3,'rahman', 'Chennai', 9848022330, 45000);" ;
  13. //Creating Cluster object
  14. Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
  15. //Creating Session object
  16. Session session = cluster.connect("tp");
  17. //Executing the query
  18. session.execute(query1);
  19. session.execute(query2);
  20. session.execute(query3);
  21. System.out.println("Data created");
  22. }
  23. }

更新数据

更新表中的数据
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;
  1. import com.datastax.driver.core.Cluster;
  2. import com.datastax.driver.core.Session;
  3. public class Update_Data {
  4. public static void main(String args[]){
  5. //query
  6. String query = " UPDATE emp SET emp_city='Delhi',emp_sal=50000"
  7. //Creating Cluster object
  8. Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
  9. //Creating Session object
  10. Session session = cluster.connect("tp");
  11. //Executing the query
  12. session.execute(query);
  13. System.out.println("Data updated");
  14. }
  15. }

查询数据

使用 Select 子句读取数据
SELECT 子句用于从 Cassandra 中的表中读取数据。 使用此子句,您可以读取整个表格、单个列或特定单元格。 下面给出的是 SELECT 子句的语法。

SELECT FROM <tablename>

以下示例显示如何使用 SELECT 子句读取整个表。 在这里,我们正在读取一个名为 emp 的表。

  1. cqlsh:tutorialspoint> select * from emp;
  2. emp_id | emp_city | emp_name | emp_phone | emp_sal
  3. --------+-----------+----------+------------+---------
  4. 1 | Hyderabad | ram | 9848022338 | 50000
  5. 2 | null | robin | 9848022339 | 50000
  6. 3 | Chennai | rahman | 9848022330 | 50000
  7. 4 | Pune | rajeev | 9848022331 | 30000
  8. (4 rows)

阅读必填栏目
以下示例显示如何读取表中的特定列。

  1. cqlsh:tutorialspoint> SELECT emp_name, emp_sal from emp;
  2. emp_name | emp_sal
  3. ----------+---------
  4. ram | 50000
  5. robin | 50000
  6. rajeev | 30000
  7. rahman | 50000
  8. (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

  1. import com.datastax.driver.core.Cluster;
  2. import com.datastax.driver.core.ResultSet;
  3. import com.datastax.driver.core.Session;
  4. public class Read_Data {
  5. public static void main(String args[])throws Exception{
  6. //queries
  7. String query = "SELECT * FROM emp";
  8. //Creating Cluster object
  9. Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
  10. //Creating Session object
  11. Session session = cluster.connect("tutorialspoint");
  12. //Getting the ResultSet
  13. ResultSet result = session.execute(query);
  14. System.out.println(result.all());
  15. }
  16. }

删除数据

您可以使用命令 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

  1. import com.datastax.driver.core.Cluster;
  2. import com.datastax.driver.core.Session;
  3. public class Delete_Data {
  4. public static void main(String args[]){
  5. //query
  6. String query = "DELETE FROM emp WHERE emp_id=3;";
  7. //Creating Cluster object
  8. Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
  9. //Creating Session object
  10. Session session = cluster.connect("tp");
  11. //Executing the query
  12. session.execute(query);
  13. System.out.println("Data deleted");
  14. }
  15. }

CQL 数据类型

CQL 提供了一组丰富的内置数据类型,包括集合类型。 除了这些数据类型,用户还可以创建自己的自定义数据类型。 下表提供了 CQL 中可用的内置数据类型列表。

数据类型关键字描述
asciistrings表示 ASCII 字符串
bigintbigint表示 64-bit signed long
blobblobs表示任意常数 bytes
Booleanbooleans表示 true or false
counterintegers表示 计数器 column
decimalintegers, floats表示  decimal
doubleintegers表示64-bit IEEE-754 floating point
floatintegers, floats表示 32-bit IEEE-754 floating point
inetstrings表示 IP地址 IPv4 or IPv6
intintegers表示 32-bit signed int
textstrings表示 UTF8字符串
timestampintegers, strings表示  timestamp
timeuuiduuids表示 UUID
uuiduuids表示 1 或 4
UUID
varcharstrings表示uTF8字符串
varintintegers表示任意精度整数

集合类型
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 语句验证表,您将得到以下结果 -

  1. cqlsh:tutorialspoint> SELECT * FROM data;
  2. name | email
  3. ------+--------------------------------------------------------------
  4. ramu | ['abc@gmail.com', 'cba@yahoo.com', 'xyz@tutorialspoint.com']
  5. (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 语句验证表,您将得到以下结果 -

  1. cqlsh:tutorialspoint> SELECT * FROM data2;
  2. name | phone
  3. --------+--------------------------------------
  4. rahman | {9848022330, 9848022338, 9848022339}
  5. (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 语句验证表,您将得到以下结果 -

  1. cqlsh:tutorialspoint> select * from data3;
  2. name | address
  3. -------+-------------------------------------------
  4. robin | {'home': 'hyderabad', 'office': 'mumbai'}
  5. (1 rows)

CQL 用户定义的数据类型

CQL 提供了创建和使用用户定义数据类型的便利。 您可以创建一个数据类型来处理多个字段。 本章说明如何创建、更改和删除用户定义的数据类型。

创建用户定义的数据类型
命令 CREATE TYPE 用于创建用户定义的数据类型。 其语法如下 -

CREATE TYPE <keyspace name>. <data typename>
( variable1, variable2).

例子
下面给出了创建用户定义数据类型的示例。 在此示例中,我们正在创建一个包含以下详细信息的 card_details 数据类型。

属性属性名数据类型
credit card nonumint
credit card pinpinint
name on credit cardnametext
cvvcvvint
Contact details of card holderphoneset
  1. cqlsh:tutorialspoint> CREATE TYPE card_details (
  2. ... num int,
  3. ... pin int,
  4. ... name text,
  5. ... cvv int,
  6. ... phone set<int>
  7. ... );

注意 - 用于用户定义数据类型的名称不应与保留类型名称一致。

确认
使用 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中可以包含多个表。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/126497
推荐阅读
相关标签
  

闽ICP备14008679号