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

ใช้ CONCAT() ผนวก Wildcard ใน LIKE Query MySQL

ไวยากรณ์

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 มาก