Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

ทำไม MySQL ประเมิน "TRUE OR TRUE AND FALSE" เป็น TRUE

คำตอบสั้น

เพราะตัวดำเนินการ 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, COLLATEType conversion
2!Logical NOT
3- (Unary), ~Unary minus, Bitwise NOT
4^, *Bitwise XOR, Multiplication
5/, DIV, %, MODDivision
6+, -Addition, Subtraction
7<<, >>Bitwise Shift
8&Bitwise AND
9|Bitwise OR
10=, <=>, >=, >, <=, <, <>, !=, IS, LIKE, REGEXP, INComparison
11&&, ANDLogical AND
12||, ORLogical OR
13XORLogical 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)