🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

พื้นฐานของ 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 เป็นทักษะสำคัญในการแสดงข้อมูลจากฐานข้อมูลให้อ่านง่าย เข้าใจง่าย ลองใช้โค้ดตัวอย่างและระบบจำลองที่แนบไว้ในบทความนี้เพื่อฝึกฝนจัดเรียงข้อมูลหลายแบบให้คล่องขึ้น แล้วคุณจะสนุกกับการทำเว็บและวิเคราะห์ข้อมูลมากยิ่งขึ้น!