Giải pháp: BETWEEN với cột
BETWEEN không chỉ dùng cho giá trị hằng số, có thể dùng với cột: value BETWEEN col1 AND col2.
Ví dụ minh họa
Tạo bảng điểm số
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Score1 INT,
Score2 INT
);
mysql> INSERT INTO DemoTable(Score1, Score2) VALUES(45, 65);
mysql> INSERT INTO DemoTable(Score1, Score2) VALUES(450, 680);
mysql> INSERT INTO DemoTable(Score1, Score2) VALUES(800, 900);
Dữ liệu gốc
+----+--------+--------+ | Id | Score1 | Score2 | +----+--------+--------+ | 1 | 45 | 65 | | 2 | 450 | 680 | | 3 | 800 | 900 | +----+--------+--------+
Truy vấn: Tìm dòng có 850 nằm giữa Score1 và Score2
mysql> SELECT * FROM DemoTable
-> WHERE 850 BETWEEN Score1 AND Score2;
Kết quả
+----+--------+--------+ | Id | Score1 | Score2 | +----+--------+--------+ | 3 | 800 | 900 | +----+--------+--------+
Giải thích
850 BETWEEN Score1 AND Score2⇔Score1 <= 850 AND Score2 >= 850- Tự động xử lý nếu Score1 > Score2 (trả về FALSE)
- Inclusive: bao gồm cả giá trị bằng Score1 hoặc Score2
Ứng dụng thực tế
Khoảng giá sản phẩm
SELECT * FROM products WHERE 500000 BETWEEN min_price AND max_price;
Khoảng thời gian làm việc
SELECT * FROM shifts WHERE '14:30:00' BETWEEN start_time AND end_time;
Phân đoạn IP (IP range)
SELECT * FROM ip_ranges
WHERE INET_ATON('192.168.1.100') BETWEEN start_ip AND end_ip;
Lưu ý
- Đảm bảo
Score1 <= Score2(dữ liệu sạch) để BETWEEN hoạt động đúng logic - Index trên (Score1, Score2) có thể giúp nếu query phức tạp hơn
- BETWEEN inclusive:
BETWEEN 1 AND 3bao gồm 1, 2, 3
So sánh với cách viết truyền thống
-- Cách 1: BETWEEN (ngắn gọn, đọc dễ) WHERE 850 BETWEEN Score1 AND Score2 -- Cách 2: AND (tương đương) WHERE Score1 <= 850 AND Score2 >= 850 -- Cách 3: Nếu Score1 có thể > Score2 WHERE 850 BETWEEN LEAST(Score1, Score2) AND GREATEST(Score1, Score2)