2017-12-28 15:13:23 +00:00
# Join
2017-04-03 19:49:50 +00:00
2019-06-21 07:58:15 +00:00
Prepared data structure for using in [JOIN ](../../query_language/select.md#select-join ) operations.
## Creating a Table
2017-06-13 20:35:07 +00:00
2019-09-23 15:31:46 +00:00
```sql
2019-06-21 07:58:15 +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, ...])
```
2019-07-31 14:49:16 +00:00
See the detailed description of the [CREATE TABLE ](../../query_language/create.md#create-table-query ) query.
2019-06-21 07:58:15 +00:00
**Engine Parameters**
- `join_strictness` – [JOIN strictness ](../../query_language/select.md#select-join-strictness ).
- `join_type` – [JOIN type ](../../query_language/select.md#select-join-types ).
- `k1[, k2, ...]` – Key columns from the `USING` clause that the `JOIN` operation is made with.
2019-07-31 14:49:16 +00:00
Enter `join_strictness` and `join_type` parameters without quotes, for example, `Join(ANY, LEFT, col1)` . They must match the `JOIN` operation that the table will be used for. If the parameters don't match, ClickHouse doesn't throw an exception and may return incorrect data.
2019-06-21 07:58:15 +00:00
## Table Usage
### Example
Creating the left-side table:
```sql
2019-07-31 14:49:16 +00:00
CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog
```
```sql
INSERT INTO id_val VALUES (1,11)(2,12)(3,13)
2017-12-28 15:13:23 +00:00
```
2017-06-13 04:15:47 +00:00
2019-06-21 07:58:15 +00:00
Creating the right-side `Join` table:
2017-04-03 19:49:50 +00:00
2019-06-21 07:58:15 +00:00
```sql
2019-07-31 14:49:16 +00:00
CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id)
```
```sql
2019-06-21 07:58:15 +00:00
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23)
```
2017-04-03 19:49:50 +00:00
2019-06-21 07:58:15 +00:00
Joining the tables:
2019-05-27 19:34:04 +00:00
2019-06-21 07:58:15 +00:00
```sql
SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id) SETTINGS join_use_nulls = 1
```
```text
┌─id─┬─val─┬─id_val_join.val─┐
│ 1 │ 11 │ 21 │
│ 2 │ 12 │ ᴺᵁᴸᴸ │
│ 3 │ 13 │ 23 │
└────┴─────┴─────────────────┘
```
2017-04-03 19:49:50 +00:00
2019-07-31 14:49:16 +00:00
As an alternative, you can retrieve data from the `Join` table, specifying the join key value:
2017-12-28 15:13:23 +00:00
2019-06-21 07:58:15 +00:00
```sql
SELECT joinGet('id_val_join', 'val', toUInt32(1))
2019-05-27 19:34:04 +00:00
```
2019-06-21 07:58:15 +00:00
```text
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
│ 21 │
└────────────────────────────────────────────┘
2019-05-27 19:34:04 +00:00
```
2019-06-21 07:58:15 +00:00
### Selecting and Inserting Data
2019-07-31 14:49:16 +00:00
You can use `INSERT` queries to add data to the `Join` -engine tables. If the table was created with the `ANY` strictness, data for duplicate keys are ignored. With the `ALL` strictness, all rows are added.
2019-06-21 07:58:15 +00:00
2019-07-31 14:49:16 +00:00
You cannot perform a `SELECT` query directly from the table. Instead, use one of the following methods:
2019-06-21 07:58:15 +00:00
2019-07-31 14:49:16 +00:00
- Place the table to the right side in a `JOIN` clause.
- Call the [joinGet ](../../query_language/functions/other_functions.md#other_functions-joinget ) function, which lets you extract data from the table the same way as from a dictionary.
2019-06-21 07:58:15 +00:00
### Limitations and Settings
When creating a table, the following settings are applied:
2019-06-18 09:57:42 +00:00
- [join_use_nulls ](../settings/settings.md#settings-join_use_nulls )
2019-06-21 07:58:15 +00:00
- [max_rows_in_join ](../settings/query_complexity.md#settings-max_rows_in_join )
- [max_bytes_in_join ](../settings/query_complexity.md#settings-max_bytes_in_join )
- [join_overflow_mode ](../settings/query_complexity.md#settings-join_overflow_mode )
2019-06-18 09:57:42 +00:00
- [join_any_take_last_row ](../settings/settings.md#settings-join_any_take_last_row )
2019-05-27 19:34:04 +00:00
2019-07-31 14:49:16 +00:00
The `Join` -engine tables can't be used in `GLOBAL JOIN` operations.
2019-06-21 07:58:15 +00:00
## Data Storage
2019-07-31 14:49:16 +00:00
`Join` table data is always located in the RAM. When inserting rows into a table, ClickHouse writes data blocks to the directory on the disk so that they can be restored when the server restarts.
2019-06-21 07:58:15 +00:00
2019-07-31 14:49:16 +00:00
If the server restarts incorrectly, the data block on the disk might get lost or damaged. In this case, you may need to manually delete the file with damaged data.
2018-10-16 10:47:17 +00:00
[Original article ](https://clickhouse.yandex/docs/en/operations/table_engines/join/ ) <!--hide-->