การค้นหาคำในสตริงด้วย LIKE และ CONCAT()
ใช้ LIKE ร่วมกับ CONCAT('%', column, '%') เพื่อตรวจสอบว่าคอลัมน์มีคำ/ข้อความที่ต้องการอยู่ภายในหรือไม่
รูปแบบคำสั่ง
WHERE 'search_word' LIKE CONCAT('%', column_name, '%')
หมายเหตุ: ตัวอย่างนี้ค้นหา "คอลัมน์มีคำที่ต้องการ" (Column contains word) ไม่ใช่ "คำที่ต้องการมีในคอลัมน์"
ตัวอย่าง: ค้นหาว่าคำว่า 'Relational' มีในคอลัมน์ Value หรือไม่
1. สร้างตารางและเพิ่มข้อมูล (แต่ละแถว = 1 คำ)
CREATE TABLE DemoTable (Value TEXT);
INSERT INTO DemoTable VALUES ('MySQL'), ('Is'), ('Relational'), ('Database');
2. ดูข้อมูล
SELECT * FROM DemoTable;
ผลลัพธ์:
+------------+
| Value |
+------------+
| MySQL |
| Is |
| Relational |
| Database |
+------------+
3. ค้นหาแถวที่มีคำ 'Relational'
SELECT Value FROM DemoTable WHERE 'Relational' LIKE CONCAT('%', Value, '%');
ผลลัพธ์:
+------------+
| Value |
+------------+
| Relational |
+------------+
กรณีทั่วไป: ค้นหาข้อความในคอลัมน์ (Column contains text)
ส่วนใหญ่จะเป็นการค้นหา "คอลัมน์มีคำว่า X" ไม่ใช่ "คำ X มีในคอลัมน์":
-- คอลัมน์ Description มีคำ 'MySQL' อยู่ภายใน
SELECT * FROM Articles WHERE Description LIKE '%MySQL%';
-- ใช้ CONCAT สำหรับค่าที่เป็นตัวแปร/พารามิเตอร์
SET @search = 'MySQL';
SELECT * FROM Articles WHERE Description LIKE CONCAT('%', @search, '%');
ฟังก์ชันค้นหาข้อความอื่นๆ
| ฟังก์ชัน/ออเปอเรเตอร์ | คำอธิบาย | Case Sensitive |
|---|---|---|
LIKE | Pattern matching ด้วย % และ _ | ขึ้นกับ Collation (มักเป็น CI = Insensitive) |
NOT LIKE | ตรงข้ามของ LIKE | เหมือน LIKE |
REGEXP / RLIKE | Regular Expression | ขึ้นกับ Collation |
LOCATE(substr, str) | หาตำแหน่งของ substr ใน str (1-based) | ขึ้นกับ Collation |
INSTR(str, substr) | เหมือน LOCATE แต่สลับอาร์กิวเมนต์ | ขึ้นกับ Collation |
FIND_IN_SET(str, strlist) | หา str ในรายการคั่นด้วย comma | Case Insensitive |
Full-Text Search (สำหรับข้อความยาว/จำนวนมาก)
-- สร้าง Fulltext Index
ALTER TABLE Articles ADD FULLTEXT INDEX ft_description (Description);
-- ค้นหา
SELECT * FROM Articles
WHERE MATCH(Description) AGAINST('MySQL' IN NATURAL LANGUAGE MODE);
ประสิทธิภาพ
LIKE '%text%'(ขึ้นต้น %) → Full Table Scan, ไม่ใช้ IndexLIKE 'text%'(ลงท้าย %) → ใช้ Index ได้- Full-Text Index เร็วกว่ามากสำหรับข้อความยาวและค้นหาหลายคำ