ไวยากรณ์
SELECT * FROM yourTable
WHERE yourColumn LIKE CONCAT('%', yourValue, '%');
ตัวอย่าง: ตาราง demo48
CREATE TABLE demo48 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO demo48 (name) VALUES
('John Smith'), ('John Doe'), ('Adam Smith'),
('David Miller'), ('Chris Brown');
ข้อมูล
+----+--------------+ | id | name | +----+--------------+ | 1 | John Smith | | 2 | John Doe | | 3 | Adam Smith | | 4 | David Miller | | 5 | Chris Brown | +----+--------------+
คำสั่ง: ค้นหาชื่อที่มี "Smith"
SELECT * FROM demo48
WHERE name LIKE CONCAT('%', 'Smith', '%');
ผลลัพธ์
+----+------------+ | id | name | +----+------------+ | 1 | John Smith | | 3 | Adam Smith | +----+------------+
ประโยชน์ของ CONCAT() ใน LIKE
- Dynamic Value: ใช้ตัวแปร/พารามิเตอร์ได้ — ป้องกัน SQL Injection
- Prepared Statement:
WHERE name LIKE CONCAT('%', ?, '%') - อ่านง่าย: แยก wildcard logic ออกจากค่าค้นหา
ตัวอย่างใน Application (Java PreparedStatement)
String sql = "SELECT * FROM demo48 WHERE name LIKE CONCAT('%', ?, '%')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "Smith"); -- ปลอดภัยจาก SQL Injection
กรณีศึกษา: ค้นหาหลายคำ (OR)
SELECT * FROM demo48
WHERE name LIKE CONCAT('%', 'John', '%')
OR name LIKE CONCAT('%', 'Smith', '%');
ประสิทธิภาพ: LIKE นำหน้า %
LIKE '%Smith%' — ไม่ใช้ INDEX ได้ (Full table scan)
หากต้องการค้นหา prefix ให้ใช้ LIKE 'Smith%' (ใช้ INDEX ได้)
ทางเลือกสำหรับ Full-Text Search
-- สร้าง Fulltext Index
ALTER TABLE demo48 ADD FULLTEXT(name);
-- ค้นหา
SELECT * FROM demo48 WHERE MATCH(name) AGAINST('Smith');
เหมาะสำหรับค้นหาข้อความยาว/หลายคำ เร็วกว่า LIKE มาก