Exists sql что это
Предикат EXISTS
Обычно предикат EXISTS используется в зависимых (коррелирующих) подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен оцениваться отдельно для каждой строки запроса, в котором содержится данный подзапрос. Поэтому предикат EXISTS может иметь разные значения для разных строк основного запроса.
Пример на пересечение.
Найти тех производителей портативных компьютеров, которые также производят принтеры:
В подзапросе выбираются производители принтеров и сравниваются с производителем, значение которого передается из основного запроса. В основном же запросе отбираются производители портативных компьютеров. Таким образом, для каждого производителя портативных компьютеров проверяется, возвращает ли подзапрос строки (которые говорят о том, что этот производитель также выпускает принтеры). Поскольку два условия в предложении WHERE должны выполняться одновременно ( AND ), то в результирующий набор попадут нужные нам строки. DISTINCT используется для того, чтобы каждый производитель присутствовал в выходных данных только один раз. В результате получим
Пример на разность.
Найти производителей портативных компьютеров, которые не производят принтеров:
Логический оператор EXISTS в T-SQL. Описание и примеры
Привет, сегодня мы рассмотрим несколько примеров использования логического оператора EXISTS в языке T-SQL, Вы узнаете, что это за оператор, как он работает и где его можно использовать.
Оператор EXISTS в языке T-SQL
EXISTS – это логический оператор языка T-SQL, который принимает и обрабатывает вложенный SQL запрос (SELECT) с целью проверки существования строк. В качестве результата возвращает значения (Boolean):
Оператор EXISTS Вы можете использовать как в секции WHERE запроса SELECT, так и в условных конструкциях языка T-SQL, например, в IF.
Таким образом, если у Вас возникла необходимость проверить, возвращает ли SQL запрос хотя бы одну строку, а результат этой проверки использовать в другом запросе или SQL инструкции, Вы можете использовать оператор EXISTS, по опыту могу сказать, что в некоторых случаях это очень удобно.
Примечание! Инструкция SELECT во вложенном запросе не может содержать ключевое слово INTO.
Оператор EXISTS в языке T-SQL также поддерживает ключевое слово NOT (NOT EXISTS), в данном случае будет противоположная работа, т.е. будет TRUE, если вложенный запрос не возвращает никаких строк, и FALSE, если возвращает.
Заметка! Новичкам рекомендую посмотреть мой видеокурс по T-SQL для начинающих, в нем подробно рассмотрены все базовые конструкции языка T-SQL.
Пример использования EXISTS в секции WHERE
В первом примере давайте посмотрим, как можно использовать логический оператор EXISTS в запросе SELECT в секции WHERE.
В следующем SQL запросе мы запрашиваем данные из таблицы TestTable, но при условии, что в таблице TestTable2 есть записи.
Мы видим, что данные нам вывелись, следовательно, в таблице TestTable2 записи есть.
Пример использования EXISTS в условной конструкции IF
Оператор EXISTS можно использовать и в условной конструкции IF, например, следующим образом.
В этом примере мы сначала проверяем, есть ли записи в таблице TestTable, и если есть, то выполняем необходимое действие, я для примера просто посылаю запрос SELECT.
Пример использования NOT EXISTS
В данном случае давайте представим, что нам нужно сделать что-то, только в том случае, если в таблице TestTable отсутствуют определённые записи. Если Вы обратили внимание, в таблице TestTable нет записей с ProductId больше 3, поэтому давайте для примера будем использовать именно это условие, т.е. если таких записей не существует, выполним нужное нам действие.
Предикат EXISTS SQL и проверка существования набора значений
Назначение предиката SQL EXISTS
Предикат языка SQL EXISTS выполняет логическую задачу. В запросах SQL этот предикат используется в выражениях вида
Это выражение возвращает истину, когда по запросу найдена одна или более строк, соответствующих условию, и ложь, когда не найдено ни одной строки.
Обычно предикат EXISTS применяется в случаях, когда необходимо найти значения, соответствующие основному условию, заданному в секции WHERE, и дополнительному условию, заключённому в подзапрос, являющийся аргументом предиката.
Для NOT EXISTS всё наоборот. Выражение
возвращает истину, когда по запросу не найдено ни одной строки, и ложь, когда найдена хотя бы одна строка.
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке .
Наиболее простые запросы с предикатом SQL EXISTS
В примерах работаем с базой данных библиотеки и ее таблицами «Книга в пользовании» (BOOKINUSE) и «Пользователь» (USER). Пока нам потребуется лишь таблица «Книга в пользовании» (BOOKINUSE).
| Author | Title | Pubyear | Inv_No | Customer_ID |
| Толстой | Война и мир | 2005 | 28 | 65 |
| Чехов | Вишневый сад | 2000 | 17 | 31 |
| Чехов | Избранные рассказы | 2011 | 19 | 120 |
| Чехов | Вишневый сад | 1991 | 5 | 65 |
| Ильф и Петров | Двенадцать стульев | 1985 | 3 | 31 |
| Маяковский | Поэмы | 1983 | 2 | 120 |
| Пастернак | Доктор Живаго | 2006 | 69 | 120 |
| Толстой | Воскресенье | 2006 | 77 | 47 |
| Толстой | Анна Каренина | 1989 | 7 | 205 |
| Пушкин | Капитанская дочка | 2004 | 25 | 47 |
| Гоголь | Пьесы | 2007 | 81 | 47 |
| Чехов | Избранные рассказы | 1987 | 4 | 205 |
| Пушкин | Сочинения, т.1 | 1984 | 6 | 47 |
| Пастернак | Избранное | 2000 | 137 | 18 |
| Пушкин | Сочинения, т.2 | 1984 | 8 | 205 |
| NULL | Наука и жизнь 9 2018 | 2019 | 127 | 18 |
| Чехов | Ранние рассказы | 2001 | 171 | 31 |
Этот запрос вернёт следующий результат:
| Customer_ID |
| 65 |
| 205 |
Пример 2. Определить ID пользователей, которым выданы книги Чехова, и которым при этом не выданы книги Ильфа и Петрова. Конструкция запроса аналогична конструкции из предыдущего примера с той разницей, что дополнительное условие задаётся предикатом NOT EXISTS. Запрос будет следующим:
Этот запрос вернёт следующий результат:
| User_ID |
| 120 |
| 65 |
| 205 |
Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение
Пример 3. Определить автора (авторов), книги которого выданы пользователю с ID 120, а также с ID 18.
Различия предикатов EXISTS и IN
При первом взгляде на запросы с предикатом EXISTS может возникнуть впечатление, что он идентичен предикату IN. Это не так. Хотя они очень похожи. Предикат IN ведет поиск значений из диапазона, заданного в его аргументе, и если такие значения есть, то выбираются все строки, соответствующие этому диапазону. Результат же действия предиката EXISTS представляет собой ответ «да» или «нет» на вопрос о том, есть ли вообще какие-либо значения, соответствующие указанным в аргументе. Кроме того, перед предикатом IN указывается имя столбца, по которому следует искать строки, соответствующие значениям в диапазоне. Разберём пример, показывающий отличие предиката EXISTS от предиката IN, и задачу, решаемую с помощью предиката IN.
Пример 4. Определить ID пользователей, которым выданы книги авторов, книги которых выданы пользователю с ID 31. Запрос будет следующим:
Результатом выполнения запроса будет следующая таблица:
| User_ID |
| 120 |
| 65 |
| 205 |
Запросы с предикатом EXISTS и дополнительными условиями
Если дополнительно к предикату EXISTS в запросе применить хотя бы одно дополнительное условие, например, заданное с помощью агрегатных функций, то такие запросы могут служить уже для простого анализа данных. Продемонстрируем это на следующем примере.
Пример 5. Определить ID пользователей, которым выдана хотя бы одна книга Пастернака, и которым при этом выдано более 2 книг. Пишем следующий запрос, в котором первое условие задаётся предикатом EXISTS со вложенным запросом, а второе условие с оператором HAVING всегда должно следовать после вложенного запроса:
Результат выполнения запроса:
Как видно из таблицы BOOKINUSE, книга Пастернака выдана также пользователю с ID 18, но ему выдана всего одна книга и он не попадает в выборку. Если применить к подобному запросу ещё раз функцию COUNT, но уже для подсчёта выбранных строк (потренируйтесь в этом самостоятельно), то можно получить сведения о том, сколько пользователей, читающих книги Пастернака, при этом читают также книги других авторов. Это уже из сферы анализа данных.
Запросы с предикатом EXISTS к двум таблицам
Запросы с предикатом EXISTS могут извлекать данные из более чем одной таблицы. Многие задачи можно с тем же результатом решить с помощью оператора JOIN, но в ряде случаев использование EXISTS позволяет составить менее громоздкий запрос. Использовать EXISTS предпочительнее в тех случаях, когда в результирующую таблицу попадут столбцы лишь из одной таблицы.
В следующем примере из той же базы данных помимо таблицы BOOKINUSE потребуется также таблица «Пользователь» (CUSTOMER).
| Customer_ID | Surname |
| 18 | Зотов |
| 31 | Перов |
| 47 | Васин |
| 65 | Тихонов |
| 120 | Краснов |
| 205 | Климов |
Пример 6. Определить авторов, книги которых выданы пользователю по фамилии Краснов. Пишем следующий запрос, в котором предикатом EXISTS задано единственное условие:
Результатом выполнения запроса будет следующая таблица:
| Author |
| Чехов |
| Маяковский |
| Пастернак |
Примеры запросов к базе данных «Библиотека» есть также в уроках по операторам GROUP BY, IN и функциям CONCAT, COALESCE.
Предикат EXISTS в соединениях более двух таблиц
Сейчас мы увидим более предметно, почему использовать EXISTS предпочительнее в тех случаях, когда в результирующую таблицу попадут столбцы лишь из одной таблицы.
Пример 7. Определить клиентов, купивших или взявших в аренду объекты, у которых нет лоджии или балкона. Пишем следующий запрос, в котором предикатом EXISTS задано обращение к результату соединения двух таблиц:
Так как из таблицы Client столбцы выбираются при помощи оператора «звёздочка», то будут выведены все столбцы этой таблицы, в которой будет столько строк, сколько насчитывается клиентов, соответствующих условию, заданному предикатом EXISTS. Из таблиц, к соединению которых обращается вложенный запрос, нам не требуется выводить ни одного столбца. Поэтому для экономии машинного времени извлекается лишь один столбец. Для этого после слова SELECT прописана единица. Этот же приём применён и в запросах в следующих примерах.
Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение
Пример 3. Определить менеджеров, которые провели сделки с объектами с числом комнат больше 2.
Продолжаем писать вместе запросы SQL с предикатом EXISTS
Пример 9. Определить собственников объектов, которые были взяты в аренду. Пишем следующий запрос, в котором предикатом EXISTS также задано обращение к результату соединения двух таблиц:
Как и в предыдущем примере, из таблицы, к которой обращён внешний запрос, будут выведены все поля.
Пример 10. Определить число собственников, с объектами которых провёл менеджер Савельев. Пишем запрос, в котором внешний запрос обращается к соединению трёх таблиц, а предикатом EXISTS задано обращение лишь к одной таблице:
Все запросы проверены на существующей базе данных. Успешного использования!
Примеры запросов к базе данных «Недвижимость» есть также в уроках по операторам GROUP BY и IN.
EXISTS (Transact-SQL)
Specifies a subquery to test for the existence of rows.

Syntax
To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.
Arguments
subquery
Is a restricted SELECT statement. The INTO keyword is not allowed. For more information, see the information about subqueries in SELECT (Transact-SQL).
Result Types
Boolean
Result Values
Returns TRUE if a subquery contains any rows.
Examples
A. Using NULL in a subquery to still return a result set
B. Comparing queries by using EXISTS and IN
Here is the result set for either query.
C. Comparing queries by using EXISTS and = ANY
D. Comparing queries by using EXISTS and IN
E. Using NOT EXISTS
Here is the result set.
Examples: Azure Synapse Analytics and Analytics Platform System (PDW)
F. Using EXISTS
The following example identifies whether any rows in the ProspectiveBuyer table could be matches to rows in the DimCustomer table. The query will return rows only when both the LastName and BirthDate values in the two tables match.
G. Using NOT EXISTS
NOT EXISTS works as the opposite as EXISTS. The WHERE clause in NOT EXISTS is satisfied if no rows are returned by the subquery. The following example finds rows in the DimCustomer table where the LastName and BirthDate do not match any entries in the ProspectiveBuyers table.
SQL-операторы: руководство с примерами запросов. Часть 2
Перевод второй части статьи «SQL Operators Tutorial – Bitwise, Comparison, Arithmetic, and Logical Operator Query Examples».
В первой части статьи мы рассмотрели такие темы:
В этой части мы рассмотрим:
Операторы для проверки существования (IN / NOT IN)
Если мы хотим проверить, есть ли определенное значение в списке значений, мы можем воспользоваться операторами IN или NOT IN :
Аналогично, для отрицания используется NOT IN :
Частичное совпадение — использование LIKE
Иногда нам нужно найти строки, основываясь на частичном совпадении.
Поиск пользователей, чей email оканчивается на gmail.com :
Строка %gmail.com означает «совпадение со всем, что кончается на gmail.com».
Если мы посмотрим на данные наших пользователей, мы заметим, что среди них только у двоих адрес электронной почты кончается на gmail.com :
Но в email Джейн указана заглавная «G». Предыдущий запрос не выберет эту запись, потому что мы ищем точное совпадение с gmail.com, а там «g» в нижнем регистре.
Чтобы поиск не зависел от регистра, нужно заменить LIKE на ILIKE :
Групповой символ % в начале строки означает, что вернуть нужно все, что заканчивается на «gmail.com». Это может быть и ob.jones+12345@gmail.com, и asdflkasdflkj@gmail.com — главное, чтобы в конце стояло «gmail.com».
Мы также можем использовать столько групповых символов, сколько нам нужно.
Работа с отсутствующими данными (NULL)
Давайте посмотрим, как быть со столбцами и строками, где нет данных.
Этот новый столбец будет TIMESTAMP (подобно datetime в других языках) и будет представлять дату и время, когда пользователь впервые заплатил нам за наше приложение. Может, мы хотим послать ему открытку и цветы в честь годовщины.
Чтобы изменить таблицу, не стирая ее и не лишаясь данных, можно использовать ALTER TABLE :
NULL это специальное значение в базах данных. Это отсутствие значения, и оно ведет себя не так, как можно было бы ожидать.
Чтобы это продемонстрировать, давайте посмотрим на простой SELECT :
Теперь давайте попробуем проделать то же самое с NULL :
Если мы запустим этот запрос еще раз, мы увидим в выводе ожидаемый нами NULL :
Использование IS NULL и IS NOT NULL
Эти значения ожидаемы: NULL IS NULL — истина, NULL IS NOT NULL — ложь.
Это все прекрасно и очень интересно, но как это применять на практике?
Что ж, для начала давайте заведем какие-то данные в нашем столбце first_paid_at :
В приведенной выше инструкции UPDATE мы задали значения для столбца first_paid_at у троих разных пользователей: пользователю с ID 1 — текущее время ( NOW() ), пользователю с ID 2 — текущее время минус месяц, а пользователю с ID 3 — текущее время минус год.
Во-первых, давайте найдем пользователей, которые нам уже платили, и пользователей, которые пока этого не делали:
Операторы сравнения при работе с датами и временем
Попробуем найти пользователей, которые совершили платеж на протяжении последней недели. Для этого мы можем взять текущее время ( NOW() ) и вычесть из него одну неделю при помощи ключевого слова INTERVAL :
Мы также можем использовать другой интервал, например, последние три месяца:
Теперь давайте найдем пользователей, которые совершали платеж в промежутке от одного до шести месяцев назад.
Проверка существования с использованием EXISTS / NOT EXISTS
Эти операторы фильтруют строки, проверяя существование или несуществование условия. Это условие обычно является запросом к другой таблице.
Это простая таблица. Она содержит только ID, поле для хранения текста поста ( body ) и ссылку на пользователя, который написал этот пост ( user_id ).
Давайте добавим в новую таблицу некоторые данные:
Согласно добавленным данными, у пользователя с ID 1 есть два поста, у пользователя с ID 2 — один пост, у пользователя с ID 3 — тоже один пост.
EXISTS принимает подзапрос. Если этот подзапрос возвращает что-либо (даже строку со значением NULL ), база данных включит эту строку в результат.
EXISTS проверяет лишь существование строки из подзапроса, ему не важно, что именно содержится в этой строке.
Вот пример выборки пользователей, имеющих посты:
Как и ождилалось, мы получили пользователей с ID 1, 2 и 3.
Аналогично, мы можем найти пользователей, у которых нет постов. Для этого нужно заменить EXISTS на NOT EXISTS :
Наконец, мы можем переписать наш запрос и использовать IN или NOT IN вместо EXISTS или NOT EXISTS :
Поразрядные операторы
Хотя на практике поразрядные операторы используются нечасто, для полноты картины давайте рассмотрим простой пример.
Если мы по какой-то причине хотим посмотреть возраст наших пользователей в бинарном виде и поиграться с перестановкой битов, мы можем использовать поразрядные операторы.
Чтобы осуществить поразрядную операцию, нам сначала нужно преобразовать значения в нашем столбце age из целых чисел в бинарный формат. В данном случае мы использовали ::bit(8) и получили восьмибитовые строки.
Практически все остальные поразрядные операторы используют тот же формат:
Поразрядный оператор «not» (
) немного отличается. Он применяется к одному термину, так же, как и обычный оператор NOT :
И, наконец, самый полезный из поразрядных операторов: конкатенация.
Этот оператор обычно используется для склейки вместе строк текста. Например, если мы хотим составить вычисленное «полное имя» для пользователей, мы можем воспользоваться конкатенацией:
Заключение
Итак, мы рассмотрели практически все операторы фильтрации, котоыре вам могут понадобиться в работе!
Есть еще несколько, о которых мы не упоминали, но они либо используются не слишком часто, либо используются точно так же, как те, что мы разобрали, так что у вас не должно возникнуть проблем с ними.
От редакции Techrocks: возможно, вам будет интересна еще одна статья того же автора: SQL JOIN: руководство по объединению таблиц.




