คำตอบสั้น
เพราะตัวดำเนินการ AND มีลำดับความสำคัญ (Precedence) สูงกว่า OR ดังนั้น MySQL ประเมิน AND ก่อน OR เสมอ
กระบวนการประเมินผลแบบขั้นตอน
ขั้นตอนที่ 1: ประเมิน AND ก่อน
TRUE OR TRUE AND FALSE
→ TRUE OR (TRUE AND FALSE) -- เพิ่มวงเล็บตาม Precedence
mysql> SELECT (TRUE AND FALSE);
+------------------+
| (TRUE AND FALSE) |
+------------------+
| 0 | -- FALSE
+------------------+
ขั้นตอนที่ 2: ประเมิน OR
TRUE OR FALSE
→ (TRUE OR FALSE)
mysql> SELECT (TRUE OR FALSE);
+-----------------+
| (TRUE OR FALSE) |
+-----------------+
| 1 | -- TRUE
+-----------------+
ขั้นตอนที่ 3: ตรวจสอบนิพจน์ทั้งหมด
mysql> SELECT (TRUE OR TRUE AND FALSE);
+--------------------------+
| (TRUE OR TRUE AND FALSE) |
+--------------------------+
| 1 |
+--------------------------+
1 row in set (0.00 sec)
ตารางลำดับความสำคัญของตัวดำเนินการใน MySQL (จากสูงไปต่ำ)
| ลำดับ | ตัวดำเนินการ | ประเภท |
|---|---|---|
| 1 (สูงสุด) | INTERVAL, BINARY, COLLATE | Type conversion |
| 2 | ! | Logical NOT |
| 3 | - (Unary), ~ | Unary minus, Bitwise NOT |
| 4 | ^, * | Bitwise XOR, Multiplication |
| 5 | /, DIV, %, MOD | Division |
| 6 | +, - | Addition, Subtraction |
| 7 | <<, >> | Bitwise Shift |
| 8 | & | Bitwise AND |
| 9 | | | Bitwise OR |
| 10 | =, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, IN | Comparison |
| 11 | &&, AND | Logical AND |
| 12 | ||, OR | Logical OR |
| 13 | XOR | Logical XOR |
| 14 | := | Assignment |
| 15 (ต่ำสุด) | = (ใน SET/UPDATE) | Assignment |
แนวทางปฏิบัติที่ดี: ใช้วงเล็บเสมอ
-- ชัดเจน ไม่ต้องจำ Precedence
SELECT (TRUE OR (TRUE AND FALSE)); -- TRUE
SELECT ((TRUE OR TRUE) AND FALSE); -- FALSE
ตัวอย่างเพิ่มเติม
-- FALSE AND TRUE OR TRUE
-- → (FALSE AND TRUE) OR TRUE
-- → FALSE OR TRUE
-- → TRUE
mysql> SELECT FALSE AND TRUE OR TRUE; -- 1 (TRUE)