13

我对 Cassandra 很陌生,一周前才开始学习 Cassandra。我第一次读到它是 NoSQL,但是当我开始使用 CQL 时,我开始怀疑 Cassandra 是 NoSQL 还是 SQL DB?

有人可以解释为什么 CQL 或多或少像 SQL 吗?

4

3 回答 3

47

CQL 像 SQL 一样是声明性的,语言的查询组件的非常基本的结构(选择条件的东西)是相同的。但是有足够的差异,人们不应该以与传统 SQL 相同的方式使用它。

显而易见的项目: 1. 没有连接或子查询。2. 没有交易

不太明显但同样重要的是要注意:

  1. 除主键外,如果您已在该列上创建了索引,则只能对该列应用 WHERE 条件。在 SQL 中,您不必索引列以对其进行过滤,但在 CQL 中,select 语句将彻底失败。
  2. 没有 OR 或 NOT 逻辑运算符,只有 AND。对数据进行建模非常重要,因此您不需要这两个;很容易不小心忘记。
  3. 日期处理完全不同。CQL 只允许对时间戳使用相等运算符,因此像这样极其常见和有用的表达式不起作用:where dateField > TO_TIMESTAMP('2013-01-01','YYYY-MM-DD') 此外,CQL 不允许将日期的字符串插入精确到毫秒(仅秒)——但它确实允许从纪元开始输入毫秒作为long int - 大多数其他数据库引擎不允许这样做。最后,对于没有时区的长毫秒和字符串格式,时区(作为 GMT 偏移量)是不可见的。对于那些故意不将本地时间 + GMT 偏移量混为一谈的系统,这可能会导致混淆。
  4. 您只能根据主键(或主键的 IN 列表)更新表。您不能根据其他列数据进行更新,也不能像这样进行大规模更新:update table set field = value; CQL 需要带有主键的 where 子句。
  5. AND 的语法不允许使用括号。公平地说,由于缺少 OR 运算符,这不是必需的,但这意味着在表达式周围添加“保护性”括号的传统 SQL 重写器不适用于 CQL,例如:select * from www where (str1 = 'foo2') and (dat1 = 12312442);

一般来说,最好将 Cassandra 用作一个大的、有弹性的数据永久存储,可以应用少量非常高级、非常高性能的查询来拖出数据子集以在应用程序层使用。该子集可能是 100 万行,是的。CQL 和 Cassandra 模型不适用于 2 页长的带有嵌入案例、聚合等的 SELECT 语句。

于 2013-10-02T15:21:43.293 回答
5

CQLV3.0 的文档

CQL DESCRIBE获取keyspace, column family,的模式cluster

CQL 不支持我在 SQL 中知道的一些东西,比如joins group by triggers cursors procedure transactions stored procedures

CQL3.0 支持ORDER BY

CQL 支持所有 DML 和 DDL 功能

CQL 支持BATCH

BATCH is not an analogue for SQL ACID transactions.

只是上面提到的 DOC 是最好的参考 :)

于 2012-06-22T11:10:15.543 回答
5

出于所有意图和目的,CQLSQL,因此从最严格的意义上讲,Cassandra一个 SQL 数据库。但是,大多数人将 SQL 与其通常应用的关系数据库紧密联系在一起。在这种(错误)解释下,Cassandra 不应被视为“SQL 数据库”,因为它不是关系型的,并且不支持ACID属性。

于 2012-06-22T15:05:40.857 回答