SQL Server: EXISTS và NOT EXISTS

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

EXISTS

Hàm EXISTS() dùng để kiểm tra xem một câu lệnh SELECT nào đó (là đối số của hàm) có trả về bản ghi hay không. Nếu câu lệnh SELECT trả về ít nhất một bản ghi thì hàm EXISTS() sẽ trả về TRUE, ngược lại thì hàm trả về FALSE.

Cú pháp

EXISTS(subquery)

, trong đó, subquery là một câu lênh SELECT nhưng trong câu lệnh SELECT này không được dùng từ khóa INTO.

Kiểu trả về

boolean

Trả về TRUE nếu subquery trả về ít nhất một bản ghi, ngược lại sẽ trả về FALSE.

Các ví dụ

Các ví dụ dưới đây sẽ sử dụng cơ sở dữ liệu mẫu AdventureWorks.

A. Sử dụng NULL trong subquery nhưng vẫn trả về một tập kết quả

Ví dụ sau đây trả về một tập kết quả trong đó subquery chứa NULL nhưng EXISTS vẫn trả về TRUE.

USE AdventureWorks

SELECT DepartmentID, Name
FROM HumanResources.Department
WHERE EXISTS (SELECT NULL)
ORDER BY Name ASC;

B. So sánh các truy vấn bằng cách sử dụng EXISTS và IN

Ví dụ sau đây so sánh hai truy vấn về mặt ngữ nghĩa là tương đương. Truy vấn đầu tiên sử dụng EXISTS và truy vấn thứ hai sử dụng IN.

USE 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

Truy vấn sau đây sử dụng IN.

USE 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

Dưới đây là tập kết quả mà cả hai câu truy vấn trên đều đưa ra như nhau.

FirstName LastName

-------------------------------------------------- ----------

Barry Johnson

David Johnson

Willis Johnson

(3 row(s) affected)

C. So sánh các truy vấn bằng cách sử dụng EXISTS và = ANY

Ví dụ sau đây thể hiện hai truy vấn đều nhằm mục đích tìm cửa hàng có tên là tên giống tên của nhà cung cấp. Truy vấn đầu tiên sử dụng EXISTS và truy vấn thứ hai sử dụng ANY.

USE AdventureWorks

SELECT DISTINCT s.Name
FROM Sales.Store AS s
WHERE EXISTS
(SELECT *
    FROM Purchasing.Vendor AS v
    WHERE s.Name = v.Name) ;
GO

Truy vấn sau đây sử dụng = ANY.

USE AdventureWorks

SELECT DISTINCT s.Name
FROM Sales.Store AS s
WHERE s.Name = ANY
(SELECT v.Name
    FROM Purchasing.Vendor AS v ) ;
GO

D. So sánh các truy vấn bằng cách sử dụng EXISTS và IN

Ví dụ sau đây thể hiện các truy vấn tìm nhân viên của các phòng ban bắt đầu bằng 'P'.

USE 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

Truy vấn sau đây sử dụng IN.

USE 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 ngược với EXISTS. Mệnh đề WHERE trong NOT EXISTS được thỏa mãn nếu subquery không trả về bất kỳ bản ghi nào. Ví dụ sau đây tìm những nhân viên không phải là người của phòng ban có tên bắt đầu bằng 'P'.

USE AdventureWorks

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

Dưới đây là tập hợp kết quả:

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)

Ví dụ sử dụng Azure SQL Data Warehouse Public Preview và Parallel Data Warehouse

F. Sử dụng EXISTS

USE 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. Sử dụng NOT EXISTS

USE 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));

Bài viết và bài tập liên quan

  1. Điều kiện if-else
  2. Bài tập 4 ý 8
» Tiếp: Các phép toán so sánh
« Trước: LIKE và NOT LIKE
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!