Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tìm kiếm giữa hai cột trong MySQL với BETWEEN?

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 3 bao 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)