Toán tử IN trong SQL Server

Ngày đăng: 15/01/2026

Khi làm việc với SQL Server, việc lọc dữ liệu theo nhiều giá trị khác nhau là nhu cầu rất phổ biến. Nếu sử dụng toán tử OR lặp đi lặp lại, câu truy vấn sẽ trở nên dài dòng và khó đọc. Toán tử IN sinh ra để giải quyết vấn đề này – giúp code ngắn gọn, dễ bảo trì hơn. Bài viết này sẽ hướng dẫn chi tiết về toán tử IN và cách áp dụng hiệu quả trong thực tế.

Toán tử IN là gì?

Định nghĩa và vai trò

Toán tử IN là một logical operator (toán tử logic) trong SQL Server cho phép kiểm tra xem một giá trị có khớp với bất kỳ giá trị nào trong một danh sách cho trước hay không. Thay vì phải viết nhiều điều kiện OR lặp đi lặp lại, toán tử IN giúp gom tất cả các giá trị cần so sánh vào một danh sách duy nhất.

Toán tử IN đặc biệt hữu ích khi cần:

  • Lọc dữ liệu theo nhiều giá trị cụ thể.
  • Kết hợp với subquery để lấy dữ liệu động.
  • Tăng hiệu suất đọc code và dễ bảo trì.
  • Giảm độ phức tạp của câu truy vấn.

Cú pháp cơ bản

Cú pháp tổng quát của toán tử IN trong SQL Server:

SELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, value3, ...)

Trong đó:

  • column_name: Cột hoặc biểu thức cần kiểm tra.
  • value1, value2, value3: Danh sách các giá trị để so sánh.
  • Tất cả các giá trị trong danh sách phải cùng kiểu dữ liệu với cột đang kiểm tra.

Kết quả trả về TRUE nếu giá trị trong cột khớp với bất kỳ giá trị nào trong danh sách.

Mối quan hệ giữa IN và OR

Toán tử IN về bản chất tương đương với việc sử dụng nhiều toán tử OR. Ví dụ, hai câu truy vấn sau đây cho kết quả giống nhau:

— Sử dụng IN

WHERE product_color IN ('Red', 'Blue', 'Black')

— Tương đương với OR

WHERE product_color = 'Red' OR product_color = 'Blue' OR product_color = 'Black'

Tuy nhiên, sử dụng IN giúp code ngắn gọn và dễ đọc hơn rất nhiều, đặc biệt khi danh sách giá trị càng dài.

Các cách sử dụng Toán tử IN

Sử dụng IN với danh sách giá trị cố định

Ví dụ với kiểu dữ liệu số

Giả sử bạn có bảng Products chứa thông tin sản phẩm và muốn tìm các sản phẩm có mã từ 10, 20, 30:

SELECT ProductID, ProductName, Price
FROM Products
WHERE ProductID IN (10, 20, 30)

Câu truy vấn này sẽ trả về tất cả sản phẩm có ProductID là 10, 20 hoặc 30.

Ví dụ với kiểu dữ liệu chuỗi

Khi làm việc với text data, toán tử IN cũng hoạt động tương tự:

SELECT EmployeeID, EmployeeName, Department
FROM Employees
WHERE Department IN ('Sales', 'Marketing', 'IT')

Lưu ý rằng với kiểu chuỗi, bạn cần đặt các giá trị trong dấu ngoặc đơn (‘ ‘).

Kết hợp với các điều kiện khác

Bạn hoàn toàn có thể kết hợp toán tử IN với các điều kiện WHERE khác:

SELECT ProductID, ProductName, Price, Category
FROM Products
WHERE Category IN ('Electronics', 'Computers')
AND Price > 500
AND StockQuantity > 0

Sử dụng NOT IN

Toán tử NOT IN cho phép bạn loại trừ các giá trị trong danh sách. Cú pháp:

WHERE column_name NOT IN (value1, value2, value3, ...)

Ví dụ:

SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE OrderStatus NOT IN ('Cancelled', 'Returned', 'Failed')

Câu truy vấn này sẽ lấy tất cả đơn hàng trừ những đơn có trạng thái Cancelled, Returned hoặc Failed.

Sử dụng IN với Subquery

Khái niệm Subquery

Subquery (truy vấn con) là một câu SELECT được lồng bên trong câu truy vấn chính. Khi kết hợp với toán tử IN, subquery sẽ trả về một danh sách các giá trị động thay vì danh sách cố định.

Cú pháp:

SELECT column1, column2
FROM table1
WHERE column_name IN (
  SELECT column_name
  FROM table2
  WHERE condition
)

Ví dụ thực tế với Subquery

Giả sử bạn muốn lấy thông tin các sản phẩm đã được bán trong tháng này:

SELECT ProductID, ProductName, Price
FROM Products
WHERE ProductID IN (
  SELECT DISTINCT ProductID
  FROM OrderDetails
  WHERE MONTH(OrderDate) = MONTH(GETDATE())
    AND YEAR(OrderDate) = YEAR(GETDATE())
)

Trong ví dụ này:

  • Subquery tìm tất cả ProductID có trong OrderDetails của tháng hiện tại.
  • Truy vấn chính lấy thông tin chi tiết của những sản phẩm đó từ bảng Products.

Bên cạnh việc sử dụng toán tử IN với subquery, bạn hoàn toàn có thể viết lại truy vấn trên bằng cách dùng INNER JOIN. Trong nhiều trường hợp, JOIN có thể cho hiệu suất tốt hơn hoặc dễ tối ưu hóa hơn khi bảng lớn.

SELECT DISTINCT p.ProductID, p.ProductName, p.Price
FROM Products AS p
INNER JOIN OrderDetails AS od
  ON p.ProductID = od.ProductID
WHERE MONTH(od.OrderDate) = MONTH(GETDATE())
  AND YEAR(od.OrderDate) = YEAR(GETDATE());

Giải thích:

  • OrderDetails được JOIN với Products dựa trên ProductID.
  • Các điều kiện lọc tháng và năm được áp dụng trực tiếp trên bảng OrderDetails.
  • Dùng DISTINCT để tránh trả về trùng sản phẩm nếu sản phẩm được bán nhiều lần trong tháng.

Lưu ý khi sử dụng Toán tử IN

Xử lý giá trị NULL

Một điểm quan trọng cần lưu ý: nếu danh sách trong toán tử IN chứa giá trị NULL, kết quả có thể trả về UNKNOWN thay vì TRUE hoặc FALSE.

Ví dụ:

SELECT * FROM Products
WHERE ProductColor IN ('Red', 'Blue', NULL);

Trong trường hợp này, các dòng có ProductColor là NULL sẽ không được trả về vì NULL không bằng NULL trong SQL logic.

Hiệu suất và tối ưu hóa

Khi làm việc với danh sách lớn:

  • Toán tử IN thường nhanh hơn việc sử dụng nhiều OR.
  • Tuy nhiên, nếu danh sách giá trị quá dài (hàng trăm giá trị), nên cân nhắc đưa danh sách đó vào một bảng tham chiếu và lọc bằng JOIN. Cách này vừa tối ưu hiệu suất, vừa dễ bảo trì hơn.

Ví dụ: Giả sử bạn có một danh sách 3 phòng ban cần lọc: Sales, Marketing, IT.

Thay vì viết:

SELECT EmployeeID, EmployeeName
FROM Employees
WHERE Department IN ('Sales', 'Marketing', 'IT');

Bạn cho danh sách này vào một bảng nhỏ tên FilterDepartments:

Department
Sales
Marketing
IT

Sau đó lọc bằng JOIN:

SELECT e.EmployeeID, e.EmployeeName
FROM Employees AS e
JOIN FilterDepartments AS f
  ON e.Department = f.Department
  • Khi sử dụng toán tử IN kết hợp subquery, đảm bảo các bảng liên quan được tối ưu hóa với index phù hợp.

Kết luận

Toán tử IN là công cụ hữu ích giúp đơn giản hóa câu truy vấn khi cần lọc dữ liệu theo nhiều giá trị. Thay vì sử dụng nhiều điều kiện OR, toán tử IN giúp code ngắn gọn, dễ đọc và dễ bảo trì hơn. Khi kết hợp với subquery, IN còn mang lại tính linh hoạt cao trong việc truy xuất dữ liệu động. Hãy lưu lại bài viết để áp dụng ngay khi cần nhé!

Chia sẻ bài viết này

Để lại một bình luận

Email 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 *

This site uses Akismet to reduce spam. Learn how your comment data is processed.