2020-10-26 10:29:30 +00:00
---
toc_priority: 40
toc_title: Join
---
2020-03-20 18:20:59 +00:00
# Join {#join}
2017-03-12 17:58:51 +00:00
2020-04-30 18:19:18 +00:00
Подготовленная структура данных для использования в операциях [JOIN ](../../../engines/table-engines/special/join.md#select-join ).
2017-06-13 20:35:07 +00:00
2020-01-20 09:48:34 +00:00
## Создание таблицы {#creating-a-table}
2019-07-31 14:49:16 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-07-31 14:49:16 +00:00
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
) ENGINE = Join(join_strictness, join_type, k1[, k2, ...])
```
2020-04-30 18:19:18 +00:00
Смотрите подробное описание запроса [CREATE TABLE ](../../../engines/table-engines/special/join.md#create-table-query ).
2019-07-31 14:49:16 +00:00
**Параметры движка**
2020-07-16 08:56:45 +00:00
- `join_strictness` – [строгость JOIN ](../../../engines/table-engines/special/join.md#select-join-types ).
2020-04-30 18:19:18 +00:00
- `join_type` – [тип JOIN ](../../../engines/table-engines/special/join.md#select-join-types ).
2020-03-21 04:11:51 +00:00
- `k1[, k2, ...]` – ключевые столбцы секции `USING` с которыми выполняется операция `JOIN` .
2019-07-31 14:49:16 +00:00
Вводите параметры `join_strictness` и `join_type` без кавычек, например, `Join(ANY, LEFT, col1)` . Они должны быть такими же как и в той операции `JOIN` , в которой таблица будет использоваться. Если параметры не совпадают, ClickHouse не генерирует исключение и может возвращать неверные данные.
2021-08-01 05:31:25 +00:00
## Особенности и рекомендации {#specifics-and-recommendations}
2019-07-31 14:49:16 +00:00
2021-08-01 05:31:25 +00:00
### Хранение данных {#data-storage}
Данные таблиц `Join` всегда находятся в оперативной памяти. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера.
При аварийном перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае может потребоваться вручную удалить файл с повреждёнными данными.
### Выборка и добавление данных {#selecting-and-inserting-data}
Для добавления данных в таблицы с движком `Join` используйте запрос `INSERT` . Если таблица создавалась с о строгостью `ANY` , то данные с повторяющимися ключами игнорируются. Если задавалась строгость `ALL` , то добавляются все строки.
2021-08-09 07:52:04 +00:00
Основные применения `Join` таблиц:
2021-08-01 05:31:25 +00:00
2021-08-09 07:52:26 +00:00
- Использование в правой части секции `JOIN` .
- Извлечение данных из таблицы таким же образом как из словаря с помощью функции [joinGet ](../../../engines/table-engines/special/join.md#joinget ).
2021-08-01 05:31:25 +00:00
### Удаление данных {#deleting-data}
2021-08-01 05:41:12 +00:00
Запросы `ALTER DELETE` для таблиц с движком `Join` выполняются как [мутации ](../../../sql-reference/statements/alter/index.md#mutations ). При выполнении мутации `DELETE` считываются отфильтрованные данные и перезаписываются в оперативную память и на диск.
2021-08-01 05:31:25 +00:00
### Ограничения и настройки {#join-limitations-and-settings}
При создании таблицы применяются следующие настройки:
- [join_use_nulls ](../../../operations/settings/settings.md#join_use_nulls )
- [max_rows_in_join ](../../../operations/settings/query-complexity.md#settings-max_rows_in_join )
- [max_bytes_in_join ](../../../operations/settings/query-complexity.md#settings-max_bytes_in_join )
- [join_overflow_mode ](../../../operations/settings/query-complexity.md#settings-join_overflow_mode )
- [join_any_take_last_row ](../../../operations/settings/settings.md#settings-join_any_take_last_row )
- [persistent ](../../../operations/settings/settings.md#persistent )
Таблицы с движком `Join` нельзя использовать в операциях `GLOBAL JOIN` .
2021-08-09 07:52:04 +00:00
Движок `Join` позволяет использовать настройку [join_use_nulls ](../../../operations/settings/settings.md#join_use_nulls ) в запросе `CREATE TABLE` . Необходимо использовать одно и то же значение параметра `join_use_nulls` в запросах `CRATE TABLE` и `SELECT` .
2021-08-01 05:31:25 +00:00
## Примеры использования {#example}
2019-07-31 14:49:16 +00:00
Создание левой таблицы:
2020-03-20 18:20:59 +00:00
``` sql
2021-08-01 05:31:25 +00:00
CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog;
2019-07-31 14:49:16 +00:00
```
2020-03-20 18:20:59 +00:00
``` sql
2021-08-01 05:31:25 +00:00
INSERT INTO id_val VALUES (1,11)(2,12)(3,13);
2019-07-31 14:49:16 +00:00
```
Создание правой таблицы с движком `Join` :
2020-03-20 18:20:59 +00:00
``` sql
2021-08-01 05:31:25 +00:00
CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id);
2019-07-31 14:49:16 +00:00
```
2020-03-20 18:20:59 +00:00
``` sql
2021-08-01 05:31:25 +00:00
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23);
2018-10-16 10:47:17 +00:00
```
2019-07-31 14:49:16 +00:00
Объединение таблиц:
2020-03-20 18:20:59 +00:00
``` sql
2021-08-01 05:31:25 +00:00
SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id);
2019-07-31 14:49:16 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-31 14:49:16 +00:00
┌─id─┬─val─┬─id_val_join.val─┐
│ 1 │ 11 │ 21 │
2021-08-01 05:31:25 +00:00
│ 2 │ 12 │ 0 │
2019-07-31 14:49:16 +00:00
│ 3 │ 13 │ 23 │
└────┴─────┴─────────────────┘
```
В качестве альтернативы, можно извлечь данные из таблицы `Join` , указав значение ключа объединения:
2020-03-20 18:20:59 +00:00
``` sql
2021-08-01 05:31:25 +00:00
SELECT joinGet('id_val_join', 'val', toUInt32(1));
2019-07-31 14:49:16 +00:00
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-31 14:49:16 +00:00
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
│ 21 │
└────────────────────────────────────────────┘
2017-10-25 05:27:09 +00:00
```
2017-05-08 05:06:04 +00:00
2021-08-01 05:31:25 +00:00
Удаление данных из таблицы `Join` :
2017-03-12 17:58:51 +00:00
2021-08-01 05:31:25 +00:00
```sql
ALTER TABLE id_val_join DELETE WHERE id = 3;
```
2018-10-16 10:47:17 +00:00
2021-08-01 05:31:25 +00:00
```text
┌─id─┬─val─┐
│ 1 │ 21 │
└────┴─────┘
```