Chuyển đến nội dung chính

Toán tử SQL NOT IN: Hướng dẫn toàn diện cho người mới bắt đầu

Thành thạo toán tử NOT IN của SQL với hướng dẫn cho người mới bắt đầu này. Học cách lọc dữ liệu hiệu quả, tránh các lỗi thường gặp và khám phá những phương án thay thế tối ưu
· 5 phút đọc

Khám phá cùng AI

Trong lĩnh vực phân tích và quản lý dữ liệu, SQL (Structured Query Language) là công cụ then chốt để truy cập và thao tác với hệ thống cơ sở dữ liệu. Trong số nhiều chức năng của SQL, toán tử NOT IN là một cách mạnh mẽ để lọc tập dữ liệu, cho phép bạn loại trừ các hàng khớp với một danh sách giá trị xác định. Hướng dẫn này được xây dựng nhằm giúp người mới và các nhà thực hành dữ liệu hiểu rõ toán tử NOT IN, đảm bảo cách áp dụng minh bạch và nắm được những rủi ro tiềm ẩn.

Vì sao dùng NOT IN?

Tập trung vào toán tử NOT IN xuất phát từ tính hữu dụng của nó trong các tình huống loại trừ dữ liệu. Dù bạn đang làm sạch dữ liệu, chuẩn bị báo cáo hay thực hiện phân tích phức tạp, việc hiểu cách loại trừ hiệu quả các điểm dữ liệu cụ thể là vô giá. Toán tử này có cú pháp đơn giản nhưng đi kèm những sắc thái có thể ảnh hưởng đến hiệu năng và độ chính xác.

Chúng tôi đi sâu khám phá NOT IN để mang đến cái nhìn toàn diện, giúp bạn sử dụng hiệu quả trong các truy vấn SQL.

Tìm hiểu SQL NOT IN

Những điều cơ bản về NOT IN

Toán tử NOT IN được dùng trong mệnh đề WHERE để loại trừ các hàng mà giá trị của cột xác định trùng với bất kỳ giá trị nào trong một danh sách cho trước. Cú pháp cơ bản như sau:

SELECT column_names
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);

Cú pháp này làm nổi bật vai trò của toán tử trong việc lọc dữ liệu — một bước quan trọng trong phân tích dữ liệu và quản trị cơ sở dữ liệu.

Ứng dụng thực tế của NOT IN

Hãy xét một cơ sở dữ liệu có bảng thông tin khách hàng. Nếu bạn muốn chọn những khách hàng không đến từ một số thành phố nhất định, NOT IN là công cụ vô cùng hữu ích, giúp bạn dễ dàng loại trừ các thành phố đó khỏi kết quả.

Ví dụ NOT IN theo từng bước

Ví dụ 1: Loại trừ các giá trị cụ thể

Giả sử có bảng Customers với các cột CustomerID, CustomerName và City. Để tìm khách hàng không ở 'New York' hoặc 'Los Angeles', truy vấn sẽ là:

CustomerlD

CustomerName

City

1

John Doe

New York

2

Jane Smith

Los Angeles

3

Emily Jones

Chicago

4

Chris Brown

Miami

5

Alex Johnson

San Francisco

6

Jessica White

New York

Bảng Customers

SELECT CustomerName, City
FROM Customers
WHERE City NOT IN ('New York', 'Los Angeles');

CustomerName

City

Emily Jones

Chicago

Chris Brown

Miami

Alex Johnson

San Francisco

Ví dụ 2: Dùng NOT IN với truy vấn con

NOT IN cũng có thể hoạt động với truy vấn con. Ví dụ, để tìm các sản phẩm chưa từng được đặt hàng:

ProductID

ProductName

1

Apple

2

Banana

3

Orange

4

Pear

5

Grape

Bảng Products

OrderID

ProductID

101

2

102

4

103

2

104

3

Bảng Orders

SELECT ProductName
FROM Products
WHERE ProductID NOT IN (
  SELECT ProductID
  FROM Orders
);

ProductName

Apple

Grape

Các lỗi thường gặp và cách tránh

Xử lý giá trị NULL

Một vấn đề phổ biến với NOT IN xảy ra khi danh sách giá trị chứa NULL. Vì NULL đại diện cho giá trị không xác định, mọi phép so sánh với NULL bằng NOT IN sẽ không trả về hàng nào, ngay cả khi có những hàng lẽ ra phải bị loại trừ.

Để khắc phục, hãy đảm bảo danh sách giá trị không chứa NULL hoặc dùng cách tiếp cận khác như NOT EXISTS.

Ví dụ:

Giả sử chúng ta có bảng Orders với cột CustomerID, trong đó một số giá trị là NULL để biểu thị đơn của khách vãng lai. Nếu bạn chạy truy vấn tìm các đơn không do một số khách hàng nhất định tạo, việc đưa NULL vào danh sách sẽ khiến truy vấn không trả về kết quả nào.

OrderID

CustomerID

101

3

102

4

103

2

104

 

106

1

Bảng Orders

-- Assume we want to exclude CustomerID 1, 2, and unknown (NULL) customers
SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2, NULL);

Truy vấn này sẽ không trả về hàng nào, điều này có thể không đúng với mong muốn của bạn.

Giải pháp: Để có kết quả chính xác, tránh đưa NULL vào danh sách cho NOT IN. Hoặc, kết hợp NOT IN cho các giá trị xác định và IS NOT NULL để xử lý NULL hiệu quả.

SELECT OrderID
FROM Orders
WHERE CustomerID NOT IN (1, 2) AND CustomerID IS NOT NULL;

OrderID

101

102

Cân nhắc về hiệu năng

Với tập dữ liệu lớn hoặc truy vấn con, NOT IN có thể kém hiệu quả hơn các lựa chọn như NOT EXISTS hoặc LEFT JOIN /IS NULL. Sự kém hiệu quả bắt nguồn từ việc NOT IN so sánh từng hàng trong bảng với từng giá trị trong danh sách, có thể dẫn đến hiệu năng chậm trên dữ liệu lớn.

Các phương án thay thế SQL NOT IN

Dùng NOT EXISTS

NOT EXISTS thường được khuyến nghị hơn NOT IN khi làm việc với truy vấn con có thể trả về giá trị NULL. Nó thường hiệu quả hơn vì dừng ngay khi tìm thấy kết quả khớp.

Ví dụ:

Để tìm các sản phẩm chưa từng được đặt hàng, dùng NOT EXISTS:

SELECT ProductName
FROM Products p
WHERE NOT EXISTS (
  SELECT 1
  FROM Orders o
  WHERE o.ProductID = p.ProductID
);

ProductName

Apple

Grape

Truy vấn này kiểm tra sự không tồn tại của sản phẩm trong bảng đơn hàng, có thể hiệu quả hơn so với việc so sánh với một danh sách ID tiềm ẩn rất lớn bằng NOT IN.

LEFT JOIN / IS NULL

Một phương án hiệu quả khác để loại trừ hàng là dùng LEFT JOIN kết hợp với mệnh đề WHERE ... IS NULL. Cách này đặc biệt hữu dụng với tập dữ liệu lớn.

Ví dụ:

Để đạt cùng mục tiêu tìm sản phẩm chưa có đơn hàng:

SELECT p.ProductName
FROM Products p
LEFT JOIN Orders o ON p.ProductID = o.ProductID
WHERE o.ProductID IS NULL;

ProductName

Apple

Grape

Phương pháp này tận dụng LEFT JOIN để bao gồm tất cả sản phẩm và các đơn hàng khớp (nếu có), sau đó lọc ra những sản phẩm có đơn bằng WHERE o.ProductID IS NULL, từ đó hiệu quả loại trừ chúng.

Thực hành tốt khi dùng NOT IN

  • Kiểm tra danh sách có giá trị NULL: Đảm bảo danh sách dùng trong NOT IN không chứa NULL để tránh kết quả ngoài ý muốn.
  • Cân nhắc kích thước dữ liệu: Với tập dữ liệu lớn hoặc truy vấn con, đánh giá xem các lựa chọn như NOT EXISTS có thể mang lại hiệu năng tốt hơn hay không.
  • Đánh chỉ mục: Nếu có thể, hãy đánh chỉ mục cho các cột dùng trong mệnh đề NOT IN để cải thiện hiệu năng truy vấn.

Dùng NOT IN trong dự án dữ liệu thực tế

Trong phân tích dữ liệu, lệnh SQL "Not IN" thường được dùng để truy xuất dữ liệu cụ thể. Ở phần này, chúng ta sẽ làm việc với cơ sở dữ liệu hiệu sách theo dõi tồn kho (sách hiện có trong cửa hàng) và doanh số (sách đã bán). Mục tiêu là xác định những cuốn sách chưa từng được bán.

Chúng ta có hai bảng:

  • Inventory: lưu thông tin về sách trong hiệu sách.
  • Sales: lưu bản ghi các sách đã bán.

image4.png

Bảng Inventory

image3.png

Bảng Sales

Giờ đây, chúng ta muốn tìm những cuốn sách chưa từng được bán.

SELECT Title, Author 
FROM Inventory 
WHERE BookID NOT IN (
    SELECT BookID 
    FROM Sales
);

image1.png

Tiếp theo, chúng ta muốn xác định các sách trong tồn kho chưa được bán trong tháng vừa qua, giả sử hôm nay là ngày 7 tháng 2 năm 2024. Việc này cần kiểm tra SaleDate trong bảng Sales so với ngày hiện tại.

SELECT Title, Author 
FROM Inventory 
WHERE BookID NOT IN (
    SELECT BookID 
    FROM Sales
    WHERE SaleDate >= date('now', '-1 month')
);

image2.png

Kết luận

Toán tử NOT IN là công cụ linh hoạt trong SQL để loại trừ các giá trị cụ thể khỏi kết quả truy vấn. Bằng cách hiểu cú pháp, ứng dụng thực tế và các rủi ro tiềm ẩn, bạn có thể sử dụng hiệu quả toán tử này trong các tác vụ thao tác dữ liệu.

Hãy lưu ý các giá trị NULL và kích thước tập dữ liệu để tối ưu hiệu năng và độ chính xác của truy vấn. Khi quen thuộc hơn với NOT IN, bạn sẽ thấy đây là bổ sung vô cùng giá trị cho bộ công cụ SQL của mình, giúp phân tích và quản lý dữ liệu chính xác, hiệu quả hơn.

Bạn có thể tìm hiểu thêm về NOT IN và NOT EXISTS trong khóa học Improving Query Performance in SQL Server và khám phá các toán tử SQL cùng nhiều nội dung khác trong SQL Basics Cheat Sheet và SQL Fundamentals skill track.

Abid Ali Awan

Tác giả

Abid Ali Awan

Là một nhà khoa học dữ liệu được chứng nhận, tôi đam mê tận dụng công nghệ tiên tiến để tạo ra các ứng dụng học máy đổi mới. Với nền tảng vững chắc về nhận dạng giọng nói, phân tích và báo cáo dữ liệu, MLOps, AI hội thoại và NLP, tôi đã rèn giũa kỹ năng phát triển các hệ thống thông minh có thể tạo ra tác động thực sự. Bên cạnh chuyên môn kỹ thuật, tôi cũng là một người truyền đạt tốt, có khả năng chắt lọc các khái niệm phức tạp thành ngôn ngữ rõ ràng, súc tích. Nhờ đó, tôi trở thành một blogger được nhiều người quan tâm trong lĩnh vực khoa học dữ liệu, chia sẻ góc nhìn và kinh nghiệm với cộng đồng các chuyên gia dữ liệu ngày càng lớn. Hiện tại, tôi tập trung vào sáng tạo và biên tập nội dung, làm việc với các mô hình ngôn ngữ lớn để phát triển nội dung mạnh mẽ và hấp dẫn, giúp doanh nghiệp và cá nhân tận dụng tối đa dữ liệu của mình.

Chủ đề

Liên quan