พื้นฐานของ ORDER BY: วิธีจัดเรียงข้อมูลด้วย SQL อย่างอิสระ
รายการสินค้าบนเว็บไซต์, ดัชนีบทความในบล็อก, การจัดอันดับผู้ใช้งาน… เนื้อหาเว็บที่เราเห็นในชีวิตประจำวันจำนวนมาก มักถูกจัดเรียงตามกฎบางอย่าง การจัดเรียงข้อมูลเหล่านี้สามารถทำได้ด้วยคำสั่ง ORDER BY ของ SQL
บทความนี้เหมาะสำหรับนักสร้างเว็บไซต์ที่เพิ่งเริ่มเรียนรู้ SQL หรือผู้ที่ต้องการทบทวนพื้นฐานอีกครั้ง เราจะอธิบายการใช้งาน ORDER BY อย่างละเอียด พร้อมตัวอย่างโค้ดมากมายภายใต้ธีม “ก็อปวางแล้วใช้ได้เลย!” มาลองทำตามด้วยตนเองแล้วสนุกกับการจัดการข้อมูลอย่างอิสระกันเถอะ!
มาเริ่มกันเลย! เตรียมข้อมูลตัวอย่างกันก่อน
การฝึกปฏิบัติดีกว่าการท่องจำ! มาเขียน SQL ทันทีเลย ในบทความนี้เราจะใช้ตัวอย่างร้านค้าออนไลน์สมมุติชื่อว่า “Web Creator's Mart” และตารางสินค้า (products)
คำสั่ง SQL ด้านล่างนี้ใช้สำหรับสร้างตารางและเพิ่มข้อมูลตัวอย่าง ตารางนี้จำเป็นสำหรับโค้ดส่วนถัดไป ดังนั้นหากคุณต้องการทดลองในเครื่องของคุณ กรุณารัน SQL นี้ก่อน
-- สร้างตารางสินค้า
CREATE TABLE products (
id INT,
name VARCHAR(255),
category VARCHAR(255),
price INT,
release_date DATE
);
-- เพิ่มข้อมูลตัวอย่าง
INSERT INTO products (id, name, category, price, release_date) VALUES
(1, 'หมอนนุ่มนิ่ม', 'ของแต่งบ้าน', 3200, '2023-04-15'),
(2, 'ที่ครอบหูช่วยโฟกัส', 'แกดเจ็ต', 7800, '2023-11-01'),
(3, 'สมุดจดไอเดีย', 'เครื่องเขียน', 1200, '2022-08-20'),
(4, 'คีย์บอร์ดมีไฟ', 'แกดเจ็ต', 15000, '2023-06-30'),
(5, 'เก้าอี้นั่งสบายสุดๆ', 'ของแต่งบ้าน', 32000, '2022-11-10'),
(6, 'ปากกาลื่นไหล', 'เครื่องเขียน', 1200, '2023-09-01'),
(7, 'แก้วมัคสำหรับครีเอเตอร์', 'เครื่องครัว', 2500, '2023-04-15');
ตารางนี้ประกอบด้วยคอลัมน์ รหัสสินค้า (id), ชื่อสินค้า (name), หมวดหมู่ (category), ราคา (price) และวันที่เปิดตัวสินค้า (release_date) พร้อมแล้วใช่ไหม? มาลองใช้ ORDER BY กันเลย!
พื้นฐานของ ORDER BY: เริ่มจากการเรียงลำดับแบบน้อยไปมาก
การใช้ ORDER BY แบบพื้นฐานที่สุดคือการเรียงข้อมูลตามคอลัมน์ที่กำหนดในลำดับจากน้อยไปมาก (ราคาน้อย→มาก, วันที่เก่า→ใหม่) เช่น ต้องการแสดงรายการสินค้าตามราคาถูกไปแพง
รูปแบบคำสั่งก็ง่ายมาก เพียงแค่เพิ่ม ORDER BY ชื่อคอลัมน์ ต่อท้ายคำสั่ง SELECT
SELECT * FROM products ORDER BY price;
เมื่อคุณรันคำสั่ง SQL นี้ ข้อมูลจะถูกเรียงตามคอลัมน์ price จากค่าน้อยไปมาก (เรียงลำดับจากถูกไปแพง) โดยปกติคุณสามารถระบุคำสั่งให้เรียงแบบ "น้อยไปมาก" ได้ด้วย ASC (ย่อมาจาก Ascending) แต่เนื่องจากค่าเริ่มต้นของ ORDER BY คือ ASC อยู่แล้ว จึงมักจะไม่ต้องใส่ก็ได้
-- ให้ผลลัพธ์เหมือนกับคำสั่งด้านบนทุกประการ
SELECT * FROM products ORDER BY price ASC;
สลับลำดับง่ายนิดเดียว! การเรียงลำดับแบบมากไปน้อยด้วย DESC
ในบางกรณี เช่น "เรียงตามราคาจากแพงไปถูก" หรือ "เรียงตามวันที่ใหม่ก่อน" จะต้องใช้ การเรียงแบบมากไปน้อย (หรือใหม่ไปเก่า) ซึ่งใช้คำสั่ง DESC (ย่อมาจาก Descending)
วิธีใช้งานก็ง่ายมาก เพียงแค่เติม DESC ต่อท้ายชื่อคอลัมน์เท่านั้น
-- เรียงสินค้าตามราคาจากแพงไปถูก
SELECT * FROM products ORDER BY price DESC;
เมื่อรันคำสั่งนี้ สินค้าที่แพงที่สุด “เก้าอี้นั่งสบายสุดๆ” จะอยู่ลำดับบนสุด เช่นเดียวกับการเรียงตามวันที่ (release_date) จากวันที่ใหม่ที่สุดก่อน
-- เรียงตามวันวางจำหน่ายจากใหม่ไปเก่า
SELECT * FROM products ORDER BY release_date DESC;
ASC สามารถละไว้ได้ แต่ ถ้าต้องการเรียงจากมากไปน้อยจะต้องระบุ DESC เสมอ อย่าลืมใส่นะ!
ตัวอย่างขั้นสูง① : เรียงข้อมูลจากหลายเงื่อนไข
จุดเด่นของ ORDER BY คือสามารถ เรียงลำดับตามหลายคอลัมน์ได้พร้อมกัน เช่น "เรียงตามหมวดหมู่ก่อน แล้วในแต่ละหมวดเรียงตามราคาต่ำสุด"
ในกรณีแบบนี้ ให้ระบุชื่อคอลัมน์หลายคอลัมน์ โดยคั่นด้วยเครื่องหมายจุลภาค (,) คอลัมน์ที่อยู่ข้างหน้าจะมีความสำคัญสูงสุด
-- เรียงตามหมวดหมู่ และภายในแต่ละหมวดเรียงตามราคาน้อยไปมาก
SELECT * FROM products ORDER BY category, price;
คำสั่งนี้จะเรียงสินค้าตาม category (หมวดหมู่) ตามลำดับตัวอักษร (เช่น แกดเจ็ต → ของแต่งบ้าน → เครื่องเขียน...) และภายในหมวดเครื่องเขียนจะเรียงสินค้าตาม price (ราคา) จากน้อยไปมาก
แน่นอนว่า คุณสามารถระบุ ASC หรือ DESC ให้แต่ละคอลัมน์ได้เช่นกัน เช่น "เรียงตามวันวางจำหน่ายล่าสุด และถ้าวันเดียวกันให้เรียงสินค้าราคาแพงก่อน"
-- เรียงตามวันวางจำหน่าย (ใหม่ก่อน) และราคาสินค้า (แพงก่อน)
SELECT * FROM products ORDER BY release_date DESC, price DESC;
ในตัวอย่างจะมี “หมอนนุ่มนิ่ม” และ “แก้วมัคสำหรับครีเอเตอร์” ที่มีวันวางจำหน่ายเหมือนกัน (2023-04-15) คำสั่งนี้จะแสดงหมอน (ราคาแพงกว่า) ก่อนแก้วมัค การเรียงข้อมูลหลายชั้นช่วยให้คุณควบคุมการแสดงผลได้ละเอียดขึ้น
💻 มาลองกันเลย! รัน SQL ผ่านเบราว์เซอร์ของคุณ
ถึงตอนนี้คุณได้เรียนรู้คำสั่ง SQL ไปหลายรูปแบบแล้ว แต่ไม่มีอะไรดีไปกว่าการลองด้วยตนเอง
เราจึงเตรียม ไฟล์ HTML พิเศษที่ให้คุณรัน SQL ได้โดยตรงในเบราว์เซอร์ แบบไม่ต้องติดตั้งอะไรเลย
คัดลอกโค้ดด้านล่างทั้งหมดไปวางในไฟล์ชื่อเช่น index.html แล้วเปิดในเบราว์เซอร์ คุณจะได้สนามฝึก SQL ส่วนตัวทันที ลองเล่นกับ ORDER BY แบบต่าง ๆ ที่คุณเพิ่งได้เรียนรู้!
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>แบบฝึกหัด SQL ด้วย ORDER BY</title>
<style>
body { font-family: sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1, h2 { color: #444; }
textarea { width: 100%; height: 150px; font-family: monospace; font-size: 16px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }
button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
button:hover { background-color: #0056b3; }
#result-container { margin-top: 1.5rem; }
table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
#error-message { color: red; font-weight: bold; }
</style>
</head>
<body>
<h1>เรียน SQL แบบลงมือทำ! สนามฝึก ORDER BY</h1>
<p>พิมพ์คำสั่ง SQL ในช่องด้านล่าง แล้วคลิกปุ่ม “รัน SQL” ระบบจะทำงานกับตาราง <code>products</code></p>
<textarea id="sql-input">-- พิมพ์ SQL ที่นี่! ลองคำสั่งต่าง ๆ ดูนะ
SELECT * FROM products ORDER BY price DESC;</textarea>
<button onclick="executeQuery()">รัน SQL</button>
<h2>ผลลัพธ์</h2>
<div id="result-container"></div>
<div id="error-message"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
<script>
let db;
async function initDb() {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
// สร้างตารางและใส่ข้อมูลตัวอย่าง
const createTableSQL = `
CREATE TABLE products (
id INT,
name VARCHAR(255),
category VARCHAR(255),
price INT,
release_date DATE
);
INSERT INTO products (id, name, category, price, release_date) VALUES
(1, 'หมอนนุ่มนิ่ม', 'ของแต่งบ้าน', 3200, '2023-04-15'),
(2, 'ที่ครอบหูช่วยโฟกัส', 'แกดเจ็ต', 7800, '2023-11-01'),
(3, 'สมุดจดไอเดีย', 'เครื่องเขียน', 1200, '2022-08-20'),
(4, 'คีย์บอร์ดมีไฟ', 'แกดเจ็ต', 15000, '2023-06-30'),
(5, 'เก้าอี้นั่งสบายสุดๆ', 'ของแต่งบ้าน', 32000, '2022-11-10'),
(6, 'ปากกาลื่นไหล', 'เครื่องเขียน', 1200, '2023-09-01'),
(7, 'แก้วมัคสำหรับครีเอเตอร์', 'เครื่องครัว', 2500, '2023-04-15');
`;
db.run(createTableSQL);
// รันคำสั่งเริ่มต้น
executeQuery();
}
function executeQuery() {
const sqlInput = document.getElementById('sql-input').value;
const resultContainer = document.getElementById('result-container');
const errorMessage = document.getElementById('error-message');
resultContainer.innerHTML = '';
errorMessage.innerHTML = '';
try {
const results = db.exec(sqlInput);
if (results.length > 0) {
resultContainer.appendChild(createTable(results[0]));
} else {
resultContainer.innerHTML = '<p>รันคำสั่งสำเร็จ แต่ไม่มีข้อมูลแสดงกลับ (เช่น CREATE TABLE, INSERT)</p>';
}
} catch (e) {
errorMessage.textContent = 'เกิดข้อผิดพลาด: ' + 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(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(rowData => {
const tr = document.createElement('tr');
rowData.forEach(cellData => {
const td = document.createElement('td');
td.textContent = cellData;
tr.appendChild(td);
});
tbody.appendChild(tr);
});
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
initDb();
</script>
</body>
</html>
รู้ไว้ไม่เสียหาย! ข้อควรระวังในการใช้ ORDER BY
สุดท้ายนี้ เราจะมาแนะนำจุดที่ควรระวังและเทคนิคเล็ก ๆ น้อย ๆ ที่มีประโยชน์เมื่อใช้งาน ORDER BY
การจัดการกับค่า NULL
หากข้อมูลมีค่า NULL (ไม่มีค่า) อยู่ ORDER BY จะจัดการกับค่านี้อย่างไร? พฤติกรรมนี้ขึ้นอยู่กับประเภทของฐานข้อมูลที่ใช้ แต่โดยทั่วไปแล้ว NULL จะถูกจัดให้อยู่ที่จุดเริ่มต้น (NULLS FIRST) หรือจุดสิ้นสุด (NULLS LAST) ของผลลัพธ์ ดังนั้นหากคอลัมน์ที่ใช้จัดเรียงมีโอกาสมีค่า NULL แนะนำให้ทดสอบล่วงหน้าเพื่อหลีกเลี่ยงลำดับที่ไม่คาดคิด
เกี่ยวกับประสิทธิภาพ
หากคุณต้องจัดเรียงข้อมูลจำนวนมากเป็นล้านรายการด้วย ORDER BY อาจทำให้โหลดของฐานข้อมูลเพิ่มขึ้นและทำให้การประมวลผลช้าลง โดยเฉพาะเมื่อจัดเรียงด้วยคอลัมน์ที่ไม่ได้สร้างดัชนี (index) ไว้ หากมีคอลัมน์ที่มักใช้จัดเรียงบ่อย ๆ การสร้าง index อาจช่วยเพิ่มความเร็วในการแสดงผลได้มาก แม้จะเป็นหัวข้อที่ลึกขึ้นเล็กน้อย แต่ควรทราบไว้
สามารถจัดเรียงโดยใช้คอลัมน์ที่ไม่ได้อยู่ใน SELECT ได้
แม้จะดูแปลกไปบ้าง แต่ ORDER BY สามารถใช้คอลัมน์ที่ไม่ได้อยู่ในคำสั่ง SELECT มาทำการจัดเรียงได้ เช่น แสดงเฉพาะชื่อสินค้าและราคา แต่ต้องการจัดเรียงตามวันที่วางจำหน่ายล่าสุด
-- แสดงเฉพาะ name และ price แต่จัดเรียงด้วย release_date
SELECT name, price FROM products ORDER BY release_date DESC;
ความสามารถในการแยกข้อมูลที่แสดงออกจากข้อมูลที่ใช้จัดเรียงนี้ เป็นหนึ่งในจุดแข็งของ SQL
สรุป: มาเป็นมือโปร ORDER BY แล้วก้าวไปอีกขั้นของการใช้งานข้อมูล!
ในบทความนี้ เราได้เรียนรู้เกี่ยวกับคำสั่ง ORDER BY ใน SQL ตั้งแต่พื้นฐาน การจัดเรียงหลายเงื่อนไข ไปจนถึงเทคนิคขั้นสูง มาทบทวนกันอีกครั้ง
- ใช้คำสั่ง
ORDER BYเพื่อจัดเรียงผลลัพธ์จากฐานข้อมูล - ลำดับจากน้อยไปมากเป็นค่าปกติ
ASCสามารถละไว้ได้ - หากต้องการลำดับจากมากไปน้อย ต้องใส่
DESCหลังชื่อคอลัมน์ - สามารถจัดเรียงด้วยหลายคอลัมน์โดยคั่นด้วยเครื่องหมายคอมมา (,) คอลัมน์ที่อยู่ข้างหน้ามีความสำคัญมากกว่า
ORDER BY เป็นทักษะสำคัญในการแสดงข้อมูลจากฐานข้อมูลให้อ่านง่าย เข้าใจง่าย ลองใช้โค้ดตัวอย่างและระบบจำลองที่แนบไว้ในบทความนี้เพื่อฝึกฝนจัดเรียงข้อมูลหลายแบบให้คล่องขึ้น แล้วคุณจะสนุกกับการทำเว็บและวิเคราะห์ข้อมูลมากยิ่งขึ้น!