Kết hợp AND, OR với dấu ngoặc đơn trong WHERE MySQL
Toán tử AND có độ ưu tiên cao hơn OR. Sử dụng dấu ngoặc đơn () để nhóm điều kiện OR trước khi kết hợp với AND, tránh logic sai.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName VARCHAR(40),
StudentMathMarks INT,
StudentMySQLMarks INT,
status ENUM('ACTIVE','INACTIVE')
);
mysql> INSERT INTO DemoTable (StudentName, StudentMathMarks, StudentMySQLMarks, status) VALUES
('Chris', 45, 67, 'active'),
('Bob', 89, 78, 'inactive'),
('David', 56, 68, 'active'),
('Robert', 68, 75, 'active');
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-----------+-------------+------------------+-------------------+----------+ | StudentId | StudentName | StudentMathMarks | StudentMySQLMarks | status | +-----------+-------------+------------------+-------------------+----------+ | 1 | Chris | 45 | 67 | ACTIVE | | 2 | Bob | 89 | 78 | INACTIVE | | 3 | David | 56 | 68 | ACTIVE | | 4 | Robert | 68 | 75 | ACTIVE | +-----------+-------------+------------------+-------------------+----------+
3. Truy vấn: ACTIVE VÀ (Math=68 HOẶC MySQL=67)
mysql> SELECT * FROM DemoTable
WHERE status = 'active'
AND (StudentMathMarks = 68 OR StudentMySQLMarks = 67);
4. Kết quả
+-----------+-------------+------------------+-------------------+--------+ | StudentId | StudentName | StudentMathMarks | StudentMySQLMarks | status | +-----------+-------------+------------------+-------------------+--------+ | 1 | Chris | 45 | 67 | ACTIVE | | 4 | Robert | 68 | 75 | ACTIVE | +-----------+-------------+------------------+-------------------+--------+
Phân tích logic:
- Chris: ACTIVE ✓, Math=45≠68, MySQL=67=67 ✓ → (FALSE OR TRUE) = TRUE → Chọn
- Bob: INACTIVE ✗ → Loại (không cần kiểm tra điểm)
- David: ACTIVE ✓, Math=56≠68, MySQL=68≠67 → (FALSE OR FALSE) = FALSE → Loại
- Robert: ACTIVE ✓, Math=68=68 ✓ → (TRUE OR ...) = TRUE → Chọn
Quy tắc ưu tiên: AND > OR. Nếu thiếu ngoặc: status='active' AND Math=68 OR MySQL=67 sẽ hiểu là (status='active' AND Math=68) OR MySQL=67 → sai logic.
Best practice: Luôn dùng ngoặc đơn rõ ràng cho nhóm OR ngay cả khi không bắt buộc, để code dễ đọc và tránh bug.