Điều kiện SQL EXISTS được sử dụng kết hợp với truy vấn con và được coi là đáp ứng nếu truy vấn con trả về ít nhất một hàng. Nó có thể được sử dụng trong câu lệnh SELECT, INSERT, UPDATE hoặc DELETE
cú pháp
Cú pháp của điều kiện EXISTS trong SQL là
WHERE EXISTS [ subquery ];
Tham số hoặc Đối số
truy vấn con Truy vấn con là câu lệnh SELECT. Nếu truy vấn con trả về ít nhất một bản ghi trong tập kết quả của nó, thì mệnh đề EXISTS sẽ đánh giá là đúng và điều kiện EXISTS sẽ được đáp ứng. Nếu truy vấn con không trả về bất kỳ bản ghi nào, mệnh đề EXISTS sẽ đánh giá là sai và điều kiện EXISTS sẽ không được đáp ứngGhi chú
- Các câu lệnh SQL sử dụng điều kiện EXISTS rất kém hiệu quả vì truy vấn phụ được chạy lại cho MỌI hàng trong bảng của truy vấn bên ngoài. Có nhiều cách hiệu quả hơn để viết hầu hết các truy vấn, không sử dụng điều kiện EXISTS
DDL/DML cho các ví dụ
Nếu bạn muốn làm theo hướng dẫn này, hãy lấy DDL để tạo bảng và DML để điền dữ liệu. Sau đó thử các ví dụ trong cơ sở dữ liệu của riêng bạn
Nhận DDL/DML
Ví dụ - Sử dụng Điều kiện EXISTS với Câu lệnh SELECT
Hãy bắt đầu bằng cách xem một ví dụ cho thấy cách sử dụng điều kiện EXISTS với câu lệnh SELECT
Trong ví dụ này, chúng tôi có một bảng khách hàng với dữ liệu sau
customer_idlast_namefirst_namefavorite_website4000JacksonJoetechonthenet. com5000SmithJanedigminecraft. com6000FergusonSamanthabighoạt động. com7000ReynoldsAllenkiểm tra toán học của bạn. com8000AndersonPaige NULL 9000JohnsonDerektechonthenet. com
Và một bảng gọi là đơn đặt hàng với dữ liệu sau
order_idcustomer_idorder_date170002016/04/18250002016/04/18380002016/04/19440002016/04/20
Bây giờ, hãy tìm tất cả các bản ghi từ bảng khách hàng trong đó có ít nhất một bản ghi trong bảng đơn hàng có cùng customer_id. Nhập câu lệnh SELECT sau
SELECT * FROM customers WHERE EXISTS [SELECT * FROM orders WHERE customers.customer_id = orders.customer_id];
Sẽ có 4 bản ghi được chọn. Đây là những kết quả mà bạn sẽ thấy
customer_idlast_namefirst_namefavorite_website4000JacksonJoetechonthenet. com5000SmithJanedigminecraft. com7000ReynoldsAllenkiểm tra toán học của bạn. com8000AndersonPaige NULL
Trong ví dụ này, có 4 bản ghi trong các khách hàng có giá trị customer_id xuất hiện trong bảng đơn hàng
Ví dụ - Sử dụng điều kiện EXISTS với câu lệnh UPDATE
Hãy xem một ví dụ sử dụng điều kiện EXISTS trong câu lệnh CẬP NHẬT
Trong ví dụ này, chúng tôi có một bảng được gọi là sản phẩm với dữ liệu sau
product_idproduct_namecategory_id1Pear502Banana503Orange504Apple505Bread756Sliced Ham257Kleenex NULL
Và một bảng có tên là summary_data với dữ liệu sau
product_idcurrent_category110210310410510
Bây giờ, hãy cập nhật bảng summary_data với các giá trị từ bảng sản phẩm. Nhập câu lệnh SQL sau
UPDATE summary_data SET current_category = [SELECT category_id FROM products WHERE products.product_id = summary_data.product_id] WHERE EXISTS [SELECT category_id FROM products WHERE products.product_id = summary_data.product_id];
Sẽ có 5 bản ghi được cập nhật. Chọn lại dữ liệu từ bảng summary_data
SELECT * FROM summary_data;
Đây là những kết quả mà bạn sẽ thấy
product_idcurrent_category150250350450575810Ví dụ này sẽ cập nhật trường current_category trong bảng summary_data với category_id từ bảng sản phẩm nơi các giá trị product_id khớp. 5 bản ghi đầu tiên trong bảng summary_data đã được cập nhật
TIỀN BOA. Nếu chúng ta không bao gồm điều kiện EXISTS, thì truy vấn UPDATE sẽ cập nhật trường current_category thành NULL ở hàng thứ 6 của bảng summary_data [vì bảng sản phẩm không có bản ghi trong đó product_id=8]
Ví dụ - Sử dụng điều kiện EXISTS với câu lệnh DELETE
Hãy xem một ví dụ sử dụng điều kiện EXISTS trong câu lệnh DELETE
Trong ví dụ này, chúng tôi có một bảng được gọi là khách hàng với dữ liệu sau
customer_idlast_namefirst_namefavorite_website4000JacksonJoetechonthenet. com5000SmithJanedigminecraft. com6000FergusonSamanthabighoạt động. com7000ReynoldsAllenkiểm tra toán học của bạn. com8000AndersonPaigeNULL9000JohnsonDerektechonthenet. com
Và một bảng gọi là đơn đặt hàng với dữ liệu sau
order_idcustomer_idorder_date170002016/04/18250002016/04/18380002016/04/19440002016/04/205NULL2016/05/01
Nhập câu lệnh DELETE sau
DELETE FROM orders WHERE EXISTS [SELECT * FROM customers WHERE customers.customer_id = orders.customer_id AND customers.last_name = 'Jackson'];
Sẽ có 1 bản ghi bị xóa. Chọn lại dữ liệu từ bảng đơn hàng
SELECT * FROM orders;
Đây là những kết quả mà bạn sẽ thấy
order_idcustomer_idorder_date170002016/04/18250002016/04/18380002016/04/195NULL2016/05/01
Ví dụ này sẽ xóa tất cả các bản ghi khỏi bảng đơn đặt hàng nơi có một bản ghi trong bảng khách hàng có last_name là 'Jackson' và giá trị customer_id phù hợp trong cả hai bảng. Trong ví dụ này, bản ghi cho order_id=4 đã bị xóa
Nếu bạn muốn xác định số hàng sẽ bị xóa, bạn có thể chạy câu lệnh SELECT sau trước khi thực hiện xóa
SELECT COUNT[*] FROM orders WHERE EXISTS [SELECT * FROM customers WHERE customers.customer_id = orders.customer_id AND customers.last_name = 'Jackson'];
Điều này sẽ trả về số bản ghi sẽ bị xóa khi bạn thực hiện câu lệnh DELETE
ĐẾM[*]1Ví dụ - Sử dụng NOT với Điều kiện EXISTS
Cuối cùng, điều kiện NOT có thể được kết hợp với điều kiện EXISTS để tạo ra điều kiện NOT EXISTS. Hãy xem một ví dụ cho thấy cách sử dụng điều kiện NOT EXISTS trong SQL
Trong ví dụ này, chúng tôi có một bảng được gọi là khách hàng với dữ liệu sau
customer_idlast_namefirst_namefavorite_website4000JacksonJoetechonthenet. com5000SmithJanedigminecraft. com6000FergusonSamanthabighoạt động. com7000ReynoldsAllenkiểm tra toán học của bạn. com8000AndersonPaigeNULL9000JohnsonDerektechonthenet. com
Và một bảng gọi là đơn đặt hàng với dữ liệu sau
order_idcustomer_idorder_date170002016/04/18250002016/04/18380002016/04/19440002016/04/205NULL2016/05/01
Nhập câu lệnh SQL sau
Thử điSELECT * FROM customers WHERE NOT EXISTS [SELECT * FROM orders WHERE customers.customer_id = orders.customer_id];
Sẽ có 2 bản ghi được chọn. Đây là những kết quả mà bạn sẽ thấy
customer_idlast_namefirst_namefavorite_website6000FergusonSamanthabigactivities. com9000JohnsonDerektechonthenet. com
Ví dụ này sẽ trả về tất cả các bản ghi từ bảng khách hàng khi không có bản ghi nào trong bảng đơn đặt hàng cho customer_id đã cho