Để lọc hàng có giá trị cột nằm trong **khoảng liên tục** (ví dụ: ID từ 3 đến 6), dùng toán tử BETWEEN – ngắn gọn và tối ưu hơn nhiều so với OR hoặc IN liệt kê từng giá trị.
Cú pháp
SELECT cot_1, cot_2 FROM ten_bang WHERE cot_khoa BETWEEN gia_tri_dau AND gia_tri_cuoi;
- Tương đương:
cot_khoa >= gia_tri_dau AND cot_khoa <= gia_tri_cuoi. - Đã bao gồm **cả hai đầu** (inclusive).
- Dùng được cho số, ngày, chuỗi (so sánh theo collation).
Ví dụ minh họa
Tạo bảng sinh viên (ID 1-7):
mysql> CREATE TABLE DemoTable1537 (
-> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName VARCHAR(20)
-> );
mysql> INSERT INTO DemoTable1537(StudentName) VALUES
-> ('Chris'),('Bob'),('Sam'),('Mike'),('David'),('John'),('Carol');
Truy vấn sinh viên ID từ 3 đến 6:
mysql> SELECT StudentName FROM DemoTable1537 WHERE StudentId BETWEEN 3 AND 6;
Kết quả:
+-------------+ | StudentName | +-------------+ | Sam | | Mike | | David | | John | +-------------+
Lưu ý quan trọng
- Thứ tự:
BETWEEN low AND high– low phải ≤ high. Nếu low > high → kết quả rỗng (không báo lỗi). - Kiểu dữ liệu: Đảm bảo cột và giá trị so sánh cùng kiểu (số so số, ngày so ngày). Tránh so sánh chuỗi với số.
- Index:
BETWEENtrên cột có index → **Index Range Scan** (rất nhanh). - NULL: Nếu cột có NULL, hàng NULL **không** được chọn (NULL không so sánh được).
Mở rộng: NOT BETWEEN
SELECT * FROM bang WHERE cot NOT BETWEEN 3 AND 6; -- Lấy ID <3 HOẶC >6
So sánh với IN
IN (3,4,5,6): tương đương nhưng chỉ dùng cho tập giá trị **rời rạc**.BETWEEN 3 AND 6: cho **khoảng liên tục** – optimizer hiểu tốt hơn cho range scan.