Toán tử EXISTS trong MySQL

Toán tử EXISTS trong MySQL
Toán tử EXISTS trong MySQL

Chức năng của Toán tử EXISTS trong MySQL

Toán tử EXISTS trong MySQL dùng để lấy một danh sách thuộc khóa chính ở bảng này có nằm trong một bảng khác và có thể có điều kiện kèm theo.

Code Toán tử EXISTS trong MySQL

Toán tử EXISTS chưa có điều kiện thêm trong MySQL

Ở ví dụ này mình kiểm tra những khách hàng đã từng mua hàng:

select ten,id from tb_khachhang where EXISTS (select * from tb_donhang where tb_donhang.idkhachhang= tb_khachhang.id);
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Truy vấn bảng
   $sql = "select ten,id from tb_khachhang where EXISTS (select * from tb_donhang where tb_donhang.idkhachhang= tb_khachhang.id)";
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ID: {$row['id']} <br> ".
		 "Tên: {$row['ten']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

ID: 1
Tên: Bùi Đan Trúc Quỳnh
--------------------------------
ID: 2
Tên: Nguyễn Thảo Nhật Hạ
--------------------------------

Toán tử EXISTS có điều kiện thêm trong MySQL

Ở ví dụ này mình kiểm tra những khách hàng đã từng mua hàng và idkhachhang>1:

select ten,id from tb_khachhang where EXISTS (select * from tb_donhang where tb_donhang.idkhachhang= tb_khachhang.id and idkhachhang>1);
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'IhNRcn9n'; // Mật khẩu
   // Kết nối đến tên username
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   if(! $conn ){
     die('Không kết nối được: ' . mysql_error());
   }
   // Truy vấn bảng
   $sql = "select ten,id from tb_khachhang where EXISTS (select * from tb_donhang where tb_donhang.idkhachhang= tb_khachhang.id and idkhachhang>1)";
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   // Kết quả truy vấn trả về mảng
   $ketqua = mysql_query($sql,$conn);
   if(!$ketqua){
	  die('Không thể lấy dữ liệu: ' . mysql_error());  
   }
   // Dùng vòng lặp để lấy ra từng hàng trong bảng	
   while($row = mysql_fetch_array($ketqua, MYSQL_ASSOC)){
		 echo "ID: {$row['id']} <br> ".
		 "Tên: {$row['ten']} <br> ".
         "--------------------------------<br>";
   }		 
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

ID: 2
Tên: Nguyễn Thảo Nhật Hạ
--------------------------------

Ứng dụng EXISTS trong các truy vấn MySQL thực tế

EXISTS phát huy hiệu quả khi cần xác định một truy vấn con có trả về ít nhất một bản ghi hay không. Thay vì lấy toàn bộ dữ liệu từ truy vấn phụ, MySQL chỉ cần xác định điều kiện tồn tại có đúng hay không. Cách này đặc biệt phù hợp với các bài toán kiểm tra quan hệ giữa những bảng dữ liệu.

Kiểm tra bản ghi có tồn tại trước khi truy vấn

Một trường hợp phổ biến là kiểm tra khách hàng đã từng phát sinh đơn hàng hay chưa. Có thể dùng EXISTS để chỉ lấy những khách hàng có ít nhất một đơn hàng tương ứng.

SELECT *
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.id
);

Truy vấn con không cần trả về thông tin chi tiết của đơn hàng. Giá trị 1 chỉ đóng vai trò đại diện, còn điều MySQL quan tâm là có bản ghi thỏa điều kiện hay không.

Kết hợp EXISTS với điều kiện WHERE

EXISTS có thể kết hợp với nhiều điều kiện trong WHERE để lọc dữ liệu theo một mối quan hệ cụ thể. Ví dụ, chỉ lấy khách hàng có đơn hàng đang ở trạng thái đã thanh toán:

SELECT *
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.id
      AND o.status = 'paid'
);

Cách viết này giúp điều kiện được đặt ngay tại nơi kiểm tra dữ liệu liên quan, dễ đọc và thuận tiện khi mở rộng thêm các tiêu chí lọc.

Sử dụng EXISTS thay cho một số truy vấn JOIN

Trong trường hợp mục tiêu chỉ là kiểm tra một bản ghi có dữ liệu liên quan, EXISTS có thể là lựa chọn phù hợp hơn JOIN. Với JOIN, kết quả có thể xuất hiện nhiều dòng nếu một bản ghi bên ngoài liên kết với nhiều bản ghi bên trong. EXISTS chỉ quan tâm đến việc có dữ liệu phù hợp.

Ví dụ, để tìm sản phẩm từng xuất hiện trong đơn hàng:

SELECT *
FROM products p
WHERE EXISTS (
    SELECT 1
    FROM order_items oi
    WHERE oi.product_id = p.id
);

Cách tiếp cận này thể hiện đúng mục đích của truy vấn: không lấy thông tin từ order_items, mà chỉ xác định sản phẩm có tồn tại trong bảng liên quan.

Những trường hợp nên và không nên dùng EXISTS

Nên cân nhắc EXISTS khi cần kiểm tra sự tồn tại của dữ liệu liên quan, đặc biệt khi không cần lấy thêm cột từ truy vấn con. Đây cũng là lựa chọn dễ hiểu khi bài toán có dạng “có ít nhất một bản ghi thỏa điều kiện”.

Ngược lại, nếu cần lấy dữ liệu từ cả hai bảng để hiển thị hoặc xử lý, JOIN thường phù hợp hơn. Với truy vấn phức tạp, nên kiểm tra thêm điều kiện lọc và chỉ mục để lựa chọn cách viết có hiệu quả tốt.

Điểm quan trọng là không nên chọn EXISTS chỉ vì cú pháp ngắn. Hãy dựa vào mục đích của truy vấn: nếu câu hỏi chính là “có dữ liệu phù hợp hay không?”, EXISTS thường là cách diễn đạt tự nhiên và rõ ràng.

Lời kết

Cảm ơn các bạn đã tham khảo bài viết Toán tử EXISTS trong MySQL.

Tải file database .sql về nếu muốn kiểm tra hoặc thực hành Tải về.

  • 0 Bình luận
CEO Bùi Tấn Lực | Founder Web Mới
Bùi Tấn Lực
Tìm hiểu về CEO Bùi Tấn Lực, Founder Web Mới với nhiều năm kinh nghiệm trong lĩnh vực phát triển website, SEO và chia sẻ kiến thức công nghệ
Đánh giá
Chia sẻ nội dung đánh giá của bạn về Toán tử EXISTS trong MySQL
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Yêu Cầu Báo Giá
Gửi trang web mẫu cần làm theo, chúng tôi sẽ báo giá đến bạn từ Email (tanlucit09@gmail.com - Bùi Tấn Lực) hoặc Zalo (Lực IT - 0398259259) !