EXISTS (Transact-SQL)
Указывает вложенный запрос для проверки существования строк.
Синтаксис
EXISTS ( subquery )
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
subquery
Ограниченная инструкция SELECT. Ключевое слово INTO не допускается. Дополнительные сведения о вложенных запросах см. в разделе SELECT (Transact-SQL).
Типы результата
Boolean
Результирующие значения
Возвращает значение TRUE, если вложенный запрос содержит хотя бы одну строку.
Примеры
А. Использование значения NULL во вложенном запросе для возвращения результирующего набора
В следующем примере возвращается результирующий набор со значением NULL , указанным во вложенном запросе, и устанавливается значение TRUE с помощью ключевого слова EXISTS .
-- Uses AdventureWorks SELECT DepartmentID, Name FROM HumanResources.Department WHERE EXISTS (SELECT NULL) ORDER BY Name ASC ;
B. Сравнение запросов с помощью ключевых слов EXISTS и IN
В следующем примере сравниваются два семантически эквивалентных запроса. В первом запросе используется ключевое слово EXISTS , а во втором — ключевое слово IN .
-- Uses AdventureWorks SELECT a.FirstName, a.LastName FROM Person.Person AS a WHERE EXISTS (SELECT * FROM HumanResources.Employee AS b WHERE a.BusinessEntityID = b.BusinessEntityID AND a.LastName = 'Johnson') ; GO
В следующем запросе используется ключевое слово IN .
-- Uses AdventureWorks SELECT a.FirstName, a.LastName FROM Person.Person AS a WHERE a.LastName IN (SELECT a.LastName FROM HumanResources.Employee AS b WHERE a.BusinessEntityID = b.BusinessEntityID AND a.LastName = 'Johnson') ; GO
Здесь приведен результирующий набор для каждого запроса.
FirstName LastName -------------------------------------------------- ---------- Barry Johnson David Johnson Willis Johnson (3 row(s) affected)
C. Сравнение запросов с помощью ключевых слов EXISTS и = ANY
В следующем примере показаны два запроса для поиска магазинов, названия которых совпадают с названием поставщика. В первом запросе используется ключевое слово EXISTS , а во втором — ключевое слово =«ANY .
-- Uses AdventureWorks SELECT DISTINCT s.Name FROM Sales.Store AS s WHERE EXISTS (SELECT * FROM Purchasing.Vendor AS v WHERE s.Name = v.Name) ; GO
В следующем запросе используется ключевое слово = ANY .
-- Uses AdventureWorks SELECT DISTINCT s.Name FROM Sales.Store AS s WHERE s.Name = ANY (SELECT v.Name FROM Purchasing.Vendor AS v ) ; GO
D. Сравнение запросов с помощью ключевых слов EXISTS и IN
В следующем примере показаны запросы для поиска сотрудников подразделений, имена которых начинаются на P .
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, e.JobTitle FROM Person.Person AS p JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID WHERE EXISTS (SELECT * FROM HumanResources.Department AS d JOIN HumanResources.EmployeeDepartmentHistory AS edh ON d.DepartmentID = edh.DepartmentID WHERE e.BusinessEntityID = edh.BusinessEntityID AND d.Name LIKE 'P%') ; GO
В следующем запросе используется ключевое слово IN .
-- Uses AdventureWorks SELECT p.FirstName, p.LastName, e.JobTitle FROM Person.Person AS p JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID JOIN HumanResources.EmployeeDepartmentHistory AS edh ON e.BusinessEntityID = edh.BusinessEntityID WHERE edh.DepartmentID IN (SELECT DepartmentID FROM HumanResources.Department WHERE Name LIKE 'P%') ; GO
Д. Использование ключевого слова NOT EXISTS
Работа ключевого слова NOT EXISTS противоположна работе ключевого слова EXISTS. Предложение WHERE в ключевом слове NOT EXISTS удовлетворяется, если вложенный запрос не возвратил никаких строк. В следующем примере выполняется поиск сотрудников, не входящих в состав подразделений, имена которых начинаются на P .
SELECT p.FirstName, p.LastName, e.JobTitle FROM Person.Person AS p JOIN HumanResources.Employee AS e ON e.BusinessEntityID = p.BusinessEntityID WHERE NOT EXISTS (SELECT * FROM HumanResources.Department AS d JOIN HumanResources.EmployeeDepartmentHistory AS edh ON d.DepartmentID = edh.DepartmentID WHERE e.BusinessEntityID = edh.BusinessEntityID AND d.Name LIKE 'P%') ORDER BY LastName, FirstName GO
FirstName LastName Title ------------------------------ ------------------------------ ------------ Syed Abbas Pacific Sales Manager Hazem Abolrous Quality Assurance Manager Humberto Acevedo Application Specialist Pilar Ackerman Shipping & Receiving Superviso François Ajenstat Database Administrator Amy Alberts European Sales Manager Sean Alexander Quality Assurance Technician Pamela Ansman-Wolfe Sales Representative Zainal Arifin Document Control Manager David Barber Assistant to CFO Paula Barreto de Mattos Human Resources Manager Shai Bassli Facilities Manager Wanida Benshoof Marketing Assistant Karen Berg Application Specialist Karen Berge Document Control Assistant Andreas Berglund Quality Assurance Technician Matthias Berndt Shipping & Receiving Clerk Jo Berry Janitor Jimmy Bischoff Stocker Michael Blythe Sales Representative David Bradley Marketing Manager Kevin Brown Marketing Assistant David Campbell Sales Representative Jason Carlson Information Services Manager Fernando Caro Sales Representative Sean Chai Document Control Assistant Sootha Charncherngkha Quality Assurance Technician Hao Chen HR Administrative Assistant Kevin Chrisulis Network Administrator Pat Coleman Janitor Stephanie Conroy Network Manager Debra Core Application Specialist Ovidiu Crãcium Sr. Tool Designer Grant Culbertson HR Administrative Assistant Mary Dempsey Marketing Assistant Thierry D'Hers Tool Designer Terri Duffy VP Engineering Susan Eaton Stocker Terry Eminhizer Marketing Specialist Gail Erickson Design Engineer Janice Galvin Tool Designer Mary Gibson Marketing Specialist Jossef Goldberg Design Engineer Sariya Harnpadoungsataya Marketing Specialist Mark Harrington Quality Assurance Technician Magnus Hedlund Facilities Assistant Shu Ito Sales Representative Stephen Jiang North American Sales Manager Willis Johnson Recruiter Brannon Jones Finance Manager Tengiz Kharatishvili Control Specialist Christian Kleinerman Maintenance Supervisor Vamsi Kuppa Shipping & Receiving Clerk David Liu Accounts Manager Vidur Luthra Recruiter Stuart Macrae Janitor Diane Margheim Research & Development Enginee Mindy Martin Benefits Specialist Gigi Matthew Research & Development Enginee Tete Mensa-Annan Sales Representative Ramesh Meyyappan Application Specialist Dylan Miller Research & Development Manager Linda Mitchell Sales Representative Barbara Moreland Accountant Laura Norman Chief Financial Officer Chris Norred Control Specialist Jae Pak Sales Representative Wanda Parks Janitor Deborah Poe Accounts Receivable Specialist Kim Ralls Stocker Tsvi Reiter Sales Representative Sharon Salavaria Design Engineer Ken Sanchez Chief Executive Officer José Saraiva Sales Representative Mike Seamans Accountant Ashvini Sharma Network Administrator Janet Sheperdigian Accounts Payable Specialist Candy Spoon Accounts Receivable Specialist Michael Sullivan Sr. Design Engineer Dragan Tomic Accounts Payable Specialist Lynn Tsoflias Sales Representative Rachel Valdez Sales Representative Garrett Vargar Sales Representative Ranjit Varkey Chudukatil Sales Representative Bryan Walton Accounts Receivable Specialist Jian Shuo Wang Engineering Manager Brian Welcker VP Sales Jill Williams Marketing Specialist Dan Wilson Database Administrator John Wood Marketing Specialist Peng Wu Quality Assurance Supervisor (91 row(s) affected)
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
F. Использование ключевого слова EXISTS
В следующем примере определяется, могут ли строки в таблице ProspectiveBuyer соответствовать строкам в таблице DimCustomer . Запрос будет возвращать строки, только при совпадении значений LastName и BirthDate в двух таблицах.
-- Uses AdventureWorks SELECT a.LastName, a.BirthDate FROM DimCustomer AS a WHERE EXISTS (SELECT * FROM dbo.ProspectiveBuyer AS b WHERE (a.LastName = b.LastName) AND (a.BirthDate = b.BirthDate)) ;
G. Использование ключевого слова NOT EXISTS
Работа ключевого слова NOT EXISTS противоположна работе ключевого слова EXISTS. Предложение WHERE в ключевом слове NOT EXISTS удовлетворяется, если вложенный запрос не возвратил никаких строк. В следующем примере показан поиск всех строк в таблице DimCustomer , где LastName и BirthDate не соответствуют записям в таблице ProspectiveBuyers .
-- Uses AdventureWorks SELECT a.LastName, a.BirthDate FROM DimCustomer AS a WHERE NOT EXISTS (SELECT * FROM dbo.ProspectiveBuyer AS b WHERE (a.LastName = b.LastName) AND (a.BirthDate = b.BirthDate)) ;
Exists c что это
Оператор EXISTS позволяет проверить, возвращает ли подзапрос какое-либо значение. Как правило, этот оператор используется для индикации того, что какая-либо строка удовлетворяет условию. То есть фактически оператор EXISTS не возвращает строки, а лишь указывает, что в базе данных есть как минимум одна строка, которые соответствует данному запросу. Поскольку возвращения набора строк не происходит, то подзапросы с подобным оператором выполняются довольно быстро.
Применение оператора имеет следующий формальный синтаксис:
WHERE [NOT] EXISTS (подзапрос)
Например, найдем всех покупателей из таблицы Customer, которые делали заказы:
SELECT * FROM Customers WHERE EXISTS (SELECT * FROM Orders WHERE Orders.CustomerId = Customers.Id)

Другой пример — найдем все товары из таблицы Products, на которые не было заказов в таблице Orders:
SELECT * FROM Products WHERE NOT EXISTS (SELECT * FROM Orders WHERE Products.Id = Orders.ProductId)

Стоит отметить, что для получения подобного результата ы могли бы использовать и опеатор IN :
SELECT * FROM Products WHERE Id NOT IN (SELECT ProductId FROM Orders)
Но поскольку при применении EXISTS не происходит выборка строк, то его использование более оптимально и эффективно, чем использование оператора IN.
Exists c что это
Оператор EXISTS проверяет, возвращает ли подзапрос какое-либо значение. Как правило, этот оператор используется для индикации того, что как минимум одна строка в таблице удовлетворяет некоторому условию. Поскольку возвращения набора строк не происходит, то подзапросы с подобным оператором выполняются довольно быстро.
Применение оператора имеет следующий формальный синтаксис:
WHERE [NOT] EXISTS (подзапрос)
Например, найдем все товары из таблицы Products, на которые есть заказы в таблице Orders:
SELECT * FROM Products WHERE EXISTS (SELECT * FROM Orders WHERE Orders.ProductId = Products.Id)

Если мы хотим узнать, наоброт, есть ли в таблице строки, которые НЕ удовлетворяют условию, то можно использовать операторы NOT EXISTS . Например, найдем все товары из таблицы Products, на которые не было заказов в таблице Orders:
SELECT * FROM Products WHERE NOT EXISTS (SELECT * FROM Orders WHERE Products.Id = Orders.ProductId)
Стоит отметить, что для получения подобного результата можно было бы использовать и опеатор IN :
SELECT * FROM Products WHERE Id NOT IN (SELECT ProductId FROM Orders)
Но поскольку при применении EXISTS не происходит выборка строк, то его использование более оптимально и эффективно, чем использование оператора IN.
Предикат EXISTS
Предикат EXISTS принимает значение TRUE , если подзапрос содержит любое количество строк, иначе его значение равно FALSE . Для NOT EXISTS все наоборот. Этот предикат никогда не принимает значение UNKNOWN .
Обычно предикат EXISTS используется в зависимых (коррелирующих) подзапросах. Этот вид подзапроса имеет внешнюю ссылку, связанную со значением в основном запросе. Результат подзапроса может зависеть от этого значения и должен оцениваться отдельно для каждой строки запроса, в котором содержится данный подзапрос. Поэтому предикат EXISTS может иметь разные значения для разных строк основного запроса.
Пример на пересечение.
Найти тех производителей портативных компьютеров, которые также производят принтеры:

Консоль
Выполнить
В подзапросе выбираются производители принтеров и сравниваются с производителем, значение которого передается из основного запроса. В основном же запросе отбираются производители портативных компьютеров. Таким образом, для каждого производителя портативных компьютеров проверяется, возвращает ли подзапрос строки (которые говорят о том, что этот производитель также выпускает принтеры). Поскольку два условия в предложении WHERE должны выполняться одновременно ( AND ), то в результирующий набор попадут нужные нам строки. DISTINCT используется для того, чтобы каждый производитель присутствовал в выходных данных только один раз. В результате получим
Пример на разность.
Найти производителей портативных компьютеров, которые не производят принтеров:

Консоль
Выполнить