Trong SQL Server, "Exists" là một điều kiện được sử dụng để kết hợp với truy vấn nội bộ (subquery). Nếu truy vấn nội bộ trả về ít nhất 1 hàng, điều kiện này được đáp ứng. Điều kiện EXISTS có thể được dùng trong lệnh SELECT, INSERT, UPDATE hoặc DELETE.
Cú pháp mệnh đề EXISTS trong SQL Server
WHERE EXISTS (subquery);
Trong đó, subquery
là truy vấn nội bộ, là một lệnh SELECT. Nếu truy vấn này trả về ít nhất 1 bản ghi, mệnh đề EXISTS được đánh giá là đúng và điều kiện EXISTS được đáp ứng. Ngược lại, nếu truy vấn nội bộ không trả về bản ghi nào, mệnh đề EXISTS được đánh giá là sai và điều kiện EXISTS không được đáp ứng.
Lưu ý: Sử dụng điều kiện EXISTS không hiệu quả vì truy vấn nội bộ sẽ chạy lại trên mỗi hàng trong bảng ở truy vấn bên ngoài. Có nhiều cách hiệu quả hơn mà không cần dùng điều kiện EXISTS.
Ví dụ sử dụng EXISTS trong lệnh SELECT
Ví dụ dưới đây sẽ trả về tất cả các bản ghi từ bảng "nhanvien" khi có ít nhất 1 bản ghi trong bảng "danhba" có họ và tên khớp với họ và tên trong bảng "nhanvien".
SELECT * FROM nhanvien WHERE EXISTS (SELECT * FROM danhba WHERE nhanvien.ho = danhba.ho AND nhanvien.ten = danhba.ten);
Ví dụ sử dụng NOT EXISTS trong lệnh SELECT
Điều kiện EXISTS có thể được kết hợp với toán tử NOT để trả về các bản ghi trong bảng "nhanvien" nếu không có bản ghi nào trong bảng "danhba" khớp với họ và tên trong bảng "nhanvien".
SELECT * FROM nhanvien WHERE NOT EXISTS (SELECT * FROM danhba WHERE nhanvien.ho = danhba.ho AND nhanvien.ten = danhba.ten);
Ví dụ sử dụng EXISTS trong lệnh INSERT
Trong ví dụ này, chúng ta sử dụng lệnh INSERT với điều kiện EXISTS để chèn dữ liệu từ bảng "nhacung" vào bảng "danhba" nếu có ít nhất 1 bản ghi trong bảng "donhang" có "nhacung_id" khớp với "nhacung_id" trong bảng "nhacung".
INSERT INTO danhba(danhba_id, danhba_ten) SELECT nhacung_id, nhacung_ten FROM nhacung WHERE EXISTS (SELECT * FROM donhang WHERE nhacung.nhacung_id = donhang.nhacung_id);
Ví dụ sử dụng EXISTS trong lệnh UPDATE
Dưới đây là ví dụ sử dụng lệnh UPDATE với điều kiện EXISTS để cập nhật cột "nhacung_ten" trong bảng "nhacung" bằng cột "ten" trong bảng "khachhang" khi có bản ghi trong bảng "khachhang" có "khachhang_id" khớp với "nhacung_id" trong bảng "nhacung".
UPDATE nhacung SET nhacung_ten = (SELECT khachhang.ten FROM khachhang WHERE khachhang.khachhang_id = nhacung.nhacung_id) WHERE EXISTS (SELECT khachhang.ten FROM khachhang WHERE khachhang.khachhang_id = nhacung.nhacung_id);
Ví dụ sử dụng EXISTS trong lệnh DELETE
Lệnh DELETE cũng có thể được sử dụng với điều kiện EXISTS để xóa các bản ghi trong bảng "danhba" khi có bản ghi trong bảng "nhanvien" có "ho" khớp với "ho" trong bảng "danhba".
DELETE FROM danhba WHERE EXISTS (SELECT * FROM nhanvien WHERE nhanvien.ho = danhba.ho);
Tương tự giữa EXISTS và JOIN
Exists trả về TRUE hoặc FALSE trong khi JOIN trả về các hàng từ bảng khác. Exists được sử dụng để kiểm tra sự tồn tại của các hàng từ bảng liên quan mà không cần trả về dữ liệu từ chúng.
Ví dụ về EXISTS và IN
Lệnh sau sử dụng toán tử IN để tìm các đơn hàng của khách hàng từ San Jose:
SELECT * FROM sales.orders WHERE customer_id IN (SELECT customer_id FROM sales.customers WHERE city = 'San Jose') ORDER BY customer_id, order_date;
Lệnh sau sử dụng toán tử EXISTS và trả về kết quả tương tự:
SELECT * FROM sales.orders o WHERE EXISTS (SELECT customer_id FROM sales.customers c WHERE o.customer_id = c.customer_id AND city = 'San Jose') ORDER BY o.customer_id, order_date;
NOT EXISTS SQL được dùng ở đâu?
NOT EXISTS SQL được sử dụng để giới hạn số hàng do lệnh SELECT trả về. Điều này kiểm tra truy vấn phụ cho sự tồn tại của hàng. Nếu có, nó trả về kết quả true, nếu không, nó trả về kết quả false.
Làm thế nào tránh NOT EXISTS trong SQL?
Để khắc phục lỗi not exists trong sql Server, hãy đảm bảo bạn đang tìm kiếm trên trang được lập chỉ mục. Hãy chắc chắn rằng không có thao tác dữ liệu trong các cột cần thiết. Thay vì sử dụng NOT EXISTS, hãy thử sử dụng một hàm left outer join, nó sẽ hoạt động tốt hơn đối với tập dữ liệu lớn.
Làm thế nào kiểm tra xem liệu có bản ghi NOT EXISTS trong SQL?
Có nhiều cách khác nhau để kiểm tra xem liệu có bản ghi NOT EXISTS trong SQL hay không. Sử dụng lệnh IF trong EXISTS là một ví dụ điển hình. NOT trong toán tử SQL được sử dụng khi người dùng đang thực hiện một truy vấn trên một cột mà không có bất kỳ dữ liệu nào trong bảng. Bảng khách hàng có chứa bản ghi cho danh sách khách hàng và các giao dịch liên quan.
Đó là những điều cơ bản về điều kiện EXISTS trong SQL Server. Đây là một lệnh điều kiện hữu ích mà bạn nên biết khi làm việc với SQL Server. Hy vọng những kiến thức cơ bản trên sẽ giúp bạn lập trình hiệu quả với SQL Server.