Toán tử NOT IN trong MySQL
Trần Thị Vân
- 1155
- 14/08/2025
Chức năng của Toán tử NOT IN trong MySQL
Toán tử NOT IN trong MySQL được sử dụng trong mệnh đề WHERE dùng để lấy những hàng có giá trị của cột không nằm trong các phần tử của toán tử NOT IN.
Code Toán tử NOT IN trong MySQL
select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 NOT IN(2,3);
select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 NOT 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 NOT IN(2,3)
echo "<b>id_cha1 NOT IN(2,3)</b><br>";
$sql ="select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 NOT IN(2,3)";
$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 NOT IN(1,3)
echo "<b>id_cha1 NOT IN(1,3)</b><br>";
$sql ="select hienthi,ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 and id_cha1 NOT 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 NOT IN(2,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
--------------------------------
id_cha1 NOT IN(1,3)
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
--------------------------------
Những lưu ý khi sử dụng NOT IN trong MySQL
NOT IN khá dễ sử dụng khi cần loại bỏ một nhóm giá trị cụ thể, nhưng kết quả có thể khác với mong đợi nếu dữ liệu liên quan chứa NULL. Khi truy vấn phức tạp hơn, việc lựa chọn giữa NOT IN và NOT EXISTS cũng cần được cân nhắc để câu lệnh rõ ràng và an toàn.
NOT IN và giá trị NULL
Đây là điểm cần đặc biệt chú ý khi NOT IN kết hợp với truy vấn con. Nếu danh sách giá trị được so sánh có NULL, MySQL có thể không trả về các hàng mà bạn mong muốn vì phép so sánh với NULL không cho kết quả TRUE hoặc FALSE thông thường.
Ví dụ, nếu cột id_cha trong bảng danh mục có thể chứa NULL, truy vấn sau cần được kiểm tra kỹ:
SELECT id, ten
FROM danh_muc
WHERE id NOT IN (
SELECT id_cha
FROM san_pham
);
Cách an toàn hơn là loại bỏ NULL ngay trong truy vấn con nếu mục đích chỉ là lấy những giá trị thực sự tồn tại:
SELECT id, ten
FROM danh_muc
WHERE id NOT IN (
SELECT id_cha
FROM san_pham
WHERE id_cha IS NOT NULL
);
Vì vậy, khi dùng NOT IN với dữ liệu lấy từ bảng khác, nên kiểm tra khả năng xuất hiện NULL trước khi đánh giá kết quả truy vấn.
Khi nào nên dùng NOT IN thay vì NOT EXISTS
NOT IN phù hợp khi bạn muốn loại trừ một tập giá trị rõ ràng và dữ liệu không chứa NULL gây ảnh hưởng đến phép so sánh. Cú pháp này thường dễ đọc khi danh sách cần loại bỏ ngắn và trực tiếp.
Trong trường hợp kiểm tra sự tồn tại giữa hai bảng, NOT EXISTS thường dễ kiểm soát hơn, đặc biệt khi truy vấn con có điều kiện liên kết với bảng bên ngoài.
SELECT d.id, d.ten
FROM danh_muc AS d
WHERE NOT EXISTS (
SELECT 1
FROM san_pham AS s
WHERE s.id_cha = d.id
);
Cách viết này thể hiện rõ mục tiêu: chỉ lấy danh mục không có sản phẩm liên kết. Khi truy vấn có nhiều điều kiện hoặc liên quan đến dữ liệu có thể chứa NULL, NOT EXISTS thường là lựa chọn đáng cân nhắc.
Kết hợp NOT IN với nhiều điều kiện trong WHERE
NOT IN có thể kết hợp với AND, OR và các điều kiện khác trong WHERE để thu hẹp tập dữ liệu. Khi có nhiều điều kiện, nên dùng dấu ngoặc để thể hiện rõ nhóm điều kiện cần áp dụng và tránh hiểu sai thứ tự ưu tiên của AND và OR.
SELECT id, ten, gia
FROM san_pham
WHERE hienthi = 1
AND id_cha NOT IN (2, 3)
AND gia > 1000000;
Trong ví dụ trên, MySQL chỉ lấy sản phẩm đang được hiển thị, có id_cha không thuộc 2 hoặc 3 và có giá lớn hơn 1.000.000. Việc tách từng điều kiện thành một dòng giúp câu SQL dễ đọc và thuận tiện hơn khi cần bổ sung hoặc chỉnh sửa.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Toán tử NOT 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
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 *