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

วิธีค้นหาค่าที่ลงท้ายด้วยตัวอักษร/ตัวเลขเฉพาะใน MySQL ด้วย LIKE

การค้นหาค่าที่ลงท้ายด้วยรูปแบบเฉพาะโดยใช้ 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 อื่นๆ

'texta', 'text1'
รูปแบบความหมายตัวอย่างจับคู่
%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 Scan
  • LIKE '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%';