Пример работы с таблицами в clickhouse-client

Обзор

Наиболее простой способ работы с таблицами ADQM/ClickHouse — использовать консольный клиент clickhouse-client, который доступен на каждом хосте кластера сразу после установки ADQM. Этот клиент позволяет вводить запросы, передавать их в ClickHouse и отображать возвращаемые результаты. Параметры в clickhouse-client можно передавать из командной строки или через конфигурационные файлы.

Чтобы начать работу с clickhouse-client, выполните команду:

$ clickhouse-client -m

Эта команда устанавливает соединение с локальным сервером ClickHouse (localhost:9000) от имени пользователя default без пароля и подключается к базе данных по умолчанию. Терминал переключается в интерактивный режим работы с сервером ClickHouse и отображает приглашение :), после которого можно вводить запросы. Параметр -m (или --multiline) включает многострочный режим ввода запроса — чтобы выполнить запрос, необходимо завершить его точкой с запятой и нажать Enter.

$ clickhouse-client -m
ClickHouse client version 24.3.11.7.
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 24.3.11.

:)

Чтобы выйти из clickhouse-client, можно нажать Ctrl+D или ввести вместо запроса exit, quit, q или logout.

Основные операции по работе с данными в ADQM/ClickHouse описаны ниже (примеры основаны на простой базе данных, хранящей информацию о продажах). Полный список доступных команд можно найти в разделе ClickHouse SQL Statements документации ClickHouse. Перед тем как начать выполнять приведенные в данной статье команды, рекомендуется также ознакомиться с разделом Концепции → Модель данных текущей документации ADQM.

Шаг 1. Создание базы данных

База данных, к которой подключается clickhouse-client по умолчанию, указывается с помощью параметра Default database на странице конфигурации сервиса ADQMDB в интерфейсе ADCM (ADQM cluster → Services → ADQMDB → Primary Configuration → Other → Default database). Значение параметра по умолчанию — база данных default, которая создается автоматически при установке ADQM.

Чтобы создать новую базу данных, используйте запрос CREATE DATABASE.

Следующий запрос создает на всех хостах кластера default_cluster базу данных test_db на основе движка Atomic:

CREATE DATABASE test_db ON CLUSTER default_cluster;

Изменить текущую базу данных сессии можно с помощью команды USE, например:

USE test_db;
ПРИМЕЧАНИЕ
  • Чтобы при подключении к clickhouse-client сразу выбрать текущую базу данных, отличную от установленной в Default database, используйте параметр -d или --database (например, clickhouse-client -d test_db).

  • Если в запросе требуется обратиться к таблице, которая находится не в текущей базе данных сессии, нужную базу данных необходимо указать явно через точку перед именем таблицы.

Шаг 2. Создание таблицы

Для создания новой таблицы используйте запрос CREATE TABLE с указанием имени таблицы и табличного движка, описанием всех столбцов таблицы (путем определения их имен, типов данных, модификаторов, кодеков сжатия данных), определением индексов, ограничений (constraints) и прочих настроек. Обзор синтаксиса с описанием параметров и выражений запроса CREATE TABLE можно посмотреть в разделе Создание таблиц MergeTree статьи об основных операциях с таблицами ADQM.

Следующий запрос создает таблицу sales со столбцами различных типов для хранения данных о продажах:

CREATE TABLE sales (
    id UInt32,
    product_name String,
    category String,
    sale_date Date DEFAULT toDate(now()),
    units_sold UInt32,
    price_per_unit Float32,
    region Enum('North America' = 1, 'Europe' = 2, 'Asia' = 3)
)
ENGINE = MergeTree()
ORDER BY id;

Шаг 3. Получение информации о таблице

Чтобы проверить существование таблицы и получить информацию о ней, можно использовать следующие команды:

  • EXISTS <table_name> — проверяет, существует ли таблица в базе данных (возвращает столбец с одним значением — 0, если таблицы не существует, или 1, если таблица существует).

    EXISTS sales;

    Таблица sales существует в текущей базе данных test_db:

       ┌─result─┐
    1. │      1 │
       └────────┘
  • DESCRIBE TABLE <table_name> — возвращает информацию о каждом столбце таблицы (название, тип данных, выражение для значения по умолчанию, комментарий, кодек сжатия данных и выражение TTL).

    DESCRIBE TABLE sales;
       ┌─name───────────┬─type─────────────────────────────────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
    1. │ id             │ UInt32                                               │              │                    │         │                  │                │
    2. │ product_name   │ String                                               │              │                    │         │                  │                │
    3. │ category       │ String                                               │              │                    │         │                  │                │
    4. │ sale_date      │ Date                                                 │ DEFAULT      │ toDate(now())      │         │                  │                │
    5. │ units_sold     │ UInt32                                               │              │                    │         │                  │                │
    6. │ price_per_unit │ Float32                                              │              │                    │         │                  │                │
    7. │ region         │ Enum8('North America' = 1, 'Europe' = 2, 'Asia' = 3) │              │                    │         │                  │                │
       └────────────────┴──────────────────────────────────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

    Если вывод результата команды не умещается в окне консоли по ширине, можно использовать формат Vertical для выходных данных — в этом случае каждое значение выводится в отдельной строке. Для этого укажите \G вместо или после точки с запятой или FORMAT Vertical в конце запроса:

    DESCRIBE TABLE sales;\G
    DESCRIBE TABLE sales FORMAT Vertical;
    Результат команды в формате Vertical
    Row 1:
    ──────
    name:               id
    type:               UInt32
    default_type:
    default_expression:
    comment:
    codec_expression:
    ttl_expression:
    
    Row 2:
    ──────
    name:               product_name
    type:               String
    default_type:
    default_expression:
    comment:
    codec_expression:
    ttl_expression:
    
    Row 3:
    ──────
    name:               category
    type:               String
    default_type:
    default_expression:
    comment:
    codec_expression:
    ttl_expression:
    
    Row 4:
    ──────
    name:               sale_date
    type:               Date
    default_type:       DEFAULT
    default_expression: toDate(now())
    comment:
    codec_expression:
    ttl_expression:
    
    Row 5:
    ──────
    name:               units_sold
    type:               UInt32
    default_type:
    default_expression:
    comment:
    codec_expression:
    ttl_expression:
    
    Row 6:
    ──────
    name:               price_per_unit
    type:               Float32
    default_type:
    default_expression:
    comment:
    codec_expression:
    ttl_expression:
    
    Row 7:
    ──────
    name:               region
    type:               Enum8('North America' = 1, 'Europe' = 2, 'Asia' = 3)
    default_type:
    default_expression:
    comment:
    codec_expression:
    ttl_expression:

    Полный список форматов, доступных в ADQM/ClickHouse для входных и выходных данных, можно посмотреть в статье Formats for Input and Output Data документации ClickHouse.

  • SELECT * FROM system.tables WHERE name = '<table_name>' — возвращает метаданные таблицы с указанным именем из системной таблицы system.tables.

    SELECT * FROM system.tables WHERE name = 'sales';\G
    Результат команды
    Row 1:
    ──────
    database:                      test_db
    name:                          sales
    uuid:                          4a8690b9-e048-4b55-acea-27586cd2380f
    engine:                        MergeTree
    is_temporary:                  0
    data_paths:                    ['/var/lib/clickhouse/store/4a8/4a8690b9-e048-4b55-acea-27586cd2380f/']
    metadata_path:                 /var/lib/clickhouse/store/a8e/a8e6a2c0-ea2c-4c0b-8669-de931f53178d/sales.sql
    metadata_modification_time:    2025-01-16 15:17:05
    metadata_version:              0
    dependencies_database:         []
    dependencies_table:            []
    create_table_query:            CREATE TABLE test_db.sales (`id` UInt32, `product_name` String, `category` String, `sale_date` Date DEFAULT toDate(now()), `units_sold` UInt32, `price_per_unit` Float32, `region` Enum8('North America' = 1, 'Europe' = 2, 'Asia' = 3)) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity = 8192
    engine_full:                   MergeTree ORDER BY id SETTINGS index_granularity = 8192
    as_select:
    partition_key:
    sorting_key:                   id
    primary_key:                   id
    sampling_key:
    storage_policy:                default
    total_rows:                    0
    total_bytes:                   0
    total_bytes_uncompressed:      0
    parts:                         0
    active_parts:                  0
    total_marks:                   0
    lifetime_rows:                 ᴺᵁᴸᴸ
    lifetime_bytes:                ᴺᵁᴸᴸ
    comment:
    has_own_data:                  1
    loading_dependencies_database: []
    loading_dependencies_table:    []
    loading_dependent_database:    []
    loading_dependent_table:       []
  • SHOW CREATE TABLE <table_name> — возвращает один столбец с текстом запроса CREATE TABLE, с помощью которого была создана указанная таблица.

    SHOW CREATE TABLE sales;\G
    Row 1:
    ──────
    statement: CREATE TABLE test_db.sales
    (
        `id` UInt32,
        `product_name` String,
        `category` String,
        `sale_date` Date DEFAULT toDate(now()),
        `units_sold` UInt32,
        `price_per_unit` Float32,
        `region` Enum8('North America' = 1, 'Europe' = 2, 'Asia' = 3)
    )
    ENGINE = MergeTree
    ORDER BY id
    SETTINGS index_granularity = 8192
  • SHOW TABLES — выводит список таблиц, существующих в базе данных.

    SHOW TABLES;

    В текущей базе данных test_db находится только одна таблица sales:

       ┌─name──┐
    1. │ sales │
       └───────┘

Шаг 4. Добавление данных в таблицу

Чтобы добавить новые данные в таблицу, используйте запрос INSERT INTO:

INSERT INTO <table_name> [(<c1>, <c2>, <c3>)] VALUES (v11, v12, v13), (v21, v22, v23), ...;

Опционально сразу после названия таблицы можно указать список столбцов для вставки данных — перечислить имена столбцов через запятую или использовать выражение с символом * и модификаторами, такими как APPLY, EXCEPT, REPLACE. После ключевого слова VALUES через запятую перечисляются значения столбцов в том же порядке, что и их названия в списке (<c1>, <c2>, <c3>). Если список столбцов, в которые будут вставляться данные, не определен явно, необходимо указать значения соответствующих типов для всех столбцов таблицы — приведенные значения появятся в столбцах согласно порядку их объявления при создании таблицы.

Если указанный список столбцов не включает все существующие в таблице столбцы, то все остальные столбцы заполняются:

  • значениями, вычисляемыми из выражений DEFAULT, указанных для столбцов в определении таблицы;

  • нулями и пустыми строками, если выражения DEFAULT для столбцов не определены.

Следующие пять отдельных запросов добавляют по одной строке в таблицу sales:

INSERT INTO sales VALUES (1, 'Laptop', 'Electronics', '2025-01-03', 5, 999.99, 1);
INSERT INTO sales VALUES (2, 'Smartphone', 'Electronics', '2025-01-04', 10, 699.99, 2);
INSERT INTO sales VALUES (3, 'Headphones', 'Electronics', '2025-01-04', 25, 49.99, 3);
INSERT INTO sales VALUES (4, 'Desk Chair', 'Furniture', '2025-01-05', 3, 149.99, 1);
INSERT INTO sales VALUES (5, 'Coffee Table', 'Furniture', '2025-01-05', 2, 249.99, 2);

Для добавления более одной строки в рамках одного запроса INSERT INTO необходимо перечислить все кортежи данных через запятую после ключевого слова VALUES:

INSERT INTO sales VALUES
(6, 'Notebook', 'Stationery', '2025-01-06', 100, 1.99, 3),
(7, 'Pen', 'Stationery', '2025-01-06', 200, 0.49, 1),
(8, 'Water Bottle', 'Accessories', '2025-01-07', 15, 9.99, 2),
(9, 'Backpack', 'Accessories', '2025-01-07', 8, 59.99, 3),
(10, 'Monitor', 'Electronics', '2025-01-08', 6, 199.99, 1),
(11, 'Keyboard', 'Electronics', '2025-01-08', 12, 49.99, 2);

В следующем запросе добавляются данные во все столбцы, кроме sale_date, поэтому передается столько значений, сколько указано столбцов, а столбец sale_date будет заполнен значениями по умолчанию (текущей датой):

INSERT INTO sales (* EXCEPT(sale_date)) VALUES (12, 'Office Chair', 'Furniture',  4, 199.99, 3);

Для вставки значений по умолчанию также можно использовать ключевое слово DEFAULT:

INSERT INTO sales VALUES (13, 'Printer', 'Electronics', DEFAULT, 2, 299.99, 1);

В запрос INSERT INTO можно также передавать данные любого формата, который поддерживает ClickHouse (см. столбец Input в таблице Formats for Input and Output Data). Для этого формат необходимо явно указать в запросе с помощью ключевого слова FORMAT, например:

INSERT INTO sales FORMAT JSONEachRow
{"id":14,"product_name":"Cap","category":"Accessories","sale_date":"2025-01-09","units_sold":30,"price_per_unit":5.99,"region":2}
{"id":15,"product_name":"Binder","category":"Stationery","sale_date":"2025-01-09","units_sold":50,"price_per_unit":2.99,"region":3};
ПРИМЕЧАНИЕ

Данные в таблицу ADQM/ClickHouse также могут быть импортированы из файлов различных форматов — см. Импорт данных из файлов.

Шаг 5. Чтение данных из таблицы

Для чтения данных из таблицы используйте запрос SELECT. Основные особенности построения запроса:

  • Сразу после выражения SELECT необходимо указать список столбцов для извлечения данных (перечислить имена столбцов или указать символ *, чтобы получить данные из всех столбцов) и/или выражений, которые нужно вычислить по набору строк (например, с помощью агрегатных или оконных функций). При формировании списка столбцов/выражений можно использовать модификаторы APPLY, EXCEPT, REPLACE и их комбинации.

  • После ключевого слова FROM указывается имя таблицы, из которой нужно получить данные. Чтобы считать данные из двух таблиц и объединить их в один результирующий набор, используйте оператор JOIN.

    Источником для чтения данных также может быть подзапрос или табличная функция.

  • Условия фильтрации строк для чтения описываются в блоке WHERE.

  • Для дополнительной обработки считываемых данных (сортировки, группировки) можно применять выражения ORDER BY, GROUP BY, HAVING и другие.

Примеры различных SELECT-запросов приведены ниже.

Чтение всех данных

Следующий запрос считывает все данные из таблицы sales:

SELECT * FROM sales;

В этом примере используется символ * вместо названий столбцов и не определено условие WHERE, поэтому в выборку попадают все столбцы и строки таблицы:

    ┌─id─┬─product_name─┬─category────┬──sale_date─┬─units_sold─┬─price_per_unit─┬─region────────┐
 1. │  1 │ Laptop       │ Electronics │ 2025-01-03 │          5 │         999.99 │ North America │
 2. │  2 │ Smartphone   │ Electronics │ 2025-01-04 │         10 │         699.99 │ Europe        │
 3. │  3 │ Headphones   │ Electronics │ 2025-01-04 │         25 │          49.99 │ Asia          │
 4. │  4 │ Desk Chair   │ Furniture   │ 2025-01-05 │          3 │         149.99 │ North America │
 5. │  5 │ Coffee Table │ Furniture   │ 2025-01-05 │          2 │         249.99 │ Europe        │
 6. │  6 │ Notebook     │ Stationery  │ 2025-01-06 │        100 │           1.99 │ Asia          │
 7. │  7 │ Pen          │ Stationery  │ 2025-01-06 │        200 │           0.49 │ North America │
 8. │  8 │ Water Bottle │ Accessories │ 2025-01-07 │         15 │           9.99 │ Europe        │
 9. │  9 │ Backpack     │ Accessories │ 2025-01-07 │          8 │          59.99 │ Asia          │
10. │ 10 │ Monitor      │ Electronics │ 2025-01-08 │          6 │         199.99 │ North America │
11. │ 11 │ Keyboard     │ Electronics │ 2025-01-08 │         12 │          49.99 │ Europe        │
12. │ 12 │ Office Chair │ Furniture   │ 2025-01-16 │          4 │         199.99 │ Asia          │
13. │ 13 │ Printer      │ Electronics │ 2025-01-16 │          2 │         299.99 │ North America │
14. │ 14 │ Cap          │ Accessories │ 2025-01-09 │         30 │           5.99 │ Europe        │
15. │ 15 │ Binder       │ Stationery  │ 2025-01-09 │         50 │           2.99 │ Asia          │
    └────┴──────────────┴─────────────┴────────────┴────────────┴────────────────┴───────────────┘

Фильтрация данных

Следующий запрос возвращает данные только о продажах за 7 января 2025 года:

SELECT
    product_name,
    sale_date,
    units_sold
FROM sales
WHERE sale_date = '2025-01-07';
   ┌─product_name─┬──sale_date─┬─units_sold─┐
1. │ Water Bottle │ 2025-01-07 │         15 │
2. │ Backpack     │ 2025-01-07 │          8 │
   └──────────────┴────────────┴────────────┘

Сортировка результатов

Следующий запрос возвращает из таблицы sales 10 самых крупных продаж в порядке убывания:

SELECT
    sale_date,
    product_name,
    units_sold,
    price_per_unit,
    round(units_sold * price_per_unit, 2) AS revenue
FROM sales
ORDER BY revenue DESC
LIMIT 10;
    ┌──sale_date─┬─product_name─┬─units_sold─┬─price_per_unit─┬─revenue─┐
 1. │ 2025-01-04 │ Smartphone   │         10 │         699.99 │  6999.9 │
 2. │ 2025-01-03 │ Laptop       │          5 │         999.99 │ 4999.95 │
 3. │ 2025-01-04 │ Headphones   │         25 │          49.99 │ 1249.75 │
 4. │ 2025-01-08 │ Monitor      │          6 │         199.99 │ 1199.94 │
 5. │ 2025-01-16 │ Office Chair │          4 │         199.99 │  799.96 │
 6. │ 2025-01-16 │ Printer      │          2 │         299.99 │  599.98 │
 7. │ 2025-01-08 │ Keyboard     │         12 │          49.99 │  599.88 │
 8. │ 2025-01-05 │ Coffee Table │          2 │         249.99 │  499.98 │
 9. │ 2025-01-07 │ Backpack     │          8 │          59.99 │  479.92 │
10. │ 2025-01-05 │ Desk Chair   │          3 │         149.99 │  449.97 │
    └────────────┴──────────────┴────────────┴────────────────┴─────────┘

Группировка результатов

Следующий запрос группирует записи о продажах в таблице sales по категории товаров и находит товар с максимальной ценой за единицу в каждой категории:

SELECT
    category,
    argMax(product_name, price_per_unit) AS most_expensive_product,
    max(price_per_unit) AS highest_price
FROM sales
GROUP BY category
ORDER BY highest_price DESC;
   ┌─category────┬─most_expensive_product─┬─highest_price─┐
1. │ Electronics │ Laptop                 │        999.99 │
2. │ Furniture   │ Coffee Table           │        249.99 │
3. │ Accessories │ Backpack               │         59.99 │
4. │ Stationery  │ Binder                 │          2.99 │
   └─────────────┴────────────────────────┴───────────────┘

Следующий запрос возвращает ежедневную выручку в каждом регионе:

SELECT
    sale_date,
    region,
    round(SUM(units_sold * price_per_unit), 2) AS daily_revenue
FROM sales
GROUP BY sale_date, region
ORDER BY sale_date, region;
    ┌──sale_date─┬─region────────┬─daily_revenue─┐
 1. │ 2025-01-03 │ North America │       4999.95 │
 2. │ 2025-01-04 │ Europe        │        6999.9 │
 3. │ 2025-01-04 │ Asia          │       1249.75 │
 4. │ 2025-01-05 │ North America │        449.97 │
 5. │ 2025-01-05 │ Europe        │        499.98 │
 6. │ 2025-01-06 │ North America │            98 │
 7. │ 2025-01-06 │ Asia          │           199 │
 8. │ 2025-01-07 │ Europe        │        149.85 │
 9. │ 2025-01-07 │ Asia          │        479.92 │
10. │ 2025-01-08 │ North America │       1199.94 │
11. │ 2025-01-08 │ Europe        │        599.88 │
12. │ 2025-01-09 │ Europe        │         179.7 │
13. │ 2025-01-09 │ Asia          │         149.5 │
14. │ 2025-01-14 │ North America │        599.98 │
15. │ 2025-01-14 │ Asia          │        799.96 │
    └────────────┴───────────────┴───────────────┘

Комбинация SELECT с CREATE и INSERT INTO

Команду SELECT можно использовать для копирования данных из одной таблицы в другую — в комбинации с командами CREATE и INSERT INTO.

Приведенный ниже запрос создает новую таблицу sales_copy с такой же структурой, как у таблицы sales, а также копирует строки, соответствующие продажам до 7 января 2025 года включительно, из исходной таблицы в новую, используя команду SELECT:

CREATE TABLE sales_copy
ENGINE = MergeTree
ORDER BY id
AS SELECT * FROM sales
WHERE sale_date <= '2025-01-07';

Следующий запрос копирует оставшиеся строки (продажи после 7 января 2025 года) из таблицы sales в sales_copy с помощью команды INSERT INTO:

INSERT INTO sales_copy SELECT * FROM sales WHERE sale_date > '2025-01-07';

Чтобы убедиться, что содержимое двух таблиц идентично, сделайте выборку из обеих таблиц:

SELECT * FROM sales;
    ┌─id─┬─product_name─┬─category────┬──sale_date─┬─units_sold─┬─price_per_unit─┬─region────────┐
 1. │  1 │ Laptop       │ Electronics │ 2025-01-03 │          5 │         999.99 │ North America │
 2. │  2 │ Smartphone   │ Electronics │ 2025-01-04 │         10 │         699.99 │ Europe        │
 3. │  3 │ Headphones   │ Electronics │ 2025-01-04 │         25 │          49.99 │ Asia          │
 4. │  4 │ Desk Chair   │ Furniture   │ 2025-01-05 │          3 │         149.99 │ North America │
 5. │  5 │ Coffee Table │ Furniture   │ 2025-01-05 │          2 │         249.99 │ Europe        │
 6. │  6 │ Notebook     │ Stationery  │ 2025-01-06 │        100 │           1.99 │ Asia          │
 7. │  7 │ Pen          │ Stationery  │ 2025-01-06 │        200 │           0.49 │ North America │
 8. │  8 │ Water Bottle │ Accessories │ 2025-01-07 │         15 │           9.99 │ Europe        │
 9. │  9 │ Backpack     │ Accessories │ 2025-01-07 │          8 │          59.99 │ Asia          │
10. │ 10 │ Monitor      │ Electronics │ 2025-01-08 │          6 │         199.99 │ North America │
11. │ 11 │ Keyboard     │ Electronics │ 2025-01-08 │         12 │          49.99 │ Europe        │
12. │ 12 │ Office Chair │ Furniture   │ 2025-01-16 │          4 │         199.99 │ Asia          │
13. │ 13 │ Printer      │ Electronics │ 2025-01-16 │          2 │         299.99 │ North America │
14. │ 14 │ Cap          │ Accessories │ 2025-01-09 │         30 │           5.99 │ Europe        │
15. │ 15 │ Binder       │ Stationery  │ 2025-01-09 │         50 │           2.99 │ Asia          │
    └────┴──────────────┴─────────────┴────────────┴────────────┴────────────────┴───────────────┘
SELECT * FROM sales_copy;
    ┌─id─┬─product_name─┬─category────┬──sale_date─┬─units_sold─┬─price_per_unit─┬─region────────┐
 1. │  1 │ Laptop       │ Electronics │ 2025-01-03 │          5 │         999.99 │ North America │
 2. │  2 │ Smartphone   │ Electronics │ 2025-01-04 │         10 │         699.99 │ Europe        │
 3. │  3 │ Headphones   │ Electronics │ 2025-01-04 │         25 │          49.99 │ Asia          │
 4. │  4 │ Desk Chair   │ Furniture   │ 2025-01-05 │          3 │         149.99 │ North America │
 5. │  5 │ Coffee Table │ Furniture   │ 2025-01-05 │          2 │         249.99 │ Europe        │
 6. │  6 │ Notebook     │ Stationery  │ 2025-01-06 │        100 │           1.99 │ Asia          │
 7. │  7 │ Pen          │ Stationery  │ 2025-01-06 │        200 │           0.49 │ North America │
 8. │  8 │ Water Bottle │ Accessories │ 2025-01-07 │         15 │           9.99 │ Europe        │
 9. │  9 │ Backpack     │ Accessories │ 2025-01-07 │          8 │          59.99 │ Asia          │
10. │ 10 │ Monitor      │ Electronics │ 2025-01-08 │          6 │         199.99 │ North America │
11. │ 11 │ Keyboard     │ Electronics │ 2025-01-08 │         12 │          49.99 │ Europe        │
12. │ 12 │ Office Chair │ Furniture   │ 2025-01-16 │          4 │         199.99 │ Asia          │
13. │ 13 │ Printer      │ Electronics │ 2025-01-16 │          2 │         299.99 │ North America │
14. │ 14 │ Cap          │ Accessories │ 2025-01-09 │         30 │           5.99 │ Europe        │
15. │ 15 │ Binder       │ Stationery  │ 2025-01-09 │         50 │           2.99 │ Asia          │
    └────┴──────────────┴─────────────┴────────────┴────────────┴────────────────┴───────────────┘

Шаг 6. Обновление данных в таблице

Обновить данные в таблице можно с помощью запроса ALTER TABLE…​UPDATE, где после ключевого слова UPDATE указывается список новых значений столбцов (или выражений для вычисления значений), а после WHERE — условие отбора строк, в которых нужно заменить значения:

ALTER TABLE <table_name> UPDATE <column_name> = <new_value>[, ...] WHERE <filter_expr>;

Например, следующий запрос увеличивает на 2 процента цену каждого товара категории Accessories в таблице sales_copy:

ALTER TABLE sales_copy
UPDATE price_per_unit = round(price_per_unit*1.02, 2)
WHERE category = 'Accessories';

Чтобы проверить результат выполнения запроса, можно вывести данные по товарам (название и цену) в категории Accessories, используя команду SELECT:

SELECT product_name, price_per_unit FROM sales_copy WHERE category='Accessories';
   ┌─product_name─┬─price_per_unit─┐
1. │ Water Bottle │          10.19 │
2. │ Backpack     │          61.19 │
3. │ Cap          │           6.11 │
   └──────────────┴────────────────┘

Шаг 7. Удаление данных из таблицы

Для удаления строк данных из таблицы по указанному условию можно использовать запрос ALTER TABLE…​DELETE (для любых таблиц) или DELETE FROM (для таблиц MergeTree) — подробнее в разделе Удаление данных.

Следующий запрос удаляет данные о продажах до 5 января 2025 года включительно из таблицы sales_copy:

ALTER TABLE sales_copy DELETE WHERE sale_date <= '2025-01-05';

Выполните запрос SELECT, чтобы убедиться, что в таблице остались только данные о продажах после 5 января 2025 года:

    ┌─id─┬─product_name─┬─category────┬──sale_date─┬─units_sold─┬─price_per_unit─┬─region────────┐
 1. │  6 │ Notebook     │ Stationery  │ 2025-01-06 │        100 │           1.99 │ Asia          │
 2. │  7 │ Pen          │ Stationery  │ 2025-01-06 │        200 │           0.49 │ North America │
 3. │  8 │ Water Bottle │ Accessories │ 2025-01-07 │         15 │          10.19 │ Europe        │
 4. │  9 │ Backpack     │ Accessories │ 2025-01-07 │          8 │          61.19 │ Asia          │
 5. │ 10 │ Monitor      │ Electronics │ 2025-01-08 │          6 │         199.99 │ North America │
 6. │ 11 │ Keyboard     │ Electronics │ 2025-01-08 │         12 │          49.99 │ Europe        │
 7. │ 12 │ Office Chair │ Furniture   │ 2025-01-16 │          4 │         199.99 │ Asia          │
 8. │ 13 │ Printer      │ Electronics │ 2025-01-16 │          2 │         299.99 │ North America │
 9. │ 14 │ Cap          │ Accessories │ 2025-01-09 │         30 │           6.11 │ Europe        │
10. │ 15 │ Binder       │ Stationery  │ 2025-01-09 │         50 │           2.99 │ Asia          │
    └────┴──────────────┴─────────────┴────────────┴────────────┴────────────────┴───────────────┘

Следующий запрос удаляет из таблицы sales_copy строку о продаже продукта Keyboard в регионе Europe:

DELETE FROM sales_copy WHERE product_name = 'Keyboard' AND region = 'Europe';

В результате выполнения запроса из таблицы успешно удалена соответствующая строка:

   ┌─id─┬─product_name─┬─category────┬──sale_date─┬─units_sold─┬─price_per_unit─┬─region────────┐
1. │  6 │ Notebook     │ Stationery  │ 2025-01-06 │        100 │           1.99 │ Asia          │
2. │  7 │ Pen          │ Stationery  │ 2025-01-06 │        200 │           0.49 │ North America │
3. │  8 │ Water Bottle │ Accessories │ 2025-01-07 │         15 │          10.19 │ Europe        │
4. │  9 │ Backpack     │ Accessories │ 2025-01-07 │          8 │          61.19 │ Asia          │
5. │ 10 │ Monitor      │ Electronics │ 2025-01-08 │          6 │         199.99 │ North America │
6. │ 12 │ Office Chair │ Furniture   │ 2025-01-16 │          4 │         199.99 │ Asia          │
7. │ 13 │ Printer      │ Electronics │ 2025-01-16 │          2 │         299.99 │ North America │
8. │ 14 │ Cap          │ Accessories │ 2025-01-09 │         30 │           6.11 │ Europe        │
9. │ 15 │ Binder       │ Stationery  │ 2025-01-09 │         50 │           2.99 │ Asia          │
   └────┴──────────────┴─────────────┴────────────┴────────────┴────────────────┴───────────────┘

Шаг 8. Изменение структуры таблицы

Для изменения структуры (столбцов) таблицы используйте запрос ALTER TABLE (поддерживается табличными движками MergeTree, а также Merge и Distributed):

ALTER TABLE <table_name> ADD|DROP|RENAME|CLEAR|COMMENT|{MODIFY|ALTER}|MATERIALIZE COLUMN <column_name> ...

В рамках одного запроса можно указать сразу несколько действий над столбцами таблицы через запятую.

Следующий запрос изменяет имя столбца product_name на product и добавляет новый столбец store_id:

ALTER TABLE sales_copy RENAME COLUMN product_name TO product, ADD COLUMN store_id UInt8;

Чтобы убедиться, что столбец переименован и новый столбец store_id добавлен, можно выполнить запрос DESCRIBE TABLE:

DESCRIBE TABLE sales_copy;
   ┌─name───────────┬─type─────────────────────────────────────────────────┬
1. │ id             │ UInt32                                               │
2. │ product        │ String                                               │
3. │ category       │ String                                               │
4. │ sale_date      │ Date                                                 │
5. │ units_sold     │ UInt32                                               │
6. │ price_per_unit │ Float32                                              │
7. │ region         │ Enum8('North America' = 1, 'Europe' = 2, 'Asia' = 3) │
8. │ store_id       │ UInt8                                                │
   └────────────────┴──────────────────────────────────────────────────────┴
ПРИМЕЧАНИЕ

С помощью запроса ALTER TABLE можно также выполнять различные манипуляции с партициями, кусками данных, ограничениями (constraints), индексами, проекциями таблиц, добавлять к таблицам комментарии, устанавливать правила TTL — см. подробное описание в соответствующих статьях секции ALTER документации ClickHouse.

Шаг 9. Отключение и подключение таблицы

С помощью запроса DETACH TABLE таблицу можно отключить, то есть сделать "невидимой" для сервера (при этом ее данные и метаданные не удаляются).

Следующий запрос отключает таблицу sales_copy:

DETACH TABLE sales_copy;

Убедитесь, что таблицы sales_copy нет в списке таблиц базы данных:

SHOW tables;
   ┌─name──┐
1. │ sales │
   └───────┘

При следующем запуске сервер прочитает метаданные таблицы и снова ее "увидит". Чтобы сервер при перезапуске не подключал таблицу автоматически, отключите ее перманентно — для этого используйте в конце запроса DETACH TABLE ключевое слово PERMANENTLY.

Чтобы подключить таблицу обратно (независимо от того, каким способом она была отключена — перманентно или нет), выполните запрос ATTACH TABLE:

ATTACH TABLE sales_copy;

Проверьте, что сервер ClickHouse снова "видит" таблицу sales_copy:

SHOW tables;
   ┌─name───────┐
1. │ sales      │
2. │ sales_copy │
   └────────────┘

Шаг 10. Удаление таблицы

Чтобы удалить таблицу, используйте запрос DROP TABLE:

DROP TABLE sales_copy;

Таблица успешно удалена из базы данных:

SHOW tables;
   ┌─name──┐
1. │ sales │
   └───────┘
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней