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

MySQL: ใช้ Expression เต็มรูปแบบใน WHERE Clause

การใช้ Expression (นิพจน์) เต็มรูปแบบใน WHERE Clause ของ MySQL

MySQL อนุญาตให้ใช้ expression (การคำนวณ/ฟังก์ชัน) ใน WHERE clause ได้โดยตรง — ไม่ต้องคำนวณไว้ใน SELECT หรือ subquery ก่อน

สร้างตารางและข้อมูล

mysql> create table DemoTable1406 (
    -> Value int
    -> );
Query OK, 0 rows affected (0.47 sec)

mysql> insert into DemoTable1406 values(10);
mysql> insert into DemoTable1406 values(50);
mysql> insert into DemoTable1406 values(40);
mysql> insert into DemoTable1406 values(30);

ข้อมูลทั้งหมด

+-------+
| Value |
+-------+
| 10    |
| 50    |
| 40    |
| 30    |
+-------+

คำสั่ง WHERE ใช้ Expression โดยตรง

mysql> select Value + 10 as ExpectedValue
    -> from DemoTable1406
    -> where Value + 10 = 40;

ผลลัพธ์

+---------------+
| ExpectedValue |
+---------------+
| 40            |
+---------------+

อธิบาย

  • Value + 10 = 40 — เงื่อนไขกรอง: ค่า Value ที่บวก 10 แล้วได้ 40 (คือ Value = 30)
  • Value + 10 as ExpectedValue — SELECT expression เดียวกัน พร้อม alias
  • MySQL ประเมิน expression ใน WHERE ก่อน แล้วค่อย SELECT

Expression ที่ใช้ได้ใน WHERE

  • คณิตศาสตร์: col + 10, col * 2, col / 3
  • ฟังก์ชันสตริง: UPPER(name), SUBSTRING(col, 1, 5), CONCAT(a, b)
  • ฟังก์ชันวันที่: DATE_ADD(date, INTERVAL 1 DAY), YEAR(date)
  • CASE WHEN: CASE WHEN status = 1 THEN 'active' ELSE 'inactive' END = 'active'

ประสิทธิภาพ: SARGable vs Non-SARGable

SARGable (ใช้ Index ได้)Non-SARGable (ไม่ใช้ Index)
WHERE date_col > '2023-01-01'WHERE YEAR(date_col) > 2023
WHERE name LIKE 'John%'WHERE UPPER(name) = 'JOHN'
WHERE id = 100WHERE id + 0 = 100

แนวทาง: เขียนเงื่อนไขให้คอลัมน์อยู่ด้านซ้าย "เปล่าๆ" ไม่ห่อหุ้มฟังก์ชัน เพื่อให้ optimizer ใช้ index ได้

ใช้ Alias ใน WHERE? ไม่ได้

-- ผิด: ไม่สามารถใช้ alias ใน WHERE ระดับเดียวกัน
SELECT Value + 10 AS v10 FROM t WHERE v10 = 40;  -- ERROR

-- ถูก: ใช้ subquery หรือ CTE
SELECT v10 FROM (SELECT Value + 10 AS v10 FROM t) sub WHERE v10 = 40;

-- หรือ MySQL 8.0+ ใช้ CTE
WITH cte AS (SELECT Value + 10 AS v10 FROM t) SELECT v10 FROM cte WHERE v10 = 40;