diff --git a/docs/en/sql-reference/operators/exists.md b/docs/en/sql-reference/operators/exists.md new file mode 100644 index 00000000000..ee0c7317637 --- /dev/null +++ b/docs/en/sql-reference/operators/exists.md @@ -0,0 +1,44 @@ +# EXISTS {#exists-operator} + +The `EXISTS` operator checks how many records are in the result of a subquery. If it is empty, then the operator returns `0`. Otherwise, it returns `1`. + +`EXISTS` can be used in a [WHERE](../../sql-reference/statements/select/where.md) clause. + +!!! warning "Warning" + References to main query tables and columns are not supported in a subquery. + +**Syntax** + +```sql +WHERE EXISTS(subquery) +``` + +**Example** + +Query with a subquery returning several rows: + +``` sql +SELECT count() FROM numbers(10) WHERE EXISTS(SELECT number FROM numbers(10) WHERE number > 8); +``` + +Result: + +``` text +┌─count()─┐ +│ 10 │ +└─────────┘ +``` + +Query with a subquery that returns an empty result: + +``` sql +SELECT count() FROM numbers(10) WHERE EXISTS(SELECT number FROM numbers(10) WHERE number > 11); +``` + +Result: + +``` text +┌─count()─┐ +│ 0 │ +└─────────┘ +``` diff --git a/docs/en/sql-reference/operators/index.md b/docs/en/sql-reference/operators/index.md index efbc600fdd4..1c59b25fc63 100644 --- a/docs/en/sql-reference/operators/index.md +++ b/docs/en/sql-reference/operators/index.md @@ -71,7 +71,7 @@ For tuple subtraction: [tupleMinus](../../sql-reference/functions/tuple-function ## Operators for Working with Data Sets {#operators-for-working-with-data-sets} -*See [IN operators](../../sql-reference/operators/in.md).* +See [IN operators](../../sql-reference/operators/in.md) and [EXISTS](../../sql-reference/operators/exists.md) operator. `a IN ...` – The `in(a, b)` function. diff --git a/docs/en/sql-reference/statements/select/where.md b/docs/en/sql-reference/statements/select/where.md index 69505a51db4..348b869e2db 100644 --- a/docs/en/sql-reference/statements/select/where.md +++ b/docs/en/sql-reference/statements/select/where.md @@ -6,9 +6,51 @@ toc_title: WHERE `WHERE` clause allows to filter the data that is coming from [FROM](../../../sql-reference/statements/select/from.md) clause of `SELECT`. -If there is a `WHERE` clause, it must contain an expression with the `UInt8` type. This is usually an expression with comparison and logical operators. Rows where this expression evaluates to 0 are excluded from further transformations or result. +If there is a `WHERE` clause, it must contain an expression with the `UInt8` type. This is usually an expression with comparison and logical operators. Rows where this expression evaluates to `0` are excluded from further transformations or result. `WHERE` expression is evaluated on the ability to use indexes and partition pruning, if the underlying table engine supports that. !!! note "Note" - There’s a filtering optimization called [prewhere](../../../sql-reference/statements/select/prewhere.md). + There is a filtering optimization called [PREWHERE](../../../sql-reference/statements/select/prewhere.md). + +If you need to test a value for [NULL](../../../sql-reference/syntax.md#null-literal), use [IS NULL](../../operators/index.md#operator-is-null) and [IS NOT NULL](../../operators/index.md#is-not-null) operators or [isNull](../../../sql-reference/functions/functions-for-nulls.md#isnull) and [isNotNull](../../../sql-reference/functions/functions-for-nulls.md#isnotnull) functions. +Otherwise an expression with `NULL` never passes. + +**Example** + +To find numbers that are multiples of 3 and are greater than 10 execute the following query on the [numbers table](../../../sql-reference/table-functions/numbers.md): + +``` sql +SELECT number FROM numbers(20) WHERE (number > 10) AND (number % 3 == 0); +``` + +Result: + +``` text +┌─number─┐ +│ 12 │ +│ 15 │ +│ 18 │ +└────────┘ +``` + +Queries with `NULL` values: + +``` sql +CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x; +INSERT INTO t_null VALUES (1, NULL), (2, 3); + +SELECT * FROM t_null WHERE y IS NULL; +SELECT * FROM t_null WHERE y != 0; +``` + +Result: + +``` text +┌─x─┬────y─┐ +│ 1 │ ᴺᵁᴸᴸ │ +└───┴──────┘ +┌─x─┬─y─┐ +│ 2 │ 3 │ +└───┴───┘ +``` diff --git a/docs/ru/sql-reference/operators/exists.md b/docs/ru/sql-reference/operators/exists.md new file mode 100644 index 00000000000..3e04304e222 --- /dev/null +++ b/docs/ru/sql-reference/operators/exists.md @@ -0,0 +1,44 @@ +# EXISTS {#exists-operator} + +Оператор `EXISTS` проверяет, сколько строк содержит результат выполнения подзапроса. Если результат пустой, то оператор возвращает `0`. В остальных случаях оператор возвращает `1`. + +`EXISTS` может быть использован в секции [WHERE](../../sql-reference/statements/select/where.md). + +!!! warning "Предупреждение" + Ссылки на таблицы или столбцы основного запроса не поддерживаются в подзапросе. + +**Синтаксис** + +```sql +WHERE EXISTS(subquery) +``` + +**Пример** + +Запрос с подзапросом, возвращающим несколько строк: + +``` sql +SELECT count() FROM numbers(10) WHERE EXISTS(SELECT number FROM numbers(10) WHERE number > 8); +``` + +Результат: + +``` text +┌─count()─┐ +│ 10 │ +└─────────┘ +``` + +Запрос с подзапросом, возвращающим пустой результат: + +``` sql +SELECT count() FROM numbers(10) WHERE EXISTS(SELECT number FROM numbers(10) WHERE number > 11); +``` + +Результат: + +``` text +┌─count()─┐ +│ 0 │ +└─────────┘ +``` diff --git a/docs/ru/sql-reference/operators/index.md b/docs/ru/sql-reference/operators/index.md index 0041be745fc..3a2d3d69119 100644 --- a/docs/ru/sql-reference/operators/index.md +++ b/docs/ru/sql-reference/operators/index.md @@ -72,7 +72,7 @@ toc_title: "Операторы" ## Операторы для работы с множествами {#operatory-dlia-raboty-s-mnozhestvami} -*Смотрите раздел [Операторы IN](../../sql-reference/operators/in.md#select-in-operators).* +Смотрите [операторы IN](../../sql-reference/operators/in.md#select-in-operators) и оператор [EXISTS](../../sql-reference/operators/exists.md). `a IN ...` - функция `in(a, b)` diff --git a/docs/ru/sql-reference/statements/select/where.md b/docs/ru/sql-reference/statements/select/where.md index 8cb8e634303..e176780c43e 100644 --- a/docs/ru/sql-reference/statements/select/where.md +++ b/docs/ru/sql-reference/statements/select/where.md @@ -4,26 +4,52 @@ toc_title: WHERE # Секция WHERE {#select-where} -Позволяет задать выражение, которое ClickHouse использует для фильтрации данных перед всеми другими действиями в запросе кроме выражений, содержащихся в секции [PREWHERE](prewhere.md#prewhere-clause). Обычно, это выражение с логическими операторами. +Позволяет задать выражение, которое ClickHouse использует для фильтрации данных перед всеми другими действиями в запросе кроме выражений, содержащихся в секции [PREWHERE](prewhere.md#prewhere-clause). Обычно это выражение с логическими операторами. Результат выражения должен иметь тип `UInt8`. ClickHouse использует в выражении индексы, если это позволяет [движок таблицы](../../../engines/table-engines/index.md). -Если в секции необходимо проверить [NULL](../../../sql-reference/syntax.md#null-literal), то используйте операторы [IS NULL](../../operators/index.md#operator-is-null) и [IS NOT NULL](../../operators/index.md#is-not-null), а также соответствующие функции `isNull` и `isNotNull`. В противном случае выражение будет считаться всегда не выполненным. +!!! note "Примечание" + Существует оптимизация фильтрации под названием [PREWHERE](prewhere.md). + +Если в секции необходимо проверить [NULL](../../../sql-reference/syntax.md#null-literal), то используйте операторы [IS NULL](../../operators/index.md#operator-is-null) и [IS NOT NULL](../../operators/index.md#is-not-null), а также соответствующие функции [isNull](../../../sql-reference/functions/functions-for-nulls.md#isnull) и [isNotNull](../../../sql-reference/functions/functions-for-nulls.md#isnotnull). В противном случае выражение будет считаться всегда не выполненным. + +**Пример** + +Чтобы найти числа, которые кратны 3 и больше 10, можно выполнить запрос к [таблице numbers](../../../sql-reference/table-functions/numbers.md): + +``` sql +SELECT number FROM numbers(20) WHERE (number > 10) AND (number % 3 == 0); +``` + +Результат: + +``` text +┌─number─┐ +│ 12 │ +│ 15 │ +│ 18 │ +└────────┘ +``` Пример проверки на `NULL`: ``` sql -SELECT * FROM t_null WHERE y IS NULL +CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x; +INSERT INTO t_null VALUES (1, NULL), (2, 3); + +SELECT * FROM t_null WHERE y IS NULL; +SELECT * FROM t_null WHERE y != 0; ``` +Результат: + ``` text ┌─x─┬────y─┐ │ 1 │ ᴺᵁᴸᴸ │ └───┴──────┘ +┌─x─┬─y─┐ +│ 2 │ 3 │ +└───┴───┘ ``` - -!!! note "Примечание" - Существует оптимизация фильтрации под названием [prewhere](prewhere.md). -