Sql exists не работает

Содержание
  1. EXISTS (Transact-SQL)
  2. Синтаксис
  3. Аргументы
  4. Типы результата
  5. Результирующие значения
  6. Примеры
  7. A. Использование значения NULL во вложенном запросе для возвращения результирующего набора
  8. Б. Сравнение запросов с помощью ключевых слов EXISTS и IN
  9. В. Сравнение запросов с помощью ключевых слов EXISTS и = ANY
  10. Г. Сравнение запросов с помощью ключевых слов EXISTS и IN
  11. Д. Использование ключевого слова NOT EXISTS
  12. Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
  13. Е. Использование ключевого слова EXISTS
  14. Ж. Использование ключевого слова NOT EXISTS
  15. Предикат EXISTS SQL и проверка существования набора значений
  16. Назначение предиката SQL EXISTS
  17. Наиболее простые запросы с предикатом SQL EXISTS
  18. Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение
  19. Различия предикатов EXISTS и IN
  20. Запросы с предикатом EXISTS и дополнительными условиями
  21. Запросы с предикатом EXISTS к двум таблицам
  22. Предикат EXISTS в соединениях более двух таблиц
  23. Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение
  24. Продолжаем писать вместе запросы SQL с предикатом EXISTS

EXISTS (Transact-SQL)

Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных

Указывает вложенный запрос для проверки существования строк.

Синтаксические обозначения в Transact-SQL

Синтаксис

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

subquery
Ограниченная инструкция SELECT. Ключевое слово INTO не допускается. Дополнительные сведения о вложенных запросах см. в разделе SELECT (Transact-SQL).

Типы результата

Boolean

Результирующие значения

Возвращает значение TRUE, если вложенный запрос содержит хотя бы одну строку.

Примеры

A. Использование значения NULL во вложенном запросе для возвращения результирующего набора

В следующем примере возвращается результирующий набор со значением NULL , указанным во вложенном запросе, и устанавливается значение TRUE с помощью ключевого слова EXISTS .

Читайте также:  Как настроить фильтр контента

Б. Сравнение запросов с помощью ключевых слов EXISTS и IN

В следующем примере сравниваются два семантически эквивалентных запроса. В первом запросе используется ключевое слово EXISTS , а во втором — ключевое слово IN .

В следующем запросе используется ключевое слово IN .

Здесь приведен результирующий набор для каждого запроса.

В. Сравнение запросов с помощью ключевых слов EXISTS и = ANY

В следующем примере показаны два запроса для поиска магазинов, названия которых совпадают с названием поставщика. В первом запросе используется ключевое слово EXISTS , а во втором — ключевое слово =«ANY .

В следующем запросе используется ключевое слово = ANY .

Г. Сравнение запросов с помощью ключевых слов EXISTS и IN

В следующем примере показаны запросы для поиска сотрудников подразделений, имена которых начинаются на P .

В следующем запросе используется ключевое слово IN .

Д. Использование ключевого слова NOT EXISTS

Работа ключевого слова NOT EXISTS противоположна работе ключевого слова EXISTS. Предложение WHERE в ключевом слове NOT EXISTS удовлетворяется, если вложенный запрос не возвратил никаких строк. В следующем примере выполняется поиск сотрудников, не входящих в состав подразделений, имена которых начинаются на P .

Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)

Е. Использование ключевого слова EXISTS

В следующем примере определяется, могут ли строки в таблице ProspectiveBuyer соответствовать строкам в таблице DimCustomer . Запрос будет возвращать строки, только при совпадении значений LastName и BirthDate в двух таблицах.

Ж. Использование ключевого слова NOT EXISTS

Работа ключевого слова NOT EXISTS противоположна работе ключевого слова EXISTS. Предложение WHERE в ключевом слове NOT EXISTS удовлетворяется, если вложенный запрос не возвратил никаких строк. В следующем примере показан поиск всех строк в таблице DimCustomer , где LastName и BirthDate не соответствуют записям в таблице ProspectiveBuyers .

Источник

Предикат EXISTS SQL и проверка существования набора значений

Оглавление

  • Назначение предиката SQL EXISTS
  • Наиболее простые запросы с предикатом SQL EXISTS
  • Различия предикатов EXISTS и IN
  • Запросы с предикатом EXISTS и дополнительными условиями
  • Запросы с предикатом EXISTS к двум таблицам
  • Предикат EXISTS в соединениях более двух таблиц

Связанные темы

  • Оператор SELECT
  • Реляционная алгебра и её операции
Назад >>

Назначение предиката 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

Пример 1. Определить ID пользователей, которым выданы книги Толстого, которым также выданы книги Чехова. Во внешнем запросе отбираются данные о пользователях, которым выданы книги Толстого, а предикат EXISTS задаёт дополнительное условие, которое проверяется в во внутреннем запросе — пользователи, которым выданы книги Чехова. Дополнительным условием во внутреннем запросе является совпадение идентификаторов пользователей из внешнего и внутреннего запросов: Customer_ID=tols_user.Customer_id. Запрос будет следующим:

Этот запрос вернёт следующий результат:

Customer_ID
65
205

Далее — пример использования NOT EXISTS в запросе, решающем похожую задачу.

Пример 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

Внутренний запрос (после IN) выбирает авторов: Чехов; Ильф и Петров. Внешний запрос выбирает всех пользователей, которым выданы книги этих авторов. Видим, что, в отличие от предиката EXISTS, предикат IN предваряется именем столбца, в данном случае — Author.

Запросы с предикатом EXISTS и дополнительными условиями

Если дополнительно к предикату EXISTS в запросе применить хотя бы одно дополнительное условие, например, заданное с помощью агрегатных функций, то такие запросы могут служить уже для простого анализа данных. Продемонстрируем это на следующем примере.

Пример 5. Определить ID пользователей, которым выдана хотя бы одна книга Пастернака, и которым при этом выдано более 2 книг. Пишем следующий запрос, в котором первое условие задаётся предикатом EXISTS со вложенным запросом, а второе условие с оператором HAVING всегда должно следовать после вложенного запроса:

Результат выполнения запроса:

User_ID
120

Как видно из таблицы BOOKINUSE, книга Пастернака выдана также пользователю с ID 18, но ему выдана всего одна книга и он не попадает в выборку. Если применить к подобному запросу ещё раз функцию COUNT, но уже для подсчёта выбранных строк (потренируйтесь в этом самостоятельно), то можно получить сведения о том, сколько пользователей, читающих книги Пастернака, при этом читают также книги других авторов. Это уже из сферы анализа данных.

Запросы с предикатом EXISTS к двум таблицам

Запросы с предикатом EXISTS могут извлекать данные из более чем одной таблицы. Многие задачи можно с тем же результатом решить с помощью оператора JOIN, но в ряде случаев использование EXISTS позволяет составить менее громоздкий запрос. Использовать EXISTS предпочительнее в тех случаях, когда в результирующую таблицу попадут столбцы лишь из одной таблицы.

В следующем примере из той же базы данных помимо таблицы BOOKINUSE потребуется также таблица «Пользователь» (CUSTOMER).

Customer_ID Surname
18 Зотов
31 Перов
47 Васин
65 Тихонов
120 Краснов
205 Климов

Пример 6. Определить авторов, книги которых выданы пользователю по фамилии Краснов. Пишем следующий запрос, в котором предикатом EXISTS задано единственное условие:

Результатом выполнения запроса будет следующая таблица:

Author
Чехов
Маяковский
Пастернак

Как и в случае использования оператора JOIN, в случаях более одной таблицы следует использовать псевдонимы таблиц для проверки соответствия значений ключей, соединяющих таблицы. В нашем примере псевдонимы таблиц — bk и us, а ключ, соединяющий таблицы — User_ID.

Примеры запросов к базе данных «Библиотека» есть также в уроках по операторам GROUP BY, IN и функциям CONCAT, COALESCE.

Предикат EXISTS в соединениях более двух таблиц

Сейчас мы увидим более предметно, почему использовать EXISTS предпочительнее в тех случаях, когда в результирующую таблицу попадут столбцы лишь из одной таблицы.

Работаем с базой данных «Недвижимость». Скрипт для создания этой базы данных, её таблиц и заполения таблиц данными — в файле по этой ссылке.

Таблица Deal содержит данные о сделках. Для наших заданий в этой таблице будет важен столбец Type с данными о типе сделки — продажа или аренда. Таблица Object содержит данные об объектах. В этой таблице нам понадобятся значения столбцов Rooms (число комнат) и LogBalc, содержащего данные о наличии лоджии или балкона в булевом формате: 1 (да) или 0 (нет). Таблицы Client, Manager и Owner содержат данные соответственно о клиентах, менеджерах фирмы и собственниках объектов недвижимости. В этих таблицах FName и LName соответственно имя и фамилия.

Пример 7. Определить клиентов, купивших или взявших в аренду объекты, у которых нет лоджии или балкона. Пишем следующий запрос, в котором предикатом EXISTS задано обращение к результату соединения двух таблиц:

Так как из таблицы Client столбцы выбираются при помощи оператора «звёздочка», то будут выведены все столбцы этой таблицы, в которой будет столько строк, сколько насчитывается клиентов, соответствующих условию, заданному предикатом EXISTS. Из таблиц, к соединению которых обращается вложенный запрос, нам не требуется выводить ни одного столбца. Поэтому для экономии машинного времени извлекается лишь один столбец. Для этого после слова SELECT прописана единица. Этот же приём применён и в запросах в следующих примерах.

Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение

Пример 3. Определить менеджеров, которые провели сделки с объектами с числом комнат больше 2.

Продолжаем писать вместе запросы SQL с предикатом EXISTS

Пример 9. Определить собственников объектов, которые были взяты в аренду. Пишем следующий запрос, в котором предикатом EXISTS также задано обращение к результату соединения двух таблиц:

Как и в предыдущем примере, из таблицы, к которой обращён внешний запрос, будут выведены все поля.

Пример 10. Определить число собственников, с объектами которых провёл менеджер Савельев. Пишем запрос, в котором внешний запрос обращается к соединению трёх таблиц, а предикатом EXISTS задано обращение лишь к одной таблице:

Все запросы проверены на существующей базе данных. Успешного использования!

Примеры запросов к базе данных «Недвижимость» есть также в уроках по операторам GROUP BY и IN.

Источник

Оцените статью