0Pricing
SQL Academy · บทเรียน

การเรียงตามหลายคอลัมน์

ใช้คีย์การเรียงลำดับรองเพื่อจัดการค่าที่เสมอกัน

การเรียงตามหลายคอลัมน์ เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

ปัญหาของค่าที่เท่ากัน

เมื่อเรียงตามคอลัมน์เดียว แถวที่มี ค่าเดียวกัน จะไม่มีการกำหนดลำดับระหว่างกัน ผลิตภัณฑ์สามรายการที่มีราคา 20 เท่ากันอาจถูกส่งกลับมาในลำดับใดก็ได้

หากต้องการให้ลำดับคาดเดาได้อย่างสมบูรณ์ ให้เพิ่มเกณฑ์การเรียงลำดับที่สอง

-- Ties on price are ordered arbitrarily
SELECT name, price
FROM products
ORDER BY price;

การระบุเกณฑ์การเรียงลำดับหลายรายการ

ORDER BY รับรายการคอลัมน์ที่คั่นด้วยจุลภาค ฐานข้อมูลจะเรียงตามคอลัมน์แรก จากนั้นใช้คอลัมน์ที่สองจัดการค่าที่เท่ากัน และทำเช่นนี้ต่อไป

ในที่นี้ ผลิตภัณฑ์จะเรียงตามราคา และรายการที่ราคาเท่ากันจะเรียงตามตัวอักษรของชื่อ

SELECT name, price
FROM products
ORDER BY price, name;

ลำดับของเกณฑ์มีความสำคัญ

ลำดับของคอลัมน์เปลี่ยนผลลัพธ์ได้ ORDER BY price, name ไม่เหมือนกับ ORDER BY name, price

เกณฑ์แรกเป็นการเรียงหลัก ส่วนเกณฑ์ถัดไปจะมีผลเฉพาะเมื่อเกณฑ์ก่อนหน้ามีค่าเท่ากัน

-- Primary sort by category, then by name within each category
SELECT category, name
FROM products
ORDER BY category, name;

ทิศทางแยกตามคอลัมน์

เกณฑ์การเรียงลำดับแต่ละรายการสามารถมีทิศทางของตนเองได้ คุณสามารถผสม ASC และ DESC ได้อย่างอิสระ

คำสั่งนี้จัดกลุ่มตามหมวดหมู่เรียงตามตัวอักษร แต่ภายในแต่ละหมวดหมู่จะแสดงรายการที่แพงที่สุดก่อน

SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC;

DESC มีผลต่อคอลัมน์แต่ละรายการ

ข้อผิดพลาดที่พบบ่อยคือคิดว่า DESC ที่ท้ายคำสั่งจะกลับลำดับทุกอย่าง จริง ๆ แล้วมีผลเฉพาะคอลัมน์ที่อยู่ก่อนหน้าโดยตรงเท่านั้น

ใน ORDER BY category, price DESC category ยังคงเรียงจากน้อยไปมาก ส่วน price เท่านั้นที่เรียงจากมากไปน้อย

-- category: ASC, price: DESC
SELECT category, price
FROM products
ORDER BY category, price DESC;

สามเกณฑ์ขึ้นไป

คุณสามารถต่อเกณฑ์การเรียงลำดับได้มากเท่าที่จำเป็น แต่ละเกณฑ์จะเริ่มมีผลเมื่อเกณฑ์ทั้งหมดก่อนหน้านั้นมีค่าเท่ากัน

เรียงคำสั่งตามวันที่ จากนั้นตามลูกค้า แล้วจึงตามยอดรวมภายในลูกค้าและวันที่เดียวกัน

SELECT created_at, customer_id, total
FROM orders
ORDER BY created_at DESC, customer_id, total DESC;

การเรียงลำดับที่คงที่และกำหนดผลลัพธ์ได้แน่นอน

หากต้องการผลลัพธ์ที่ กำหนดได้แน่นอนอย่างสมบูรณ์ ให้ปิดท้ายเกณฑ์การเรียงลำดับด้วยคอลัมน์ที่มีค่าไม่ซ้ำกัน เช่น คีย์หลัก จากนั้นจะไม่มีแถวใดสองแถวที่มีค่าเท่ากันได้

เรื่องนี้สำคัญต่อการแบ่งหน้า ซึ่งคุณจะได้เรียนรู้ในบทเรียนถัดไป

SELECT id, name, price
FROM products
ORDER BY price DESC, id;

การผสมนิพจน์กับคอลัมน์

เกณฑ์การเรียงลำดับสามารถผสมระหว่างคอลัมน์ทั่วไปกับนิพจน์ได้ แต่ละเกณฑ์ทำงานเป็นอิสระจากกัน

คำสั่งนี้เรียงตามมูลค่าสินค้าคงคลังจากมากไปน้อย แล้วเรียงตามตัวอักษรของชื่อเพื่อใช้ตัดสินกรณีที่ค่าเท่ากัน

SELECT name, price, stock
FROM products
ORDER BY price * stock DESC, name ASC;

การเรียงตามค่าบูลีนเพื่อเลื่อนกลุ่ม

เคล็ดลับที่มีประโยชน์คือใช้การเรียงตามนิพจน์บูลีนเพื่อเลื่อนกลุ่มไปไว้ด้านบนหรือด้านล่าง ใน PostgreSQL false จะเรียงก่อน true

คำสั่งนี้แสดงรายการที่มีสินค้าในสต็อก (stock > 0) ก่อน แล้วจึงแสดงรายการราคาถูกที่สุดภายในแต่ละกลุ่ม

SELECT name, stock, price
FROM products
ORDER BY (stock = 0), price;

การควบคุมตำแหน่งของ NULL

โดยค่าเริ่มต้นใน PostgreSQL NULL จะอยู่ ท้ายสุดเมื่อเรียงจากน้อยไปมาก และอยู่ ต้นสุดเมื่อเรียงจากมากไปน้อย คุณสามารถเปลี่ยนแปลงได้ด้วย NULLS FIRST หรือ NULLS LAST ในเกณฑ์ใดก็ได้

SELECT name, discount
FROM products
ORDER BY discount DESC NULLS LAST;

นำทุกอย่างมาประกอบกัน

การเรียงหลายเกณฑ์ที่ใช้งานจริงอาจผสมทิศทาง นิพจน์ และการจัดการค่า NULL โปรดอ่านจากซ้ายไปขวา เพราะแต่ละเกณฑ์จะช่วยปรับรายละเอียดจากเกณฑ์ก่อนหน้า

SELECT category, name, price, rating
FROM products
ORDER BY category ASC,
         rating DESC NULLS LAST,
         price ASC;

ตรวจสอบความเข้าใจ

พิจารณา ORDER BY category, price DESC

สรุป

สรุปการเรียงตามหลายคอลัมน์:

  • ระบุเกณฑ์การเรียงลำดับโดยคั่นด้วยจุลภาค เกณฑ์ก่อนหน้ามีความสำคัญกว่า
  • แต่ละเกณฑ์มี ASC/DESC ของตนเอง
  • ปิดท้ายด้วยคอลัมน์ที่มีค่าไม่ซ้ำกันเพื่อให้ได้ลำดับที่กำหนดแน่นอน
  • ควบคุมค่าที่หายไปด้วย NULLS FIRST/NULLS LAST

ถัดไป คุณจะจำกัดจำนวนแถวที่ส่งกลับมาด้วย LIMIT และ OFFSET

SELECT category, name, price
FROM products
ORDER BY category ASC, price DESC, id;

คำถามที่พบบ่อย

บทเรียน “การเรียงตามหลายคอลัมน์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การเรียงตามหลายคอลัมน์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การเรียงตามหลายคอลัมน์”

ใช้คีย์การเรียงลำดับรองเพื่อจัดการค่าที่เสมอกัน คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การเรียงตามหลายคอลัมน์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม

ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเรียงลำดับด้วย ORDER BY
  2. การเรียงตามหลายคอลัมน์
  3. LIMIT และ OFFSET
  4. การค้นหาระเบียนอันดับต้น ๆ
← กลับไปที่ SQL Academy