Toán tử IN trong MySQL

Toán tử IN trong MySQL
Toán tử IN trong MySQL

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

Toán tử IN trong MySQL được sử dụng trong mệnh đề WHERE, nếu giá trị của cột giống với một phần tử trong chuỗi thì thỏa điều kiện, mỗi phần tử trong toán tử in được tách nhau bằng dấu phẩy.

Code Toán tử IN trong MySQL

select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 in(1,2);
select ten,tenkhongdau,tenchaythu,id from #_tintuc where (id_cat1='$idcap2' or $idcap2 in(chathem)) and hienthi=1 order by tenchaythu asc;
select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 in(1,3);
<?php
   $dbhost = 'localhost';
   $dbuser = 'webmoi_userdata'; // Tên username
   $dbpass = 'xgZwEfQWE'; // 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());
   }
   // Chọn tên database
   mysql_select_db('webmoi_tendata');
   // Xét kiểu tiếng việt 
   mysql_query('SET NAMES "utf8"');
   
   // id_cha1 in(1,2)
   echo "<b>id_cha1 in(1,2)</b><br>";
   $sql ="select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 in(1,2)"; 
   // $sql="select ten,tenkhongdau,tenchaythu,id from #_tintuc where (id_cat1='$idcap2' or $idcap2 in(chathem)) and hienthi=1 order by tenchaythu asc"; 
   // chathem chứa nhiều id_cat1, ví dụ: 4,2,5
   $ketquamot = mysql_query($sql,$conn);
   if(!$ketquamot){
	  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($ketquamot, MYSQL_ASSOC)){
		 echo "ID: {$row['id']} <br> ".
		 "ID Cha cấp một: {$row['id_cha1']} <br> ".
		 "Hiển thị: {$row['hienthi']} <br> ".
         "Tên sản phẩm: {$row['ten']} <br> ".
         "Giá : {$row['gia']} <br> ".
         "--------------------------------<br>";
   }
   // id_cha1 in(1,3)
   echo "<b>id_cha1 in(1,3)</b><br>";
   $sql ="select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 in(1,3)";
   $ketquahai = mysql_query($sql,$conn);
   if(!$ketquahai){
	  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($ketquahai, MYSQL_ASSOC)){
		 echo "ID: {$row['id']} <br> ".
		 "ID Cha cấp một: {$row['id_cha1']} <br> ".
		 "Hiển thị: {$row['hienthi']} <br> ".
         "Tên sản phẩm: {$row['ten']} <br> ".
         "Giá : {$row['gia']} <br> ".
         "--------------------------------<br>";
   }
   // Đóng kết nối database
   mysql_close($conn);
?>

Kết quả:

id_cha1 in(1,2)
ID: 1
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure FE12 thương hiệu Đức
Giá : 55000000
--------------------------------
ID: 2
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure TD12 mới nhất
Giá : 44550000
--------------------------------
ID: 3
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn âm thanh nghe nhạc AV01
Giá : 25000000
--------------------------------
ID: 4
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn âm thanh nghe nhạc AV02
Giá : 30000000
--------------------------------
ID: 6
ID Cha cấp một: 2
Hiển thị: 1
Tên sản phẩm: Micro Shure SM58-LC
Giá : 2700000
--------------------------------
ID: 7
ID Cha cấp một: 2
Hiển thị: 1
Tên sản phẩm: Micro AKG D7 S
Giá : 3400000
--------------------------------
id_cha1 in(1,3)
ID: 1
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure FE12 thương hiệu Đức
Giá : 55000000
--------------------------------
ID: 2
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure TD12 mới nhất
Giá : 44550000
--------------------------------
ID: 3
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn âm thanh nghe nhạc AV01
Giá : 25000000
--------------------------------
ID: 4
ID Cha cấp một: 1
Hiển thị: 1
Tên sản phẩm: Dàn âm thanh nghe nhạc AV02
Giá : 30000000
--------------------------------

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

Toán tử IN phát huy hiệu quả khi truy vấn cần kiểm tra một cột có thuộc nhiều giá trị hay không. Thay vì viết nhiều điều kiện lặp lại, IN giúp câu lệnh MySQL ngắn gọn, dễ đọc và thuận tiện hơn khi mở rộng danh sách giá trị cần lọc.

Kết hợp IN với WHERE để lọc nhiều giá trị

Khi cần lấy các bản ghi có giá trị thuộc một nhóm xác định, IN có thể đặt trực tiếp trong mệnh đề WHERE. Cách viết này đặc biệt phù hợp với các trường hợp lọc theo nhiều mã, trạng thái hoặc nhóm dữ liệu.

SELECT *
FROM products
WHERE category_id IN (2, 5, 8);

Truy vấn trên chỉ trả về những sản phẩm có category_id bằng 2, 5 hoặc 8. Khi cần bổ sung giá trị, chỉ việc thêm vào danh sách trong IN mà không phải tạo thêm nhiều điều kiện riêng.

Sử dụng IN với truy vấn SELECT và dữ liệu động

IN không chỉ nhận một danh sách giá trị cố định mà còn có thể kết hợp với truy vấn con. Đây là cách hữu ích khi danh sách cần kiểm tra được lấy từ một bảng khác và có thể thay đổi theo dữ liệu thực tế.

SELECT *
FROM products
WHERE category_id IN (
    SELECT id
    FROM categories
    WHERE status = 1
);

Trong ví dụ này, MySQL trước tiên xác định các danh mục đang hoạt động, sau đó lấy sản phẩm thuộc những danh mục đó. Cách làm này giúp tránh phải tự xây dựng danh sách giá trị trước khi thực hiện truy vấn.

Kết hợp IN với AND, OR để tạo điều kiện lọc

IN có thể kết hợp với AND hoặc OR để xây dựng điều kiện phức tạp hơn. Khi dùng OR cùng nhiều điều kiện, nên đặt nhóm điều kiện trong dấu ngoặc để kiểm soát chính xác logic mà truy vấn cần thực hiện.

SELECT *
FROM products
WHERE category_id IN (2, 5, 8)
  AND status = 1;

Câu lệnh trên chỉ lấy sản phẩm thuộc một trong ba danh mục và đồng thời đang có trạng thái bằng 1. Nếu kết hợp nhiều điều kiện OR, việc sử dụng dấu ngoặc sẽ giúp câu lệnh rõ ràng và hạn chế kết quả sai do thứ tự ưu tiên của các toán tử.

Thay thế nhiều điều kiện OR bằng IN

Khi nhiều điều kiện OR cùng kiểm tra một cột với các giá trị khác nhau, IN thường là lựa chọn gọn hơn. Cách viết này làm giảm phần mã lặp và giúp người đọc nhanh chóng nhận ra nhóm giá trị đang được lọc.

SELECT *
FROM users
WHERE role = 'admin'
   OR role = 'editor'
   OR role = 'author';

Có thể viết lại bằng IN như sau:

SELECT *
FROM users
WHERE role IN ('admin', 'editor', 'author');

Hai cách đều hướng tới cùng một nhóm giá trị, nhưng IN phù hợp hơn khi các điều kiện chỉ khác nhau ở giá trị của cùng một cột.

Lưu ý khi sử dụng IN với tập dữ liệu lớn

IN rất tiện lợi nhưng không nên mặc định rằng danh sách càng dài thì truy vấn vẫn hoạt động hiệu quả như nhau. Với lượng giá trị lớn, cần chú ý đến cách dữ liệu được truy vấn và khả năng sử dụng chỉ mục của cột liên quan.

Nếu danh sách giá trị quá lớn hoặc được lấy từ một bảng khác, truy vấn con hoặc phép JOIN có thể phù hợp hơn việc đưa hàng nghìn giá trị trực tiếp vào IN. Cột thường xuyên được dùng để lọc cũng nên được xem xét về chỉ mục để giảm lượng dữ liệu MySQL phải xử lý.

SELECT p.*
FROM products AS p
JOIN categories AS c
    ON p.category_id = c.id
WHERE c.status = 1;

Vì vậy, IN nên được lựa chọn dựa trên quy mô dữ liệu và mục đích truy vấn. Với danh sách nhỏ, IN giúp câu lệnh rõ ràng; với dữ liệu lớn, nên kiểm tra kế hoạch thực thi và cân nhắc cấu trúc truy vấn phù hợp hơn.

Lời kết

Cảm ơn các bạn đã tham khảo bài viết Toán tử IN 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
Trần Thị Vân | Content Creator Web Mới
Trần Thị Vân
Trần Thị Vân là Content Creator tại Web Mới, phụ trách nghiên cứu, biên soạn nội dung và chia sẻ kiến thức về website, SEO, lập trình cùng các xu hướng công nghệ
Đánh giá
Chia sẻ nội dung đánh giá của bạn về Toán tử IN 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) !