Điều gì xảy ra nếu bạn cập nhật một bản ghi không tồn tại SQL?

Đ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 ứng

Ghi 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

Thử đi
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_category150250350450575810

Ví 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[*]1

Ví 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ử đi
SELECT *
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

Điều gì sẽ xảy ra với câu lệnh cập nhật thiếu mệnh đề WHERE?

Nếu bạn không sử dụng mệnh đề WHERE trong câu lệnh CẬP NHẬT, tất cả các bản ghi trong bảng sẽ được cập nhật .

Được sử dụng khi chúng ta phải cập nhật hoặc thay đổi dữ liệu hiện có trong một tập hợp các bản ghi?

Truy vấn CẬP NHẬT SQL được sử dụng để sửa đổi các bản ghi hiện có trong một bảng. Chúng ta có thể sử dụng mệnh đề WHERE với truy vấn CẬP NHẬT để cập nhật các hàng đã chọn, nếu không thì tất cả các hàng sẽ bị ảnh hưởng.

Điều gì sẽ xảy ra nếu hai người đang cập nhật cùng một bản ghi trong một bảng cùng một lúc?

Nếu có nhiều người dùng chỉnh sửa một dòng cùng lúc với người dùng khác họ có thể nhận được "Mất cập nhật" . Có hai giải pháp để giải quyết vấn đề này. Bạn có thể khóa một hàng bằng dbms_lock và đợi cam kết của người dùng giữ khóa.

Làm cách nào để biết một bản ghi đã tồn tại trong cơ sở dữ liệu hay chưa nếu nó không chèn một bản ghi mới?

Đầu tiên, chúng tôi kiểm tra xem bản ghi có tồn tại với từ khóa EXISTS hay không . EXISTS thực thi truy vấn mà chúng tôi yêu cầu [SELECT ] và trả về một giá trị boolean. Nếu nó tìm thấy bản ghi, chúng tôi trả về 'Bản ghi này đã tồn tại. '

Chủ Đề