Пример работы с таблицами в clickhouse-client
- Обзор
- Шаг 1. Создание базы данных
- Шаг 2. Создание таблицы
- Шаг 3. Получение информации о таблице
- Шаг 4. Добавление данных в таблицу
- Шаг 5. Чтение данных из таблицы
- Шаг 6. Обновление данных в таблице
- Шаг 7. Удаление данных из таблицы
- Шаг 8. Изменение структуры таблицы
- Шаг 9. Отключение и подключение таблицы
- Шаг 10. Удаление таблицы
Обзор
Наиболее простой способ работы с таблицами 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;
ПРИМЕЧАНИЕ
|
Шаг 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;
Результат команды в формате VerticalRow 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 │ └────────────────┴──────────────────────────────────────────────────────┴
ПРИМЕЧАНИЕ
С помощью запроса |
Шаг 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 │ └────────────┘