Sql что такое exists
Предикат EXISTS
Обычно предикат EXISTS используется в зависимых (коррелирующих) подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен оцениваться отдельно для каждой строки запроса, в котором содержится данный подзапрос. Поэтому предикат EXISTS может иметь разные значения для разных строк основного запроса.
Пример на пересечение.
Найти тех производителей портативных компьютеров, которые также производят принтеры:
В подзапросе выбираются производители принтеров и сравниваются с производителем, значение которого передается из основного запроса. В основном же запросе отбираются производители портативных компьютеров. Таким образом, для каждого производителя портативных компьютеров проверяется, возвращает ли подзапрос строки (которые говорят о том, что этот производитель также выпускает принтеры). Поскольку два условия в предложении WHERE должны выполняться одновременно ( AND ), то в результирующий набор попадут нужные нам строки. DISTINCT используется для того, чтобы каждый производитель присутствовал в выходных данных только один раз. В результате получим
Пример на разность.
Найти производителей портативных компьютеров, которые не производят принтеров:
Предикат 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.
Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
Базы данных
SQL условие EXISTS
В этом учебном материале вы узнаете, как использовать SQL условие EXISTS с синтаксисом и примерами.
Описание
SQL условие EXISTS используется в сочетании с подзапросом и считается выполненным, если подзапрос возвращает хотя бы одну строку. Его можно использовать в операторе SELECT, INSERT, UPDATE или DELETE.
Синтаксис
Синтаксис условия EXISTS в SQL:
Параметры или аргументы
Примечание
Операторы SQL, использующие условие EXISTS, очень неэффективны, поскольку подзапрос повторно запускается для КАЖДОЙ строки в таблице внешнего запроса. Есть более эффективные способы написания большинства запросов, которые не используют условие EXISTS.
Давайте начнем с примера, который показывает, как использовать условие EXISTS с оператором SELECT.
В этом примере у нас есть таблица customers со следующими данными:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
6000 | Mila | Kunis | yahoo.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
9000 | Russell | Crowe | google.com |
И таблица orders со следующими данными:
order_id | customer_id | order_date |
---|---|---|
1 | 7000 | 2019/06/18 |
2 | 5000 | 2019/06/18 |
3 | 8000 | 2019/06/19 |
4 | 4000 | 2019/06/20 |
5 | NULL | 2019/07/01 |
Будет выбрано 4 записи. Вот результаты, которые вы должны получить:
customer_id | first_name | last_name | favorite_website |
---|---|---|---|
4000 | Justin | Bieber | google.com |
5000 | Selena | Gomez | bing.com |
7000 | Tom | Cruise | oracle.com |
8000 | Johnny | Depp | NULL |
Пример условия EXISTS с оператором UPDATE
Давайте рассмотрим пример, в котором используется условие EXISTS в операторе UPDATE.
В этом примере у нас есть таблица products со следующими данными:
product_id | product_name | category_id |
---|---|---|
1 | Pear | 50 |
2 | Banana | 50 |
3 | Orange | 50 |
4 | Apple | 50 |
5 | Bread | 75 |
6 | Sliced Ham | 25 |
7 | Kleenex | NULL |
И таблица с именем summary_data со следующими данными:
product_id | current_category |
---|---|
1 | 10 |
2 | 10 |
3 | 10 |
4 | 10 |
5 | 10 |
Будет обновлено 5 записей. Снова выберите данные из таблицы summary_data :
Вот результаты, которые вы получите:
product_id | current_category |
---|---|
1 | 50 |
2 | 50 |
3 | 50 |
4 | 50 |
5 | 75 |
8 | 10 |
Подсказка: Если бы мы не включили условие EXISTS, запрос UPDATE обновил бы поле current_category на NULL в 6-й строке таблицы summary_data (поскольку таблица products не имеет записи, где product_id = 8).
Пример условия EXISTS с оператором DELETE
Давайте посмотрим на пример, который использует условие EXISTS в опертаоре DELETE.
В этом примере у нас есть таблица customer со следующими данными:
Логический оператор 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 (Transact-SQL)
Specifies a subquery to test for the existence of rows.
Transact-SQL Syntax Conventions
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.