EXISTSINNOT INANY/SOMEALLВ данном разделе описываются соответствующие стандарту SQL SQL-совместимые выражения подзапросов, доступные в Digital Q.DataBase. Все формы выражений, описанные в данном разделе, возвращают логический результат (true/false).
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);
IN #выражениеIN (подзапроса)
В правой части выражения указывается заключённый в скобки подзапрос, который должен возвращать ровно один столбец. Вычисляется выражение в левой части,
после чего оно сравнивается с каждой строкой результата подзапроса.
Результат IN является «true» если найдена любая идентичная строка подзапроса.
Результатом является «false» если идентичных строк не обнаружено (включая случай, когда подзапрос не возвращает ни одной строки).
Обратите внимание: если выражение в левой части возвращает значение null или если идентичных значений в правой части не найдено и при этом хотя бы одна строка в правой части возвращает null, результат IN конструкции будет null, а не false.
Это соответствует стандартным правилам языка SQL для логических комбинаций
значений null.
Как и в случае с оператором EXISTS, не следует полагать, что подзапрос будет вычислен полностью.
row_constructorIN (подзапроса)
Левая часть данной формы оператора IN представляет собой конструктор строки,
описанный в разделе Раздел 2.1.2.13. Правая часть представляет собой подзапрос в скобках, который должен возвращать ровно столько же столбцов, сколько выражений содержится в строке в левой части. Выражения левой части вычисляются и сравниваются построчно с каждой строкой результата подзапроса. Результат IN является «true» если найдена любая идентичная строка подзапроса.
Результатом является «false» если идентичных строк не обнаружено (включая случай, когда подзапрос не возвращает ни одной строки).
Как обычно, значения null в строках объединяются в соответствии со стандартными правилами построения логических выражений языка SQL. Две строки считаются равными, если все их соответствующие элементы не являются значениями null и равны между собой; строки
считаются невыровненными, если любые соответствующие элементы не являются значениями null и не равны между собой;
в противном случае результат сравнения этих строк является неопределенным (null).
Если все результаты сравнения строк являются либо ложными, либо неопределенными (null), и при этом имеется хотя бы одно
значение null, то результат IN является значением null.
NOT IN #выражениеNOT IN (подзапроса)
В правой части выражения указывается заключённый в скобки подзапрос, который должен возвращать ровно один столбец. Вычисляется выражение в левой части,
после чего оно сравнивается с каждой строкой результата подзапроса.
Результат NOT IN является «true» если найдены только несовпадающие строки подзапроса
(включая случай, когда подзапрос не возвращает ни одной строки).
Результат равен «false» если найдена любая совпадающая строка.
Обратите внимание: если выражение в левой части возвращает значение null или если идентичных значений в правой части не найдено и при этом хотя бы одна строка в правой части возвращает null, результат NOT IN конструкция будет иметь значение null, а не true.
Это соответствует стандартным правилам языка SQL для логических комбинаций
значений null.
Как и в случае с оператором EXISTS, не следует полагать, что подзапрос будет вычислен полностью.
row_constructorNOT IN (подзапроса)
Левая часть данной формы оператора NOT IN представляет собой конструктор строки,
описанный в разделе Раздел 2.1.2.13. Правая часть представляет собой подзапрос в скобках, который должен возвращать ровно столько же столбцов, сколько выражений содержится в строке в левой части. Выражения левой части вычисляются и сравниваются построчно с каждой строкой результата подзапроса. Результат NOT IN является «true» если найдены только несовпадающие строки подзапроса
(включая случай, когда подзапрос не возвращает ни одной строки).
Результат равен «false» если найдена любая совпадающая строка.
Как обычно, значения null в строках объединяются в соответствии со стандартными правилами построения логических выражений языка SQL. Две строки считаются равными, если все их соответствующие элементы не являются значениями null и равны между собой; строки
считаются невыровненными, если любые соответствующие элементы не являются значениями null и не равны между собой;
в противном случае результат сравнения этих строк является неопределенным (null).
Если все результаты сравнения строк являются либо ложными, либо неопределенными (null), и при этом имеется хотя бы одно
значение null, то результат NOT IN является значением null.
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 подробные сведения о значении операции сравнения конструкторов строк.
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 подробные сведения о значении операции сравнения конструкторов строк.
row_constructorоператор(подзапроса)
В левой части выражения находится конструктор строки, как описано в Раздел 2.1.2.13. В правой части находится заключённый в скобки подзапрос, который должен возвращать ровно столько же столбцов, сколько выражений присутствует в строке в левой части. Более того, подзапрос не может возвращать более одной строки. (Если подзапрос возвращает ноль строк, результатом считается значение NULL.) Левая часть выражения вычисляется и сравнивается построчно с единственной строкой результата подзапроса.
См. Раздел 2.6.25.5 подробные сведения о значении операции сравнения конструкторов строк.