Courses
Toán tử SQL EXISTS() kiểm tra xem một giá trị hoặc bản ghi có tồn tại trong một truy vấn con hay không. Khi được dùng trong mệnh đề WHERE(), toán tử EXISTS() sẽ trả về các bản ghi đã được lọc từ truy vấn. Việc đánh giá truy vấn con rất quan trọng trong SQL vì nó cải thiện hiệu năng truy vấn và cho phép đánh giá các truy vấn phức tạp.
Nếu bạn đang hướng tới vai trò nhà phân tích dữ liệu hoặc nhà khoa học dữ liệu, tôi khuyên bạn nên học khóa Giới thiệu về SQL của DataCamp để nắm vững những điều cơ bản về lọc dữ liệu trong SQL. Nếu cần ôn nhanh các toán tử và hàm SQL, hãy xem Cheat Sheet SQL Cơ Bản của chúng tôi.
Câu trả lời nhanh: Cách dùng toán tử SQL EXISTS()
Toán tử EXISTS() trong SQL dùng để kiểm tra các bản ghi chỉ định trong một truy vấn con. Toán tử EXISTS() thường được dùng trong mệnh đề WHERE để lọc bản ghi, như ví dụ dưới đây:
SELECT column_name(s)
FROM table_name
WHERE EXISTS (subquery);
Hãy xem cú pháp của truy vấn trên:
column_name(s): Các cột cần trả vềtable_name: Bảng mà bạn chọn dữ liệu.subquery: Truy vấn con có một câu lệnhSELECTlồng nhau.
Giả sử bạn có hai bảng Products và Suppliers như dưới đây.

Ví dụ bảng Products. Ảnh: Tác giả.

Ví dụ bảng Suppliers. Ảnh: Tác giả.
Truy vấn sau sử dụng toán tử EXISTS() để lọc các bản ghi khi nhà cung cấp có sản phẩm và trả về các hàng đã lọc.
-- Select all suppliers who have at least one product listed
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
-- Subquery to check if the supplier has any products
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
);
Bảng kết quả như dưới đây.

Ví dụ bảng kết quả. Ảnh: Tác giả.
Ví dụ chi tiết và các trường hợp sử dụng
Ở mức cơ bản nhất, toán tử EXISTS() trong SQL kiểm tra xem có hàng nào trong truy vấn con đáp ứng điều kiện chỉ định hay không, như ta đã thấy ở ví dụ trên. Nhưng chúng ta cũng có thể dùng EXISTS() với các điều kiện phức tạp hơn. Xem nhé.
EXISTS() với các điều kiện phức tạp hơn
Toán tử EXISTS() có thể kiểm tra nhiều điều kiện từ các bảng khác nhau. Kỹ thuật này liên quan đến việc dùng các toán tử khác để kiểm tra điều kiện chỉ định trong truy vấn con. Trong truy vấn dưới đây, EXISTS() kiểm tra xem một nhà cung cấp có các sản phẩm có giá trên $5.00 hay không. Lưu ý truy vấn có dùng toán tử AND trong các điều kiện phức tạp.
-- Select all suppliers who have products priced above $5.00
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
-- Subquery to check if the supplier has any products priced above $5.00
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
AND p.price > 5.00
);

Ví dụ bảng kết quả với điều kiện phức tạp. Ảnh: Tác giả.
Toán tử NOT EXISTS()
Toán tử NOT EXISTS() là phần đối nghịch của EXISTS(), dùng để tìm các bản ghi không khớp trong truy vấn con. Ví dụ, truy vấn dưới đây lọc dữ liệu và trả về các hàng từ bảng Suppliers nơi nhà cung cấp không có sản phẩm tương ứng trong bảng Products.
-- Select all suppliers who do not have any products listed
SELECT supplier_name, city
FROM Suppliers s
WHERE NOT EXISTS (
-- Subquery to check if the supplier does not have any products
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
);
Kỹ thuật nâng cao với toán tử SQL EXISTS()
Bạn cũng có thể áp dụng các cách nâng cao để dùng EXISTS(), bao gồm các phương pháp sau:
EXISTS() với truy vấn con tương quan
Toán tử EXISTS() đánh giá bản ghi theo từng hàng trong các truy vấn con tương quan. Truy vấn dưới đây dùng EXISTS() và truy vấn con tương quan để lọc, tìm các sản phẩm có nhà cung cấp ở cùng thành phố.
-- Select all products where the supplier is located in the same city as the product's supplier
SELECT product_name, price
FROM Products p1
WHERE EXISTS (
-- Correlated subquery to check if there is another product with the same supplier's city
SELECT 1
FROM Suppliers s1
WHERE s1.supplier_id = p1.supplier_id
AND EXISTS (
-- Nested correlated subquery to ensure the city matches
SELECT 1
FROM Suppliers s2
WHERE s2.city = s1.city
AND s2.supplier_id <> s1.supplier_id
)
);
Kết hợp EXISTS() với các toán tử khác
Toán tử EXISTS() là kỹ thuật truy vấn nâng cao có thể kết hợp với các toán tử khác như IN, ANY và ALL để lọc phức tạp. Truy vấn dưới đây dùng phương pháp này để tìm các nhà cung cấp có sản phẩm được định giá thấp hơn của John.
-- Select suppliers who have products priced lower than any product supplied by 'John'
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
-- Subquery to find products priced lower than any product by 'John'
SELECT 1
FROM Products p1
WHERE p1.supplier_id = s.supplier_id
AND p1.price < ANY (
-- Subquery to get the prices of products supplied by 'John'
SELECT p2.price
FROM Products p2
JOIN Suppliers s2 ON p2.supplier_id = s2.supplier_id
WHERE s2.supplier_name = 'John'
)
);

Ví dụ kết quả dùng EXISTS() cùng các toán tử khác. Ảnh: Tác giả.
Tối ưu hóa EXISTS() cho hiệu năng
Các kỹ thuật khác nhau để tối ưu hóa hiệu năng của EXISTS() gồm:
Đánh chỉ mục (Indexing)
Đánh chỉ mục các cột liên quan giúp tăng tốc thực thi truy vấn, cải thiện hiệu năng.
-- Create index on supplier_id in Products table
CREATE INDEX idx_supplier_id ON Products(supplier_id);
-- Create index on city in Suppliers table
CREATE INDEX idx_city ON Suppliers(city);
Sử dụng SELECT 1
Truy vấn con SELECT 1 trong EXISTS() giúp tăng độ dễ đọc và hiệu năng truy vấn.
-- Example using SELECT 1 in subquery
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
);
Giới hạn thực thi truy vấn con
Một cách tối ưu hiệu năng của EXISTS() là giới hạn số hàng mà truy vấn trả về. Truy vấn dưới đây giới hạn số bản ghi bằng cách chỉ lấy các hàng có giá sản phẩm vượt quá $5.00.
-- Optimized subquery to minimize data retrieval
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
-- Limit records to retrieve where price > $5.00
AND p.price > 5.00
);
Ứng dụng thực tiễn của toán tử SQL EXISTS()
Có nhiều ứng dụng của EXISTS() trong phân tích dữ liệu, bao gồm:
- Kiểm tra dữ liệu:
EXISTS()trong SQL kiểm tra sự hiện diện của dữ liệu liên quan trước khi thực hiện các thao tác tiếp theo. - Lọc kết quả:
EXISTS()lọc kết quả dựa trên truy vấn con để trả về các bản ghi cần thiết. - Đảm bảo toàn vẹn dữ liệu:
EXISTS()kiểm tra xem một bản ghi cụ thể có tồn tại trong tập dữ liệu/bảng trước khi chèn hoặc cập nhật hay không. - Cập nhật có điều kiện:
EXISTS()có thể dùng để cập nhật bản ghi trong bảng dựa trên sự tồn tại của các bản ghi khác. - Xóa bản ghi:
EXISTS()có thể kiểm tra và xóa bản ghi trong bảng. - Tối ưu hóa truy vấn con: Khi dùng trong truy vấn con tương quan,
EXISTS()được sử dụng để tối ưu hóa truy vấn con.
Tôi khuyến nghị bạn học các khóa Associate Data Analyst in SQL và Reporting in SQL của DataCamp để tìm hiểu thêm các ứng dụng thực tiễn của SQL thông qua phân tích dữ liệu.
Triển khai theo từng hệ quản trị và các lưu ý
Khi sử dụng EXISTS(), cần lưu ý về mức độ hỗ trợ và cú pháp truy vấn giữa các hệ quản trị cơ sở dữ liệu khác nhau.
Khác biệt giữa các phương ngữ SQL.
Toán tử EXISTS() là đồng nhất trên các cơ sở dữ liệu MySQL, PostgreSQL, Oracle và SQL Server. Vì vậy, nếu bạn chuyển mã từ hệ này sang hệ khác, bạn sẽ không phải chỉnh sửa phần này của mã.
Lưu ý rằng EXISTS() trong SQL Server thuộc Transact-SQL (T-SQL). T-SQL là ngôn ngữ truy vấn có các tính năng nâng cao chủ yếu dùng trong cơ sở dữ liệu SQL Server. Tuy nhiên, cú pháp EXISTS() vẫn tương tự như các ví dụ trong hướng dẫn này.
Các hàm thay thế cho toán tử EXISTS()
Nếu bạn tìm các lựa chọn thay thế, những hàm sau sẽ giúp lọc dữ liệu theo cách tương tự EXISTS().
Toán tử IN
Toán tử IN kiểm tra sự tồn tại của bản ghi tương tự như EXISTS(). Tuy nhiên, IN có thể gặp vấn đề hiệu năng vì nó truy vấn toàn bộ tập dữ liệu cùng lúc.
-- Using IN to check if suppliers have products
SELECT supplier_name, city
FROM Suppliers
WHERE supplier_id IN (
SELECT supplier_id
FROM Products
);
Mệnh đề JOIN
Mệnh đề JOIN hiệu quả để kiểm tra sự tồn tại của bản ghi trong dữ liệu liên quan nhưng kém hiệu quả hơn EXISTS(). EXISTS() hiệu quả hơn vì nó chỉ kiểm tra xem truy vấn con có trả về hàng nào không mà không trộn các tập dữ liệu như JOIN sẽ làm.
-- Using JOIN to check if suppliers have products
SELECT s.supplier_name, s.city
FROM Suppliers s
JOIN Products p ON s.supplier_id = p.supplier_id
GROUP BY s.supplier_name, s.city;
Để tìm hiểu thêm về JOIN giữa các bảng, hãy xem khóa Learn SQL của DataCamp, trong đó trình bày chi tiết chủ đề này.
Lưu ý về hiệu năng và thực tiễn tốt nhất
Trong một số trường hợp, sử dụng EXISTS() có thể gây vấn đề về hiệu năng. Để tối ưu, hãy cân nhắc các thực tiễn sau.
Tác động đến hiệu năng truy vấn và chiến lược tối ưu sử dụng
Các truy vấn SQL dùng EXISTS() có thể gặp vấn đề hiệu năng khi làm việc với tập dữ liệu lớn hoặc truy vấn con trả về nhiều kết quả. Do đó, áp dụng các bộ lọc khác nhau trong truy vấn con là quan trọng để giảm số bản ghi cần lấy. Cách hiệu quả nhất là dùng câu lệnh SELECT 1 để giảm dữ liệu cần xử lý trong quá trình lọc.
-- Efficient subquery with selective filtering
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
AND p.price > 5.00
);
Cân nhắc đánh chỉ mục để đảm bảo đánh giá truy vấn con hiệu quả
Để cải thiện hiệu năng truy vấn con, hãy đánh chỉ mục các cột được dùng thường xuyên trong mệnh đề WHERE. Kỹ thuật tốt nhất là tạo chỉ mục trên các cột tham gia điều kiện join và bộ lọc trong truy vấn con.
-- Create an index on the supplier_id column in the Products table
CREATE INDEX idx_supplier_id ON Products(supplier_id);
-- Create an index on the supplier_id column in the Suppliers table
CREATE INDEX idx_supplier_id_suppliers ON Suppliers(supplier_id);
Giám sát và xử lý các nút thắt hiệu năng
Để giám sát các nút thắt hiệu năng, hãy dùng kế hoạch thực thi để xác định các vòng lặp lồng nhau lớn cản trở việc thực thi. Các công cụ quản trị cơ sở dữ liệu như EXPLAIN trong SQL Server và MySQL có thể giúp hiểu kế hoạch thực thi trước khi tối ưu truy vấn.
-- Using EXPLAIN to analyze the execution plan
EXPLAIN
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
SELECT 1
FROM Products p
WHERE p.supplier_id = s.supplier_id
);
Việc sử dụng xử lý theo lô (batch) và tái cấu trúc truy vấn cũng giúp chia nhỏ các truy vấn lớn thành các phần nhỏ hơn để xử lý nhanh hơn. Xử lý theo lô cho phép lọc các tập dữ liệu lớn theo từng đợt, cải thiện thời gian thực thi.
-- Refactoring a complex query into simpler parts
WITH SupplierProducts AS (
SELECT supplier_id
FROM Products
WHERE price > 5.00
)
SELECT supplier_name, city
FROM Suppliers s
WHERE EXISTS (
SELECT 1
FROM SupplierProducts sp
WHERE sp.supplier_id = s.supplier_id
);
Các công cụ hồ sơ hóa truy vấn tích hợp cũng giúp theo dõi và xử lý các nút thắt hiệu năng. Bao gồm:
Kết luận và hướng học tiếp
Như đã thấy, toán tử SQL EXISTS() hữu ích để kiểm tra sự tồn tại của bản ghi/giá trị trong một truy vấn con. Việc nắm cách dùng EXISTS() rất quan trọng trong quản trị và phân tích cơ sở dữ liệu.
Tôi khuyến khích bạn thực hành các trường hợp sử dụng khác nhau của EXISTS() với nhiều tập dữ liệu để thành thạo và hiểu rõ những tinh tế của nó. Nếu muốn nâng cao kỹ năng SQL, tôi đề xuất học các khóa SQL Fundamentals và Intermediate SQL của DataCamp. Bạn cũng nên lấy Chứng chỉ SQL Associate của chúng tôi để chứng minh năng lực áp dụng SQL trong thực tế, giúp bạn nổi bật khi phỏng vấn.
Câu hỏi thường gặp
Toán tử SQL EXISTS là gì?
Toán tử EXISTS() trong SQL dùng để kiểm tra sự tồn tại của một bản ghi hoặc giá trị trong một truy vấn con.
Toán tử SQL NOT EXISTS là gì?
Toán tử NOT EXISTS() trong SQL lọc các bản ghi trong một bảng và trả về các hàng không đáp ứng điều kiện chỉ định trong truy vấn con.
Tôi có thể dùng toán tử SQL EXISTS để kiểm tra nhiều điều kiện không?
Toán tử EXISTS() trong SQL có thể kiểm tra nhiều điều kiện khi kết hợp với các toán tử khác như AND.
Toán tử SQL EXISTS có được hỗ trợ trong tất cả các cơ sở dữ liệu không?
Tất cả hệ quản trị cơ sở dữ liệu lớn, bao gồm MySQL, SQL Server, PostgreSQL và Oracle, đều hỗ trợ toán tử EXISTS().
Các hàm/mệnh đề nào là thay thế cho toán tử SQL EXISTS?
Toán tử IN và mệnh đề JOIN là những lựa chọn thay thế phù hợp cho toán tử EXISTS(). Tuy nhiên, các lựa chọn này có thể gặp vấn đề hiệu năng với truy vấn.
EXISTS() có thể dùng cùng các mệnh đề khác ngoài WHERE không?
Có, EXISTS() cũng có thể dùng với mệnh đề HAVING.
