【SQL เบื้องต้น】เจาะลึกคำสั่ง WHERE! เรียนรู้การดึงข้อมูลด้วยโค้ดตัวอย่างที่คัดลอกได้ทันที
สำหรับผู้สร้างเว็บไซต์หรือแอปพลิเคชัน คุณอาจเคยได้ยินคำว่า “ฐานข้อมูล” หรือ “SQL” แล้วรู้สึกว่ามันดูยากและไม่เกี่ยวข้องกับงานของคุณใช่ไหม? แต่อันที่จริงแล้ว ในยุคปัจจุบัน ความรู้เรื่อง SQL คือเครื่องมือทรงพลังที่จะยกระดับความคิดสร้างสรรค์ของคุณไปอีกขั้น
ตัวอย่างเช่น ระบบ CMS อย่าง WordPress จะจัดเก็บข้อมูลโพสต์และผู้ใช้งานไว้ในฐานข้อมูล หากคุณเข้าใจ SQL คุณจะสามารถปรับแต่งเว็บไซต์ให้ซับซ้อนขึ้นได้ เช่น การแสดงเฉพาะบทความที่ตรงตามเงื่อนไข หรือการวิเคราะห์พฤติกรรมผู้ใช้และปรับปรุงเว็บไซต์จากข้อมูลที่ได้ กล่าวคือ SQL ไม่ใช่แค่สำหรับวิศวกรฝั่งเซิร์ฟเวอร์อีกต่อไป
บทความนี้จะเน้นที่คำสั่งสำคัญของ SQL คือ WHERE ซึ่งเปรียบเสมือน “แหอันทรงพลัง” ที่ช่วยให้คุณสามารถดึงเฉพาะข้อมูลที่ต้องการจากมหาสมุทรของข้อมูลได้อย่างแม่นยำ เราจะอธิบายตั้งแต่พื้นฐานจนถึงขั้นประยุกต์ โดยมีตัวอย่างโค้ดที่คัดลอกไปใช้ได้ทันที เพื่อให้มือใหม่ก็สามารถเรียนรู้ได้อย่างมั่นใจ พร้อมสนุกไปกับการควบคุมข้อมูลให้เป็นไปตามใจคุณ!
เริ่มจากเตรียมเวที! สร้างตารางตัวอย่างที่จะใช้เรียนรู้
ก่อนจะเข้าสู่การผจญภัยในโลกของ SQL เราจะเริ่มจากการสร้างตารางตัวอย่างชื่อว่า users ซึ่งเป็นข้อมูลจำลองของผู้ใช้งานระบบเว็บจินตนาการขึ้นมา หากเข้าใจว่าคอลัมน์แต่ละตัวเก็บข้อมูลอะไร การเรียนรู้ในส่วนถัดไปจะง่ายขึ้นมาก
นิยามตาราง: users
id: หมายเลขเฉพาะของผู้ใช้ (ID) เพื่อระบุแต่ละคนไม่ให้ซ้ำกันname: ชื่อของผู้ใช้งาน (ข้อความ)age: อายุของผู้ใช้งาน (ตัวเลข)pref: จังหวัดที่ผู้ใช้พำนักอยู่ (ข้อความ)points: คะแนนสะสมของผู้ใช้ (ตัวเลข) ซึ่งอาจไม่มีข้อมูล (NULL) ได้
ในส่วน "การฝึกปฏิบัติ" ด้านล่าง ระบบจะโหลดตารางและข้อมูลนี้อัตโนมัติ สำหรับตอนนี้ขอให้คุณดูและทำความเข้าใจว่ามีข้อมูลอะไรบ้าง
-- สร้างโครงสร้างของตาราง
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
pref VARCHAR(50),
points INT
);
-- แทรกข้อมูลตัวอย่างลงในตาราง
INSERT INTO users (id, name, age, pref, points) VALUES
(1, 'Tanaka Taro', 25, 'โตเกียว', 120),
(2, 'Suzuki Ichiro', 32, 'โอซาก้า', 85),
(3, 'Sato Hanako', 28, 'โตเกียว', 300),
(4, 'Takahashi Jiro', 45, 'ฟุกุโอกะ', 50),
(5, 'Ito Sakura', 25, 'ฮอกไกโด', NULL),
(6, 'Watanabe Saburo', 32, 'โตเกียว', 150),
(7, 'Yamamoto Shiro', 51, 'โอซาก้า', 210);
พื้นฐานของ WHERE – คัดกรองข้อมูลด้วยเงื่อนไขง่ายๆ
คำสั่ง WHERE จะใช้ต่อท้าย SELECT * FROM users เพื่อกำหนดเงื่อนไข โดยรูปแบบพื้นฐานคือ WHERE ชื่อคอลัมน์ ตัวดำเนินการ ค่า ลองมาดูตัวอย่างของตัวดำเนินการพื้นฐานกันเลย
= : ค้นหาข้อมูลที่ตรงกันพอดี
เครื่องหมายเท่ากับ = ใช้เมื่อเราต้องการหาข้อมูลที่มีค่าตรงกับที่ระบุ เช่น “ผู้ใช้อายุ 25 ปี” หากเป็นตัวเลขให้เขียนตรงๆ แต่ถ้าเป็นข้อความต้องใส่ไว้ในเครื่องหมาย ' '
SELECT * FROM users WHERE age = 25;
<> หรือ != : ค้นหาข้อมูลที่ไม่ตรงกัน
ถ้าต้องการระบุว่า “ไม่เท่ากับ” ให้ใช้ <> หรือ != เช่น “ผู้ใช้ที่ไม่ได้อยู่โตเกียว”
SELECT * FROM users WHERE pref <> 'โตเกียว';
> และ >= : ค้นหาค่าที่มากกว่า หรือ มากกว่าหรือเท่ากับ
เราสามารถเปรียบเทียบขนาดของตัวเลขได้อย่างง่ายดาย เช่น “ผู้ใช้ที่มีคะแนนมากกว่า 100” จะใช้เครื่องหมาย >
SELECT * FROM users WHERE points > 100;
ถ้าต้องการรวมค่าขอบเขต เช่น “ผู้ใช้อายุ 32 ปีขึ้นไป” ให้ใช้ >= โดยความแตกต่างของมีหรือไม่มี = จะเปลี่ยนผลลัพธ์
SELECT * FROM users WHERE age >= 32;
応用ของ WHERE – ใช้เงื่อนไขที่ซับซ้อนมากขึ้น
เมื่อเข้าใจพื้นฐานแล้ว ต่อไปคือระดับที่สูงขึ้น โดยการผสมหลายเงื่อนไขหรือใช้ตัวดำเนินการพิเศษ จะทำให้ WHERE มีพลังมากขึ้น
AND และ OR : รวมเงื่อนไขหลายตัว
AND ใช้เมื่อต้องการให้ข้อมูลตรงกับทุกเงื่อนไข เช่น “ผู้ใช้ที่อยู่โตเกียวและอายุน้อยกว่า 30 ปี”
SELECT * FROM users WHERE pref = 'โตเกียว' AND age < 30;
OR ใช้เมื่อตรงเพียงเงื่อนไขใดเงื่อนไขหนึ่งก็ได้ เช่น “ผู้ใช้ที่อยู่โอซาก้าหรือมีอายุ 50 ปีขึ้นไป”
SELECT * FROM users WHERE pref = 'โอซาก้า' OR age >= 50;
IN : ระบุหลายค่าในคำสั่งเดียว
หากคุณต้องการหาผู้ใช้ที่อยู่ใน “โตเกียว, โอซาก้า หรือฟุกุโอกะ” อาจใช้ OR หลายครั้ง แต่การใช้ IN จะทำให้โค้ดกระชับและอ่านง่ายขึ้น และในบางฐานข้อมูลยังช่วยให้ประมวลผลเร็วขึ้นด้วย
SELECT * FROM users WHERE pref IN ('โตเกียว', 'โอซาก้า', 'ฟุกุโอกะ');
`BETWEEN` : กำหนดช่วงค่าที่ต้องการ
ถ้าคุณต้องการกรองข้อมูลตามช่วง เช่น "ผู้ใช้อายุระหว่าง 30 ถึง 50 ปี" ให้ใช้ `BETWEEN` จะสะดวกกว่า มันมีความหมายเหมือนกับ `age >= 30 AND age <= 50` แต่เขียนได้เข้าใจง่ายกว่า และ `BETWEEN` จะรวมค่าทั้งสองฝั่งด้วย (เท่ากับหรือมากกว่า / เท่ากับหรือน้อยกว่า)
SELECT * FROM users WHERE age BETWEEN 30 AND 50;
`LIKE` : ค้นหาแบบคลุมเครือ
`LIKE` คือโอเปอเรเตอร์ที่ใช้ค้นหาคำที่ตรงบางส่วนได้ โดยใช้ "ไวลด์การ์ด" หรือสัญลักษณ์พิเศษประกอบ
- `%` : แทนข้อความใด ๆ ความยาวเท่าใดก็ได้
- `_` : แทนหนึ่งอักขระใด ๆ
ตัวอย่างเช่น หากต้องการค้นหาผู้ใช้ที่มีคำว่า "ro" อยู่ในชื่อ (ตรงกลาง) ให้ใช้ `%` ล้อมรอบคำที่ต้องการค้นหา
SELECT * FROM users WHERE name LIKE '%ro%';
หากต้องการค้นหาผู้ใช้ที่นามสกุลขึ้นต้นด้วย "Sato" (ตรงต้น) ให้เขียนแบบนี้:
SELECT * FROM users WHERE name LIKE 'Sato%';
`IS NULL`: การค้นหา "ไม่มีข้อมูล"
`NULL` ในฐานข้อมูล หมายถึงสถานะพิเศษที่แปลว่า "ไม่มีข้อมูล" ซึ่งแตกต่างจาก `0` หรือสตริงว่าง (`''`) โดยสิ้นเชิง หากต้องการค้นหา `NULL` ต้องใช้คำสั่งพิเศษ `IS NULL` แทน `=` มาดูวิธีค้นหาผู้ใช้ที่ไม่มีข้อมูลคะแนนกัน
SELECT * FROM users WHERE points IS NULL;
ในทางกลับกัน หากต้องการค้นหาข้อมูลที่ไม่ใช่ `NULL` (เช่น มีค่าอยู่) ให้ใช้ `IS NOT NULL`
SELECT * FROM users WHERE points IS NOT NULL;
ข้อผิดพลาด 3 ข้อที่มือใหม่มักเจอ
แม้ว่า WHERE จะใช้งานได้สะดวกมาก แต่ก็มีข้อผิดพลาดบางอย่างที่อาจทำให้คุณสับสนได้หากไม่ระวัง มาทบทวน 3 จุดสำคัญกัน
- ลำดับความสำคัญของ `AND` และ `OR` กับวงเล็บ `()`
ใน SQL `AND` มีลำดับความสำคัญสูงกว่า `OR` หากไม่ใส่วงเล็บ อาจทำให้เงื่อนไขซับซ้อนทำงานผิดพลาด ตัวอย่างเช่น หากต้องการค้นหา "ผู้ใช้ที่อยู่ Tokyo หรือ Osaka และอายุ 30 ปีขึ้นไป" ต้องใช้วงเล็บครอบ `OR` เพื่อให้ฐานข้อมูลเข้าใจได้ถูกต้อง - ให้ความสำคัญกับชนิดข้อมูล
ค่าที่นำมาใช้เปรียบเทียบควรมีชนิดตรงกับคอลัมน์เสมอ เช่น ตัวอักษรต้องใส่ใน `'` ตัวเลขไม่ต้องใส่ บางฐานข้อมูลอาจแปลงให้อัตโนมัติ แต่การพึ่งพาการแปลงนี้อาจทำให้ประสิทธิภาพลดลง และเกิดผลลัพธ์ไม่ตรงตามคาด ควรระบุให้ถูกต้องเสมอ - `NULL` คือ "ไม่มีอะไรเลย"
อย่างที่กล่าวไป `NULL` เป็นค่าพิเศษ เช่น `points = 0` และ `points IS NULL` มีความหมายต่างกันโดยสิ้นเชิง ตัวอย่างเช่น `COUNT(points)` จะไม่นับแถวที่ `points` เป็น `NULL` แต่ `COUNT(*)` จะนับทุกแถว การเข้าใจความแตกต่างนี้จะช่วยป้องกันความผิดพลาดในการสรุปผลข้อมูล
-- เงื่อนไขรูปแบบ (A OR B) AND C
SELECT * FROM users WHERE (pref = 'Tokyo' OR pref = 'Osaka') AND age >= 30;
WHERE ไม่ได้มีแค่ SELECT เท่านั้น!
WHERE ไม่ได้ใช้แค่กับ `SELECT` เท่านั้น แต่ยังสำคัญมากกับ `UPDATE` และ `DELETE` ด้วย เพราะช่วยระบุข้อมูลที่ต้องการแก้ไขหรือลบอย่างแม่นยำ
ถ้าคุณลืมใส่ WHERE แล้วพิมพ์ `DELETE FROM users` ขึ้นมา... ทุกแถวในตารางจะหายไปหมดแบบกู้คืนไม่ได้เลย ก่อนจะแก้ไขหรือลบข้อมูลใด ๆ ควรใช้ `SELECT` ตรวจสอบก่อนเสมอว่าตรงตามที่ต้องการ
-- ตรวจสอบด้วย SELECT ก่อน!
SELECT * FROM users WHERE id = 3;
-- เมื่อมั่นใจว่าถูกต้องแล้ว ค่อย UPDATE
-- UPDATE users SET points = points + 50 WHERE id = 3;
【ลงมือทำจริง】ลองรัน SQL บนเบราว์เซอร์!
ถึงเวลาลงมือแล้ว! คัดลอกโค้ดด้านล่างนี้แล้วบันทึกชื่อไฟล์ว่า `sql-practice.html` จากนั้นเปิดบนเบราว์เซอร์ของคุณ
ภายในโค้ดมีการใช้ไลบรารี JavaScript ที่ชื่อว่า `sql.js` เพื่อสร้างฐานข้อมูลชั่วคราวในเบราว์เซอร์ พิมพ์หรือวาง SQL ที่คุณได้เรียนรู้ไว้ในกล่องซ้าย แล้วคลิกปุ่ม "รัน SQL" ด้านล่าง ผลลัพธ์จะปรากฏทางขวาทันที ลองเงื่อนไขต่าง ๆ และดูผลลัพธ์ด้วยตาของคุณเอง!
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<title>สภาพแวดล้อม SQL (WHERE clause - ตัวอย่างการใช้งาน)</title>
<style>
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; display: flex; flex-direction: column; height: 100vh; margin: 0; background-color: #f9f9f9; }
.header { padding: 15px 20px; background-color: #fff; border-bottom: 1px solid #ddd; }
.main-content { display: flex; flex: 1; overflow: hidden; }
.container { flex: 1; display: flex; flex-direction: column; padding: 20px; overflow-y: auto; }
.container:first-child { border-right: 1px solid #ddd; }
h3 { margin-top: 0; color: #333; }
textarea { height: 200px; border: 1px solid #ccc; border-radius: 4px; padding: 10px; font-family: "SF Mono", "Fira Code", "Source Code Pro", monospace; font-size: 14px; margin-top: 10px; resize: vertical; }
button { background-color: #007bff; color: white; border: none; padding: 12px 18px; border-radius: 4px; cursor: pointer; margin-top: 10px; font-size: 16px; transition: background-color 0.2s; }
button:hover { background-color: #0056b3; }
table { border-collapse: collapse; width: 100%; margin-top: 10px; background-color: #fff; }
th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }
th { background-color: #f2f2f2; font-weight: 600; }
#error { color: #d9534f; font-weight: bold; margin-top: 10px; white-space: pre-wrap; }
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
</head>
<body>
<div class="header">
<h2 style="margin: 0;">พื้นที่ฝึกฝน SQL WHERE Clause</h2>
</div>
<div class="main-content">
<div class="container">
<h3>ป้อน SQL</h3>
<textarea id="sql-input">-- ลองแก้ไข SQL นี้เพื่อทดสอบ!
SELECT * FROM users WHERE pref = 'โตเกียว';</textarea>
<button onclick="executeSql()">เรียกใช้ SQL</button>
<div id="error"></div>
</div>
<div class="container">
<h3>ผลลัพธ์</h3>
<div id="result-table"></div>
</div>
</div>
<script>
let db;
async function initDb() {
try {
const config = { locateFile: filename => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${filename}` };
const SQL = await initSqlJs(config);
db = new SQL.Database();
const initialSql = `
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50), age INT, pref VARCHAR(50), points INT);
INSERT INTO users (id, name, age, pref, points) VALUES
(1, 'ทาโร่ ทานากะ', 25, 'โตเกียว', 120),
(2, 'อิจิโร ซูซูกิ', 32, 'โอซาก้า', 85),
(3, 'ฮานาโกะ ซาโต', 28, 'โตเกียว', 300),
(4, 'จิโร่ ทากาฮาชิ', 45, 'ฟุกุโอกะ', 50),
(5, 'ซากุระ อิโตะ', 25, 'ฮอกไกโด', null),
(6, 'ซาบุโร่ วาตานาเบะ', 32, 'โตเกียว', 150),
(7, 'ชิโร่ ยามาโมโตะ', 51, 'โอซาก้า', 210);
`;
db.run(initialSql);
executeSql(); // แสดงผลครั้งแรก
} catch (e) {
document.getElementById('error').textContent = "ไม่สามารถเริ่มต้นฐานข้อมูลได้: " + e.message;
}
}
function executeSql() {
const sqlInput = document.getElementById('sql-input').value;
const errorEl = document.getElementById('error');
const resultEl = document.getElementById('result-table');
errorEl.textContent = '';
resultEl.innerHTML = '';
try {
const results = db.exec(sqlInput);
if (results.length > 0) {
resultEl.appendChild(createTable(results[0]));
} else {
resultEl.innerHTML = '<p>คำสั่งประสบความสำเร็จแต่ไม่มีผลลัพธ์ (เช่น: คำสั่ง UPDATE)</p>';
}
} catch (e) {
errorEl.textContent = "ข้อผิดพลาด SQL: " + e.message;
}
}
function createTable(result) {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(col => {
const th = document.createElement('th');
th.textContent = col;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(row => {
const tr = document.createElement('tr');
row.forEach(cell => {
const td = document.createElement('td');
td.textContent = cell === null ? 'NULL' : cell;
tr.appendChild(td);
});
tbody.appendChild(tr);
});
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
initDb();
</script>
</body>
</html>
สรุปและก้าวถัดไป
ในบทความนี้ เราได้เรียนรู้เกี่ยวกับคำสั่ง WHERE ของ SQL ตั้งแต่พื้นฐานจนถึงการประยุกต์ใช้งานจริง หวังว่าคุณจะเห็นถึงความยืดหยุ่นและพลังของมันในการดึงข้อมูล
การเข้าใจ WHERE ไม่ใช่จุดสิ้นสุด แต่คือประตูสู่โลกกว้างของ SQL หากคุณต้องการเรียนรู้เพิ่มเติม แนะนำให้ลองศึกษาหัวข้อต่อไปนี้:
- ฟังก์ชันการรวม (`COUNT`, `SUM`, `AVG` ฯลฯ) และ `GROUP BY`: การจัดกลุ่มข้อมูลและคำนวณค่ารวม/เฉลี่ย
- คำสั่ง `JOIN`: การเชื่อมโยงหลายตารางเพื่อดึงข้อมูลที่ซับซ้อน
- คำสั่งย่อย (Subquery): เทคนิคขั้นสูงที่แทรกคำสั่ง SQL ภายในอีกคำสั่งหนึ่ง
เมื่อคุณมีความรู้เหล่านี้ ทักษะการจัดการข้อมูลของคุณจะเพิ่มขึ้นอย่างมาก และจะเปิดโอกาสใหม่ ๆ ในฐานะนักพัฒนาเว็บไซต์ ขอให้บทความนี้เป็นจุดเริ่มต้นของการผจญภัยอันน่าตื่นเต้น!