×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

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

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

2.6.24. Выражения подзапросов

2.6.24.1. EXISTS
2.6.24.2. IN
2.6.24.3. NOT IN
2.6.24.4. ANY/SOME
2.6.24.5. ALL
2.6.24.6. Сравнение с одной строкой

В данном разделе описываются соответствующие стандарту SQL SQL-совместимые выражения подзапросов, доступные в Digital Q.DataBase. Все формы выражений, описанные в данном разделе, возвращают логический результат (true/false).

2.6.24.1. EXISTS #

EXISTS (подзапроса)

Аргументом оператора EXISTS является произвольный SELECT оператор или подзапроса. Подзапрос вычисляется для проверки наличия в нем строк. Если подзапрос возвращает хотя бы одну строку, результатом оператора EXISTS будет «true»; если подзапрос не возвращает ни одной строки, результатом оператора EXISTS будет «false».

Подзапрос может ссылаться на переменные из внешнего запроса, которые рассматриваются как константы при каждом отдельном вычислении подзапроса.

Обычно выполнение подзапроса продолжается только до тех пор, пока не будет установлено наличие хотя бы одной строки, а не до его полного завершения. Не рекомендуется использовать подзапросы, вызывающие побочные эффекты (например, при вызове функций для работы с последовательностями); возникновение побочных эффектов может носить непредсказуемый характер.

Поскольку результат зависит только от факта возврата строк, а не от их содержимого, состав выходного списка подзапроса обычно не имеет значения. Согласно общепринятым правилам написания кода, все EXISTS проверки записываются в форме EXISTS(SELECT 1 WHERE ...). Однако из этого правила существуют исключения, например подзапросы, в которых используется оператор INTERSECT.

Этот простой пример аналогичен внутреннему соединению по столбцу col2, однако он возвращает не более одной выходной строки для каждого tab1 строку, даже если существует несколько совпадающих строк tab2 строки:

SELECT col1
FROM tab1
WHERE EXISTS (SELECT 1 FROM tab2 WHERE col2 = tab1.col2);

2.6.24.2. IN #

выражение IN (подзапроса)

В правой части выражения указывается заключённый в скобки подзапрос, который должен возвращать ровно один столбец. Вычисляется выражение в левой части, после чего оно сравнивается с каждой строкой результата подзапроса. Результат IN является «true» если найдена любая идентичная строка подзапроса. Результатом является «false» если идентичных строк не обнаружено (включая случай, когда подзапрос не возвращает ни одной строки).

Обратите внимание: если выражение в левой части возвращает значение null или если идентичных значений в правой части не найдено и при этом хотя бы одна строка в правой части возвращает null, результат IN конструкции будет null, а не false. Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

Как и в случае с оператором EXISTS, не следует полагать, что подзапрос будет вычислен полностью.

row_constructor IN (подзапроса)

Левая часть данной формы оператора IN представляет собой конструктор строки, описанный в разделе Раздел 2.1.2.13. Правая часть представляет собой подзапрос в скобках, который должен возвращать ровно столько же столбцов, сколько выражений содержится в строке в левой части. Выражения левой части вычисляются и сравниваются построчно с каждой строкой результата подзапроса. Результат IN является «true» если найдена любая идентичная строка подзапроса. Результатом является «false» если идентичных строк не обнаружено (включая случай, когда подзапрос не возвращает ни одной строки).

Как обычно, значения null в строках объединяются в соответствии со стандартными правилами построения логических выражений языка SQL. Две строки считаются равными, если все их соответствующие элементы не являются значениями null и равны между собой; строки считаются невыровненными, если любые соответствующие элементы не являются значениями null и не равны между собой; в противном случае результат сравнения этих строк является неопределенным (null). Если все результаты сравнения строк являются либо ложными, либо неопределенными (null), и при этом имеется хотя бы одно значение null, то результат IN является значением null.

2.6.24.3. NOT IN #

выражение NOT IN (подзапроса)

В правой части выражения указывается заключённый в скобки подзапрос, который должен возвращать ровно один столбец. Вычисляется выражение в левой части, после чего оно сравнивается с каждой строкой результата подзапроса. Результат NOT IN является «true» если найдены только несовпадающие строки подзапроса (включая случай, когда подзапрос не возвращает ни одной строки). Результат равен «false» если найдена любая совпадающая строка.

Обратите внимание: если выражение в левой части возвращает значение null или если идентичных значений в правой части не найдено и при этом хотя бы одна строка в правой части возвращает null, результат NOT IN конструкция будет иметь значение null, а не true. Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

Как и в случае с оператором EXISTS, не следует полагать, что подзапрос будет вычислен полностью.

row_constructor NOT IN (подзапроса)

Левая часть данной формы оператора NOT IN представляет собой конструктор строки, описанный в разделе Раздел 2.1.2.13. Правая часть представляет собой подзапрос в скобках, который должен возвращать ровно столько же столбцов, сколько выражений содержится в строке в левой части. Выражения левой части вычисляются и сравниваются построчно с каждой строкой результата подзапроса. Результат NOT IN является «true» если найдены только несовпадающие строки подзапроса (включая случай, когда подзапрос не возвращает ни одной строки). Результат равен «false» если найдена любая совпадающая строка.

Как обычно, значения null в строках объединяются в соответствии со стандартными правилами построения логических выражений языка SQL. Две строки считаются равными, если все их соответствующие элементы не являются значениями null и равны между собой; строки считаются невыровненными, если любые соответствующие элементы не являются значениями null и не равны между собой; в противном случае результат сравнения этих строк является неопределенным (null). Если все результаты сравнения строк являются либо ложными, либо неопределенными (null), и при этом имеется хотя бы одно значение null, то результат NOT IN является значением null.

2.6.24.4. ANY/SOME #

выражение оператор ANY (подзапроса)
выражение оператор SOME (подзапроса)

В правой части выражения указывается заключённый в скобки подзапрос, который должен возвращать ровно один столбец. Вычисляется выражение в левой части, которое затем сравнивается с каждой строкой результата подзапроса с использованием указанного оператор, который должен возвращать логический результат. Результат ANY является «true» в случае получения хотя бы одного истинного результата. Результат равен «false» если истинных результатов не найдено (включая случай, когда подзапрос не возвращает ни одной строки).

SOME является синонимом ANY. IN эквивалентно = ANY.

Обратите внимание: если совпадений не найдено и хотя бы одна строка в правой части возвращает null в качестве результата оператора, то результат ANY конструкции будет иметь значение null, а не false. Это соответствует стандартным правилам языка SQL для логических комбинаций значений null.

Как и в случае с оператором EXISTS, не следует полагать, что подзапрос будет вычислен полностью.

row_constructor оператор ANY (подзапроса)
row_constructor оператор SOME (подзапроса)

Левая часть данной формы оператора ANY представляет собой конструктор строки, описанный в разделе Раздел 2.1.2.13. Правая часть представляет собой заключенный в скобки подзапрос, который должен возвращать ровно столько столбцов, сколько содержится выражений в строке слева. Выражения левой части вычисляются и сравниваются построчно с каждой строкой результата подзапроса с использованием данного оператор. Результат ANY является «true» если сравнение возвращает значение true для любой строки подзапроса. Результат равен «false» если результат сравнения является ложным (false) для каждой строки подзапроса (включая случай, когда подзапрос не возвращает ни одной строки). Результат принимает значение NULL, если ни одно сравнение со строкой подзапроса не возвращает значение true и при этом хотя бы одно сравнение возвращает NULL.

См. Раздел 2.6.25.5 подробные сведения о значении операции сравнения конструкторов строк.

2.6.24.5. ALL #

выражение оператор ALL (подзапроса)

В правой части выражения указывается заключённый в скобки подзапрос, который должен возвращать ровно один столбец. Вычисляется выражение в левой части, которое затем сравнивается с каждой строкой результата подзапроса с использованием указанного оператор, который должен возвращать логический результат. Результат ALL является «true» если для всех строк возвращается значение true (включая случай, когда подзапрос не возвращает ни одной строки). Результат имеет значение «false» если обнаружен хотя бы один ложный результат (false). Результат принимает значение NULL, если ни одно сравнение со строкой подзапроса не возвращает false и при этом хотя бы одно сравнение возвращает значение NULL.

NOT IN эквивалентно <> ALL.

Как и в случае с оператором EXISTS, не следует полагать, что подзапрос будет вычислен полностью.

row_constructor оператор ALL (подзапроса)

Левая часть данной формы оператора ALL представляет собой конструктор строки, описанный в разделе Раздел 2.1.2.13. Правая часть представляет собой заключенный в скобки подзапрос, который должен возвращать ровно столько столбцов, сколько содержится выражений в строке слева. Выражения левой части вычисляются и сравниваются построчно с каждой строкой результата подзапроса с использованием данного оператор. Результат ALL является «true» если операция сравнения возвращает значение true для всех строк подзапроса (включая случай, когда подзапрос не возвращает ни одной строки). Результатом является «false» если операция сравнения возвращает значение false для любой строки подзапроса. Результат принимает значение NULL, если ни одно сравнение со строкой подзапроса не возвращает false и при этом как минимум одно сравнение возвращает NULL.

См. Раздел 2.6.25.5 подробные сведения о значении операции сравнения конструкторов строк.

2.6.24.6. Сравнение с одной строкой #

row_constructor оператор (подзапроса)

В левой части выражения находится конструктор строки, как описано в Раздел 2.1.2.13. В правой части находится заключённый в скобки подзапрос, который должен возвращать ровно столько же столбцов, сколько выражений присутствует в строке в левой части. Более того, подзапрос не может возвращать более одной строки. (Если подзапрос возвращает ноль строк, результатом считается значение NULL.) Левая часть выражения вычисляется и сравнивается построчно с единственной строкой результата подзапроса.

См. Раздел 2.6.25.5 подробные сведения о значении операции сравнения конструкторов строк.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению