0

Trino SQL Bài học 8: Toán tử logic, so sánh và toán tử IN, BETWEEN

Mục tiêu bài học:

  • Nắm vững cách kết hợp nhiều điều kiện lọc phức tạp bằng các toán tử logic.

  • Hiểu thứ tự ưu tiên của các phép toán để tránh sai sót logic.

  • Sử dụng thành thạo IN và BETWEEN để viết truy vấn ngắn gọn, tối ưu và dễ đọc hơn thay vì lạm dụng OR và >= / <=.

1. Toán tử so sánh (Comparison Operators)

Toán tử so sánh dùng để đối chiếu hai giá trị, luôn trả về kết quả kiểu BOOLEAN (TRUE, FALSE, hoặc UNKNOWN nếu có giá trị NULL).

Trino hỗ trợ tập toán tử chuẩn SQL:

  • Bằng: =

  • Khác (Không bằng): <> hoặc !=

  • Lớn hơn / Nhỏ hơn: >, <

  • Lớn hơn hoặc bằng / Nhỏ hơn hoặc bằng: >=, <=

Ví dụ: Lọc các khách hàng có số dư tài khoản âm.

SQL

SELECT custkey, name, acctbal
FROM tpch.tiny.customer
WHERE acctbal < 0;

2. Toán tử Logic (AND, OR, NOT)

Trong thực tế, bạn hiếm khi chỉ lọc dữ liệu bằng một điều kiện duy nhất. Toán tử logic giúp bạn ghép nối nhiều điều kiện lại với nhau.

A. AND (Và)

Tất cả các điều kiện phải là TRUE thì kết quả mới là TRUE.

SQL

-- Tìm đơn hàng khẩn cấp (URGENT) có giá trị lớn hơn 200,000
SELECT orderkey, totalprice, orderpriority
FROM tpch.tiny.orders
WHERE orderpriority = '1-URGENT' 
  AND totalprice > 200000;

B. OR (Hoặc)

Chỉ cần ít nhất một điều kiện là TRUE thì kết quả sẽ là TRUE.

SQL

-- Tìm khách hàng thuộc phân khúc MACHINERY hoặc AUTOMOBILE
SELECT custkey, name, mktsegment
FROM tpch.tiny.customer
WHERE mktsegment = 'MACHINERY' 
   OR mktsegment = 'AUTOMOBILE';

C. NOT (Phủ định)

Đảo ngược kết quả của điều kiện: TRUE thành FALSE và ngược lại.

SQL

-- Tìm các đơn hàng KHÔNG PHẢI trạng thái 'F' (Finished)
SELECT orderkey, orderstatus
FROM tpch.tiny.orders
WHERE NOT orderstatus = 'F';
-- Lưu ý: Cách viết này tương đương với WHERE orderstatus <> 'F'

D. Thứ tự ưu tiên (Precedence)

Quy tắc sống còn khi viết SQL: NOT được xử lý đầu tiên, sau đó đến AND, và cuối cùng là OR.

Lỗi logic phổ biến: Bạn muốn tìm khách hàng ở nhóm BUILDING hoặc FURNITURE, và phải có số dư lớn hơn 1000.

SQL

-- CÚ PHÁP SAI LOGIC: 
WHERE mktsegment = 'BUILDING' OR mktsegment = 'FURNITURE' AND acctbal > 1000;

Trino sẽ hiểu câu trên là: Lấy những người (nhóm FURNITURE VÀ dư > 1000) HOẶC (nhóm BUILDING, số dư bao nhiêu cũng lấy).

Cách viết ĐÚNG (luôn dùng Dấu Ngoặc Đơn):

SQL

WHERE (mktsegment = 'BUILDING' OR mktsegment = 'FURNITURE') 
  AND acctbal > 1000;

3. Toán tử IN (Lọc theo tập hợp)

Khi bạn phải dùng quá nhiều toán tử OR cho cùng một cột, truy vấn sẽ trở nên dài dòng và chậm chạp. Mệnh đề IN giúp kiểm tra xem một giá trị có nằm trong một danh sách cho trước hay không.

SQL

-- Thay vì viết: mktsegment = 'BUILDING' OR mktsegment = 'FURNITURE' OR mktsegment = 'MACHINERY'
SELECT custkey, name, mktsegment
FROM tpch.tiny.customer
WHERE mktsegment IN ('BUILDING', 'FURNITURE', 'MACHINERY');

Bạn cũng có thể kết hợp với NOT để loại trừ một danh sách:

SQL

-- Lấy tất cả khách hàng TRỪ 3 nhóm trên
SELECT custkey, name, mktsegment
FROM tpch.tiny.customer
WHERE mktsegment NOT IN ('BUILDING', 'FURNITURE', 'MACHINERY');

Lưu ý nâng cao: IN hoạt động cực kỳ hiệu quả khi danh sách được truyền vào là một tập kết quả của một truy vấn khác (Subquery - Sẽ học ở Bài 36).

4. Toán tử BETWEEN (Lọc theo khoảng)

Tương tự như IN, BETWEEN là một cú pháp viết tắt (syntactic sugar) giúp truy vấn gọn gàng hơn khi cần lọc dữ liệu nằm trong một khoảng.

Quy tắc: BETWEEN có tính chất Bao Hàm (Inclusive). Tức là nó lấy cả 2 giá trị ở biên. A BETWEEN B AND C hoàn toàn tương đương với A >= B AND A <= C.

Sử dụng với kiểu Số:

SQL

-- Tìm khách hàng có số dư từ 1,000 đến 5,000 (Bao gồm cả người có đúng 1,000 và 5,000)
SELECT custkey, name, acctbal
FROM tpch.tiny.customer
WHERE acctbal BETWEEN 1000 AND 5000;

Sử dụng với kiểu Ngày (Date): Đây là trường hợp sử dụng BETWEEN phổ biến nhất trong các bài toán thống kê kinh doanh. Đừng quên ép kiểu ngày tháng bằng tiền tố DATE trong Trino!

SQL

-- Tìm đơn hàng được tạo trong năm 1995
SELECT orderkey, orderdate, totalprice
FROM tpch.tiny.orders
WHERE orderdate BETWEEN DATE '1995-01-01' AND DATE '1995-12-31';

Bạn cũng có thể dùng NOT BETWEEN để lấy các giá trị nằm ngoài khoảng:

SQL

-- Tìm các khoản giảm giá không nằm trong mức tiêu chuẩn (ví dụ chuẩn là 0.02 đến 0.05)
SELECT orderkey, discount
FROM tpch.tiny.lineitem
WHERE discount NOT BETWEEN 0.02 AND 0.05;

Cạm bẫy với giá trị NULL: Nếu bất kỳ giá trị nào trong các phép toán =, <>, >,< hoặc trong tập IN, BETWEEN là một giá trị NULL (không xác định), toàn bộ kết quả của biểu thức đó sẽ bị đánh giá là UNKNOWN (trượt màng lọc WHERE). Xử lý NULL là một nghệ thuật trong SQL.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí