【คำสั่ง LIKE ใน SQL】ฝึกฝนการค้นหาแบบบางส่วน! วิธีใช้ Wildcard '%' และ '_'
ฟังก์ชันการค้นหาเป็นสิ่งจำเป็นสำหรับเว็บไซต์ใช่ไหมครับ? มีหลายครั้งที่คุณต้องการค้นหาข้อมูลที่ไม่ตรงกันทั้งหมด แต่ตรงกันเพียงบางส่วน เช่น "ฉันต้องการค้นหาหนังสือที่มีคำว่า 'SQL'" หรือ "แสดงรายชื่อผู้ใช้ทั้งหมดที่ชื่อขึ้นต้นด้วย 'Suzuki'" การใช้ = (เท่ากับ) ใน WHERE clause จะค้นหาข้อมูลที่ตรงกันทุกประการ แต่จะทำอย่างไรกับการ "ค้นหาแบบคลุมเครือ" หรือ "การค้นหาแบบบางส่วน" เหล่านี้?
คำตอบคือคำสั่ง LIKE ของ SQL ครับ เมื่อใช้ร่วมกับ WHERE clause, LIKE จะช่วยให้คุณสามารถดึงข้อมูลโดยใช้เงื่อนไขการตรงกันบางส่วนของสตริงได้ และสิ่งที่ช่วยเพิ่มความสามารถในการค้นหาอย่างก้าวกระโดดก็คือสัญลักษณ์พิเศษที่เรียกว่า Wildcards (ไวลด์การ์ด) เหมือนกับการ์ดโจ๊กเกอร์ในสำรับไพ่ สัญลักษณ์เหล่านี้สามารถแทนที่ตัวอักษรใดๆ ก็ได้ หากคุณใช้งานสัญลักษณ์นี้ได้อย่างคล่องแคล่ว การค้นหาข้อมูลของคุณจะอิสระและทรงพลังยิ่งขึ้น
ในบทความนี้ เราจะอธิบายอย่างละเอียดตั้งแต่พื้นฐานการใช้คำสั่ง LIKE, วิธีการใช้ Wildcard หลัก 2 ชนิด (% และ _) และข้อควรระวังที่เป็นประโยชน์ในทางปฏิบัติ พร้อมด้วยโค้ดที่สามารถคัดลอกและนำไปใช้ได้ทันที เอาล่ะ มาเริ่มต้นการผจญภัยในโลกของคำสั่ง LIKE เพื่อก้าวสู่การเป็นผู้เชี่ยวชาญด้านการค้นหากันเถอะ!
การเตรียมตัว: มาเตรียมข้อมูลหนังสือสำหรับค้นหากัน
เพื่อทดลองการค้นหาแบบบางส่วน เรามาเตรียมข้อมูลสำหรับใช้ค้นหากันก่อน ครั้งนี้เราจะสร้างตาราง books ง่ายๆ เพื่อจัดการรายชื่อหนังสือ เราจะจงใจลงทะเบียนหนังสือที่มีชื่อคล้ายกันและชื่อที่มีสัญลักษณ์พิเศษ เพื่อให้สามารถทดลองรูปแบบการค้นหาที่หลากหลายได้
-- ถ้ามีตาราง books อยู่แล้วให้ลบออก (เพื่อให้สามารถทดสอบซ้ำได้)
DROP TABLE IF EXISTS books;
-- สร้างตาราง books ใหม่
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author TEXT NOT NULL,
price INTEGER
);
-- ใส่ข้อมูลเริ่มต้น
INSERT INTO books (id, title, author, price) VALUES
(1, 'เริ่มต้นกับ SQL', 'Yamada Taro', 2500),
(2, 'การวิเคราะห์ข้อมูลด้วย SQL เชิงปฏิบัติ', 'Suzuki Ichiro', 3200),
(3, 'ตำรา Web Design', 'Sato Hanako', 2800),
(4, 'ความสนุกกับการเริ่มต้น SQL', 'Yamada Taro', 2200),
(5, 'คู่มือการสร้างเว็บไซต์', 'Sato Jiro', 3000),
(6, 'เทคนิคการตลาดเพื่อการเติบโต 120%', 'Tanaka Minoru', 1800),
(7, 'เริ่มต้นกับ SQL ภาคต่อ', 'Yamada Taro', 2600);
ตอนนี้เราก็พร้อมที่จะทดลองค้นหาด้วยคีย์เวิร์ดต่างๆ แล้ว
Wildcard ①: `%` (เปอร์เซ็นต์) - แทนที่สตริงใดๆ ที่มีความยาวตั้งแต่ 0 ตัวอักษรขึ้นไป
% เป็น Wildcard ที่ใช้บ่อยที่สุดในคำสั่ง LIKE มันหมายถึง "สตริงใดๆ ที่มีความยาวและชนิดไม่จำกัด ตั้งแต่ 0 ตัวอักษรขึ้นไป" พูดง่ายๆ ก็คือ ให้คิดว่ามันเป็นการ์ดอเนกประสงค์ที่สามารถเป็นอะไรก็ได้
การค้นหาที่ขึ้นต้นด้วย (Prefix Match): ค้นหาข้อมูลที่ "ขึ้นต้นด้วย..."
การใช้รูปแบบ 'สตริงที่ต้องการค้นหา%' จะช่วยให้คุณสามารถค้นหาข้อมูลที่ขึ้นต้นด้วยสตริงที่ระบุได้
สถานการณ์: "ฉันต้องการค้นหาหนังสือที่ชื่อเรื่องขึ้นต้นด้วย 'SQL'"
SELECT * FROM books WHERE title LIKE 'เริ่มต้นกับ SQL%';
ผลลัพธ์:
id | title | author | price
---|----------------------------|-------------|-------
1 | เริ่มต้นกับ SQL | Yamada Taro | 2500
7 | เริ่มต้นกับ SQL ภาคต่อ | Yamada Taro | 2600
เราพบหนังสือที่มี ID 1 และ 7 ส่วน 'ความสนุกกับการเริ่มต้น SQL' ไม่ถูกรวมอยู่ในผลลัพธ์เพราะชื่อเรื่องไม่ได้ขึ้นต้นด้วย "เริ่มต้นกับ SQL"
การค้นหาที่ลงท้ายด้วย (Suffix Match): ค้นหาข้อมูลที่ "ลงท้ายด้วย..."
การใช้รูปแบบ '%สตริงที่ต้องการค้นหา' จะช่วยให้คุณสามารถค้นหาข้อมูลที่ลงท้ายด้วยสตริงที่ระบุได้
สถานการณ์: "ฉันต้องการค้นหาหนังสือจากผู้เขียนที่ชื่อลงท้ายด้วย 'Taro'"
SELECT * FROM books WHERE author LIKE '%Taro';
ผลลัพธ์:
id | title | author | price
---|----------------------------|-------------|-------
1 | เริ่มต้นกับ SQL | Yamada Taro | 2500
4 | ความสนุกกับการเริ่มต้น SQL | Yamada Taro | 2200
7 | เริ่มต้นกับ SQL ภาคต่อ | Yamada Taro | 2600
หนังสือทั้งหมดของ "Yamada Taro" ได้ถูกแสดงขึ้นมา
การค้นหาบางส่วน (Contains): ค้นหาข้อมูลที่ "มีคำว่า..."
นี่คือการใช้งานที่หลากหลายที่สุด โดยการคร่อมคีย์เวิร์ดที่ต้องการค้นหาด้วย % เช่น '%สตริงที่ต้องการค้นหา%' จะทำให้คุณสามารถค้นหาข้อมูลทั้งหมดที่มีสตริงที่ระบุอยู่ส่วนใดส่วนหนึ่งได้
สถานการณ์: "ฉันต้องการค้นหาหนังสือทุกเล่มที่มีคำว่า 'SQL' อยู่ในชื่อเรื่อง"
SELECT * FROM books WHERE title LIKE '%SQL%';
ผลลัพธ์:
id | title | author | price
---|--------------------------------------|---------------|-------
1 | เริ่มต้นกับ SQL | Yamada Taro | 2500
2 | การวิเคราะห์ข้อมูลด้วย SQL เชิงปฏิบัติ | Suzuki Ichiro | 3200
4 | ความสนุกกับการเริ่มต้น SQL | Yamada Taro | 2200
7 | เริ่มต้นกับ SQL ภาคต่อ | Yamada Taro | 2600
ครั้งนี้ ไม่ว่า "SQL" จะอยู่ที่ส่วนไหนของชื่อเรื่อง ก็จะถูกรวมอยู่ในผลการค้นหาทั้งหมด คำสั่งค้นหาลักษณะนี้มักถูกใช้เบื้องหลังฟังก์ชันการค้นหาของเว็บไซต์
Wildcard ②: `_` (ขีดล่าง) - แทนที่อักขระใดๆ 1 ตัว
Wildcard ที่สำคัญอีกตัวคือ _ (ขีดล่าง) ในขณะที่ % หมายถึง "อะไรก็ได้" ที่มีความยาวตั้งแต่ 0 ตัวขึ้นไป, _ จะหมายถึง "อักขระใดๆ ก็ได้ที่มีความยาว 1 ตัวพอดี" ข้อแตกต่างที่สำคัญคือจำนวนตัวอักษรจะถูกจำกัดไว้ที่ 1 ตัวเท่านั้น
ซึ่งมีประโยชน์สำหรับการค้นหาที่ต้องการความแม่นยำสูง
สถานการณ์: "ฉันต้องการค้นหาผู้เขียนที่มีนามสกุล 'Sato' และชื่อจริงมีความยาว 4 ตัวอักษร (เช่น Sato Jiro, Sato Hana)"
-- รูปแบบที่ตรงกับ 'Sato ' ตามด้วยอักขระใดๆ 4 ตัว
SELECT * FROM books WHERE author LIKE 'Sato ____';
ผลลัพธ์:
id | title | author | price
---|--------------------------|-------------|-------
3 | ตำรา Web Design | Sato Hanako | 2800
5 | คู่มือการสร้างเว็บไซต์ | Sato Jiro | 3000
การใช้ขีดล่างสี่ตัว ทำให้เราระบุ "อักขระใดๆ สี่ตัว" ซึ่งทำให้เราพบทั้ง "Sato Hanako" และ "Sato Jiro" หากเราใช้ LIKE 'Sato _' ก็จะพบเฉพาะผู้เขียนที่มีชื่อตัวเดียว (ถ้ามี)
การประยุกต์ใช้: การค้นหาตัวอักษร '%' หรือ '_' (คำสั่ง `ESCAPE`)
ทีนี้มาถึงปัญหาที่ซับซ้อนขึ้นเล็กน้อย ถ้าคุณต้องการค้นหาหนังสือที่มีคำว่า "120%" อยู่ในชื่อเรื่องจะทำอย่างไร?
ถ้าเขียนง่ายๆ ว่า WHERE title LIKE '%120%%', สัญลักษณ์ % ตัวแรกและตัวสุดท้ายจะถูกตีความว่าเป็น Wildcard ซึ่งจะไม่ให้ผลลัพธ์การค้นหาตามที่ต้องการ ในกรณีที่คุณต้องการค้นหาตัวอักษรที่ใช้เป็น Wildcard ให้เป็น "ตัวอักษรธรรมดา" คำสั่ง ESCAPE ก็จะเข้ามามีบทบาท
คำสั่ง ESCAPE ช่วยให้คุณสามารถกำหนด "อักขระหลีก" (escape character) พิเศษขึ้นมาเอง (เช่น !, #, หรือ \) เพื่อบอกฐานข้อมูลว่าให้ยกเลิกความหมายพิเศษของ Wildcard ที่ตามหลังอักขระนี้ทันที
-- กำหนดให้ '!' เป็นอักขระหลีก
SELECT * FROM books WHERE title LIKE '%120!%%' ESCAPE '!';
ในคำสั่งนี้ ESCAPE '!' ได้กำหนดให้ ! เป็นอักขระหลีก ซึ่งหมายความว่าส่วนที่เขียนว่า !% จะถูกตีความว่า "นี่ไม่ใช่ Wildcard แต่เป็นตัวอักษร '%' ธรรมดา" ผลลัพธ์ที่ได้คือ จะพบเฉพาะหนังสือ ID 6 'เทคนิคการตลาดเพื่อการเติบโต 120%' อย่างถูกต้อง
【สนามเด็กเล่นแบบโต้ตอบ】มาลองค้นหาแบบบางส่วนในเบราว์เซอร์ของคุณกัน!
ถึงเวลาเปลี่ยนความรู้ให้เป็นทักษะแล้ว! คัดลอกโค้ด HTML ทั้งหมดด้านล่าง, บันทึกเป็นไฟล์ชื่อ sql_like_test.html, และเปิดในเบราว์เซอร์ของคุณ สภาพแวดล้อม SQL ส่วนตัวของคุณจะเปิดขึ้นมา พร้อมกับตาราง books ที่เราใช้ในบทความนี้
ลองเปลี่ยนตำแหน่งของ % และ _ หรือใช้คีย์เวิร์ดต่างๆ เพื่อดูว่าผลการค้นหาจะเปลี่ยนไปอย่างไร เส้นทางสู่การเป็นผู้เชี่ยวชาญด้านการค้นหาเกิดจากการลองผิดลองถูกนี่แหละ!
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>สนามเด็กเล่นออนไลน์สำหรับคำสั่ง SQL LIKE</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; line-height: 1.7; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1 { color: #3498db; }
textarea { width: 100%; height: 180px; font-family: "SF Mono", "Consolas", monospace; font-size: 16px; padding: 12px; border: 1px solid #ccc; border-radius: 6px; box-sizing: border-box; margin-bottom: 1rem; }
button { background-color: #3498db; color: white; border: none; padding: 12px 22px; font-size: 16px; border-radius: 6px; cursor: pointer; transition: background-color 0.2s; }
button:hover { background-color: #2980b9; }
button:disabled { background-color: #bdc3c7; cursor: not-allowed; }
#result-container { margin-top: 2rem; border: 1px solid #ddd; padding: 1rem; border-radius: 6px; background: #fdfdfd; min-height: 50px; }
#error-message { color: #e74c3c; font-weight: bold; }
table { border-collapse: collapse; width: 100%; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background-color: #f2f2f2; }
tr:nth-child(even) { background-color: #f9f9f9; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>
<h1>มาลองใช้ SQL กัน!</h1>
<p>ป้อนคำสั่ง SQL ในช่องข้อความด้านล่างแล้วคลิกปุ่ม "ประมวลผล" ลองค้นหาด้วยคีย์เวิร์ดต่างๆ ดูสิ!</p>
<textarea id="sql-input">-- ลองค้นหาหนังสือที่มีคำว่า "Web" ในชื่อเรื่อง
SELECT * FROM books WHERE title LIKE '%Web%';
</textarea>
<button id="execute-btn">ประมวลผล</button>
<div id="result-container">
<p id="error-message"></p>
<div id="result-output"></div>
</div>
<script>
const sqlInput = document.getElementById('sql-input');
const executeBtn = document.getElementById('execute-btn');
const errorMsg = document.getElementById('error-message');
const resultOutput = document.getElementById('result-output');
let db;
async function initDb() {
executeBtn.disabled = true;
executeBtn.textContent = 'กำลังเตรียมฐานข้อมูล...';
try {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
const setupSql = `
DROP TABLE IF EXISTS books;
CREATE TABLE books (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
author TEXT NOT NULL,
price INTEGER
);
INSERT INTO books (id, title, author, price) VALUES
(1, 'เริ่มต้นกับ SQL', 'Yamada Taro', 2500),
(2, 'การวิเคราะห์ข้อมูลด้วย SQL เชิงปฏิบัติ', 'Suzuki Ichiro', 3200),
(3, 'ตำรา Web Design', 'Sato Hanako', 2800),
(4, 'ความสนุกกับการเริ่มต้น SQL', 'Yamada Taro', 2200),
(5, 'คู่มือการสร้างเว็บไซต์', 'Sato Jiro', 3000),
(6, 'เทคนิคการตลาดเพื่อการเติบโต 120%', 'Tanaka Minoru', 1800),
(7, 'เริ่มต้นกับ SQL ภาคต่อ', 'Yamada Taro', 2600);
`;
db.run(setupSql);
executeBtn.disabled = false;
executeBtn.textContent = 'ประมวลผล';
resultOutput.innerHTML = '<p>พร้อมแล้ว! คุณสามารถทดลองใช้คำสั่ง SQL ของคุณเองได้เลย</p>';
} catch (err) {
errorMsg.textContent = 'การเริ่มต้นฐานข้อมูลล้มเหลว: ' + err.message;
console.error(err);
}
}
function executeSql() {
if (!db) return;
const sql = sqlInput.value;
errorMsg.textContent = '';
resultOutput.innerHTML = '';
try {
const results = db.exec(sql);
if (results.length === 0) {
resultOutput.innerHTML = '<p>คำสั่งสำเร็จ แต่ไม่มีผลลัพธ์ส่งกลับมา</p>';
return;
}
results.forEach(result => {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(row => {
const bodyRow = document.createElement('tr');
row.forEach(cellValue => {
const td = document.createElement('td');
td.textContent = cellValue === null ? 'NULL' : cellValue;
bodyRow.appendChild(td);
});
tbody.appendChild(bodyRow);
});
table.appendChild(thead);
table.appendChild(tbody);
resultOutput.appendChild(table);
});
} catch (err) {
errorMsg.textContent = 'เกิดข้อผิดพลาด SQL: ' + err.message;
console.error(err);
}
}
executeBtn.addEventListener('click', executeSql);
initDb();
</script>
</body>
</html>
ข้อควรระวัง: ประสิทธิภาพและความไวต่อตัวพิมพ์ใหญ่-เล็ก
แม้ว่าคำสั่ง LIKE จะสะดวกมาก แต่ก็มีข้อควรระวังบางประการเมื่อนำไปใช้จริง
- ประสิทธิภาพ (Performance): การใช้
%ที่ด้านหน้าของสตริงค้นหา เช่นLIKE '%keyword'หรือLIKE '%keyword%'อาจทำให้ประสิทธิภาพการค้นหาลดลงอย่างมาก เนื่องจากฐานข้อมูลไม่สามารถใช้ดัชนี (index) ได้อย่างมีประสิทธิภาพ ในตารางขนาดใหญ่ที่มีข้อมูลหลายล้านรายการ อาจทำให้การค้นหาใช้เวลานานมาก หากเป็นไปได้ การใช้การค้นหาแบบขึ้นต้นด้วย เช่นLIKE 'keyword%'เป็นเคล็ดลับในการรักษาประสิทธิภาพที่ดี - ความไวต่อตัวพิมพ์ใหญ่-เล็ก (Case Sensitivity): การที่
'sql'และ'SQL'จะถูกมองว่าแตกต่างกันหรือไม่นั้น ขึ้นอยู่กับชนิดและการตั้งค่าของฐานข้อมูล (โดยเฉพาะ "collation") การตั้งค่าเริ่มต้นใน MySQL อาจไม่แยกแยะ แต่ฐานข้อมูลอื่นอาจแยกแยะอย่างเข้มงวด หากต้องการค้นหาโดยไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก วิธีที่เชื่อถือได้ที่สุดคือการใช้ฟังก์ชันเช่นLOWER()หรือUPPER()เพื่อแปลงสตริงทั้งสองด้านของการเปรียบเทียบให้เป็นตัวพิมพ์เดียวกัน เช่นWHERE LOWER(title) LIKE '%sql%'
สำหรับการค้นหาข้อมูลข้อความจำนวนมากด้วยความเร็วสูง โดยทั่วไปจะใช้ฟังก์ชันที่สูงกว่าที่เรียกว่า "Full-Text Search" แทนคำสั่ง LIKE หลังจากที่คุณเชี่ยวชาญ LIKE แล้ว การเรียนรู้เกี่ยวกับ Full-Text Search ก็เป็นขั้นตอนต่อไปที่ดี
สรุป
ในบทความนี้ เราได้เรียนรู้เกี่ยวกับคำสั่ง LIKE สำหรับการค้นหาแบบบางส่วนใน SQL โดยเน้นที่ผู้ช่วยที่ทรงพลังอย่าง Wildcards
- คำสั่ง
LIKE: ใช้กับWHEREclause เพื่อทำการค้นหาสตริงแบบ "คลุมเครือ" - Wildcard
%: ตรงกับสตริงใดๆ ที่มีความยาวตั้งแต่ 0 ตัวอักษรขึ้นไป รูปแบบพื้นฐาน 3 อย่างคือ'A%'(ขึ้นต้นด้วย),'%A'(ลงท้ายด้วย), และ'%A%'(มีคำว่า) - Wildcard
_: ตรงกับอักขระใดๆ ก็ได้เพียง 1 ตัวพอดี ใช้เมื่อต้องการระบุจำนวนตัวอักษร - คำสั่ง
ESCAPE: ใช้เมื่อต้องการค้นหาตัวอักษร%หรือ_เอง โดยกำหนดอักขระหลีกเพื่อยกเลิกฟังก์ชัน Wildcard ของมัน - ข้อควรระวังที่สำคัญ: การตระหนักถึงปัญหาด้านประสิทธิภาพของ
%ที่นำหน้า และความแตกต่างในการจัดการตัวพิมพ์ใหญ่-เล็กของฐานข้อมูลต่างๆ
การใช้คำสั่ง LIKE ได้อย่างเชี่ยวชาญเป็นทักษะที่จำเป็นสำหรับการสร้างฟังก์ชันการค้นหาที่เป็นมิตรต่อผู้ใช้ โปรดใช้สนามเด็กเล่นในบทความนี้เพื่อทดลองรูปแบบต่างๆ และทำความเข้าใจกับการค้นหาแบบบางส่วนด้วยตัวเอง ทักษะ SQL ของคุณได้ก้าวไปอีกระดับแล้ว!