การค้นหาค่าที่ลงท้ายด้วยรูปแบบเฉพาะโดยใช้ LIKE และ % (Wildcard)
ใน MySQL ใช้ตัวอักษร % (Percent sign) เป็น Wildcard แทน "อักขระใดๆ จำนวนเท่าไรก็ได้" ร่วมกับคำสั่ง LIKE เพื่อค้นหารูปแบบข้อความ
รูปแบบการค้นหาลงท้าย
WHERE column_name LIKE '%ending_pattern'
% หมายถึง "ข้อความอะไรก็ได้ก่อนหน้า" และตามด้วยรูปแบบที่ต้องการให้ลงท้าย
ตัวอย่าง: ค้นหาตัวเลขที่ลงท้ายด้วย 8
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable (
Number INT
);
INSERT INTO DemoTable VALUES (189);
INSERT INTO DemoTable VALUES (178);
INSERT INTO DemoTable VALUES (876);
INSERT INTO DemoTable VALUES (784);
INSERT INTO DemoTable VALUES (988);
2. ดูข้อมูลทั้งหมด
SELECT * FROM DemoTable;
ผลลัพธ์:
+--------+
| Number |
+--------+
| 189 |
| 178 |
| 876 |
| 784 |
| 988 |
+--------+
3. ค้นหาค่าที่ลงท้ายด้วย 8
SELECT * FROM DemoTable WHERE Number LIKE '%8';
ผลลัพธ์:
+--------+
| Number |
+--------+
| 178 |
| 988 |
+--------+
รูปแบบ Wildcard อื่นๆ
| รูปแบบ | ความหมาย | ตัวอย่างจับคู่ |
|---|---|---|
%text | ลงท้ายด้วย text | 'abc', 'xyztext' |
text% | ขึ้นต้นด้วย text | 'textabc', 'text' |
%text% | มี text อยู่ที่ไหนก็ได้ | 'atextb', 'text', 'mytext' |
_text | ตัวอักษรเดียว + text (ลงท้าย) | 'atext', '1text' |
text_ | text + ตัวอักษรเดียว (ขึ้นต้น) |
การค้นหาสตริง (ข้อความ)
-- ชื่อที่ลงท้ายด้วย 'son'
SELECT * FROM Users WHERE Name LIKE '%son'; -- Johnson, Jackson, Wilson
-- อีเมลที่ลงท้ายด้วย @gmail.com
SELECT * FROM Users WHERE Email LIKE '%@gmail.com';
ข้อควรระวังด้านประสิทธิภาพ
LIKE '%pattern'(ขึ้นต้นด้วย %) ไม่สามารถใช้ Index ได้ → Full Table ScanLIKE 'pattern%'(ลงท้ายด้วย %) ใช้ Index ได้ → เร็วมาก- สำหรับการค้นหาลงท้ายบ่อย ควรพิจารณา:
- เก็บค่าย้อนกลับ (Reversed string) ในคอลัมน์แยก + Index
- ใช้ Full-Text Search (สำหรับข้อความยาว)
- ใช้ Generated Column + Index
ตัวอย่าง Generated Column สำหรับค้นหาลงท้ายเร็ว
ALTER TABLE DemoTable
ADD COLUMN NumberReversed VARCHAR(20)
GENERATED ALWAYS AS (REVERSE(CAST(Number AS CHAR))) STORED,
ADD INDEX idx_reversed (NumberReversed);
-- ค้นหา: ลงท้าย 8 = ขึ้นต้น 8 ในค่าย้อนกลับ
SELECT * FROM DemoTable WHERE NumberReversed LIKE '8%';