发布日期:2022-12-02 VIP内容

对ClickHouse的CRUD操作

在上一节中,创建了ClickHouse数据库test和表visit。这一节,我们将向visits表中插入数据,并执行CRUD操作。

插入、更新和删除数据和列

在这一步中,我们将使用visits表插入、更新和删除数据。下面的命令是向ClickHouse表中插入行的语法示例:

INSERT INTO table_name VALUES (column_1_value, column_2_value, ....);

现在,通过运行以下语句将几行示例网站访问数据插入到visits表中:

INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');

将看到每个插入语句的重复输出如下:

NSERT INTO visits VALUES

Ok.

1 rows in set. Elapsed: 0.004 sec.

每一行的输出显示已经成功地将其插入到visits表中。

现在将向visits表添加一个额外的列。在从现有表中添加或删除列时,ClickHouse支持ALTER语法。

例如,向表中添加列的基本语法如下:

ALTER TABLE table_name ADD COLUMN column_name column_type;

添加一个名为location的列,它将存储访问网站的位置,运行以下语句:

ALTER TABLE visits ADD COLUMN location String;

将看到类似如下的输出:

ALTER TABLE visits
    ADD COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.014 sec.

输出显示已经成功添加了location列。

从19.4.3版本开始,由于实现限制,ClickHouse不支持更新和删除单个数据行。然而,ClickHouse支持批量更新和删除,并为这些操作提供了独特的SQL语法,以突出它们的非标准用法。

下面的语法是批量更新行的一个例子:

ALTER TABLE table_name UPDATE  column_1 = value_1, column_2 = value_2 ...  WHERE  filter_conditions;

将运行以下语句来更新duration小于15的所有行的url列。在数据库提示符中输入以下语句来执行:

ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;

批量更新语句的输出如下所示:

ALTER TABLE visits
    UPDATE url = 'http://example2.com' WHERE duration < 15


Ok.

0 rows in set. Elapsed: 0.003 sec.

输出显示更新查询成功完成。输出中的0 rows in set表示查询不返回任何行;这将是任何更新和删除查询的情况。

批量删除行的示例语法类似于更新行,结构如下:

ALTER TABLE table_name DELETE WHERE filter_conditions;

要测试删除数据,运行以下语句删除duration小于5的所有行:

ALTER TABLE visits DELETE WHERE duration < 5;

批量删除语句的输出类似于:

ALTER TABLE visits
    DELETE WHERE duration < 5


Ok.

0 rows in set. Elapsed: 0.003 sec.

输出确认已经删除了持续时间小于5秒的行。

要从表中删除列,语法将遵循下面的示例结构:

ALTER TABLE table_name DROP COLUMN column_name;

运行以下命令删除之前添加的location列:

ALTER TABLE visits DROP COLUMN location;

确认已删除列的DROP COLUMN输出如下所示:

ALTER TABLE visits
    DROP COLUMN
    location String


Ok.

0 rows in set. Elapsed: 0.010 sec.

现在已经成功地插入、更新和删除了visits表中的行和列,下一步将继续查询数据。

查询数据

ClickHouse的查询语言是一种定制的SQL方言,具有适合分析工作负载的扩展和函数。在这一步中,将运行选择和聚合查询,从访问表中检索数据和结果。

选择查询允许检索按指定条件过滤的数据行和列,以及诸如要返回的行数等选项。可以使用select语法选择数据的行和列。SELECT查询的基本语法是:

SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;

执行以下语句为url为“http://example.com”的行检索url和duration值:

SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;

将看到以下输出:

SELECT
    url,
    duration
FROM visits
WHERE url = 'http://example2.com'
LIMIT 2

┌─url─────────────────┬─duration─┐
│ http://example2.com │     10.5 │
└─────────────────────┴──────────┘
┌─url─────────────────┬─duration─┐
│ http://example2.com │       13 │
└─────────────────────┴──────────┘

2 rows in set. Elapsed: 0.013 sec.

输出返回了与指定的条件匹配的两行。既然已经选择了值,就可以继续执行聚合查询了。

聚合查询是对一组值进行操作并返回单个输出值的查询。在分析数据库中,这些查询经常运行,数据库对它们进行了很好的优化。ClickHouse支持的聚合函数有:

  • count:返回符合指定条件的行数。
  • sum:返回所选列值的和。
  • avg:返回所选列值的平均值。

一些特定于ClickHouse的聚合函数包括:

  • uniq:返回匹配的不同行(distinct rows)的大致数目。
  • topK:使用近似算法返回特定列中最频繁值的数组。

为了演示聚合查询的执行,将通过运行sum查询来计算总访问时长:

SELECT SUM(duration) FROM visits;

将看到类似如下的输出:

SELECT SUM(duration)
FROM visits

┌─SUM(duration)─┐
│          63.7 │
└───────────────┘

1 rows in set. Elapsed: 0.010 sec.

现在,通过执行以下命令来计算最上面的两个url:

SELECT topK(2)(url) FROM visits;

将看到类似如下的输出:

SELECT topK(2)(url)
FROM visits

┌─topK(2)(url)──────────────────────────────────┐
│ ['http://example2.com','http://example1.com'] │
└───────────────────────────────────────────────┘

1 rows in set. Elapsed: 0.010 sec.