0Pricing
SQL Interview Prep · บทเรียน

การจัดเรียงหลายคอลัมน์และตำแหน่งของ NULL

การผสม ASC/DESC และความแตกต่างของ NULLS FIRST/LAST ในฐานข้อมูลแต่ละระบบ

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

เหตุใดการเรียงลำดับจึงปรากฏในการสัมภาษณ์

ผู้สัมภาษณ์มักเริ่มด้วย ORDER BY เพราะหัวข้อนี้แสดงให้เห็นว่าคุณเข้าใจหรือไม่ว่าชุดผลลัพธ์ของภาษาค้นข้อมูลไม่มีลำดับโดยปริยาย หากไม่ระบุการเรียงลำดับอย่างชัดเจน ฐานข้อมูลก็มีอิสระที่จะส่งแถวกลับมาในลำดับใดก็ได้ตามที่เห็นสมควร

คำถามเปิดที่พบบ่อยคือ: “คุณจะรับประกันได้อย่างไรว่าแถวจะกลับมาในลำดับที่กำหนด” คำตอบที่ถูกต้องเพียงอย่างเดียวคือใช้ส่วนคำสั่ง ORDER BY อย่างชัดเจน การพึ่งพาลำดับการเพิ่มข้อมูล ลำดับของกุญแจหลัก หรือลำดับของดัชนี เป็นความผิดพลาดแบบผู้เริ่มต้นที่พบบ่อย

ในบทเรียนนี้ คุณจะเชี่ยวชาญการเรียงลำดับหลายคอลัมน์และคำถามชวนสับสนว่า ค่า NULL จะไปอยู่ที่ใด

พื้นฐาน ASC และ DESC

ORDER BY จะเรียงจากน้อยไปมาก (ASC) โดยปริยาย คุณต้องใช้ DESC เฉพาะเมื่อต้องการกลับทิศทางเท่านั้น ทิศทางจะมีผลแยกกันในแต่ละคอลัมน์ ไม่ใช่กับส่วนคำสั่งทั้งหมด

เคล็ดลับในการสัมภาษณ์: ระบุว่า ASC เป็นค่าเริ่มต้นโดยปริยาย เพื่อที่คุณจะได้ไม่ต้องเขียนกำกับ ผู้สมัครจำนวนมากเข้าใจผิดว่าการเขียน DESC เพียงครั้งเดียวจะกลับทิศทางของทุกคอลัมน์

SELECT name, hire_date
FROM employees
ORDER BY hire_date DESC;

การเรียงลำดับด้วยหลายคอลัมน์

ระบุหลายคอลัมน์โดยคั่นด้วยจุลภาค ภาษาค้นข้อมูลจะเรียงตามคอลัมน์แรกก่อน จากนั้นใช้คอลัมน์ที่สองตัดสินกรณีที่ค่าเท่ากัน แล้วจึงทำเช่นนี้ต่อไป ลองนึกภาพว่าเป็นสายโซ่สำหรับตัดสินกรณีเสมอกัน

ตัวอย่างนี้เรียงตามแผนกด้วยลำดับตัวอักษร และภายในแต่ละแผนกจะเรียงเงินเดือนจากมากไปน้อย

  • การเรียงลำดับหลัก: department จากน้อยไปมาก
  • การตัดสินกรณีเสมอ: salary จากมากไปน้อย
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;

การผสม ASC และ DESC

กับดักในการสัมภาษณ์ที่พบบ่อยคือ แต่ละคอลัมน์จะมีทิศทางเป็นของตัวเอง การเขียน ORDER BY a, b DESC จะเรียง a จากน้อยไปมาก และ b จากมากไปน้อย ไม่ใช่เรียงทั้งสองคอลัมน์จากมากไปน้อย

หากต้องการให้ทั้งสองคอลัมน์เรียงจากมากไปน้อย คุณต้องเขียน ORDER BY a DESC, b DESC อย่างชัดเจนเมื่อคำถามกำหนดทิศทางแบบผสม

SELECT region, sales_year, revenue
FROM sales
ORDER BY region ASC, sales_year DESC;

NULL จะไปอยู่ที่ใด

นี่คือหัวใจของบทเรียน NULL หมายถึง ไม่ทราบค่า ดังนั้นมาตรฐานจึงไม่ได้บังคับตำแหน่งไว้ และฐานข้อมูลแต่ละระบบก็มีค่าเริ่มต้นไม่เหมือนกัน:

  • PostgreSQL และออราเคิล: NULL จะอยู่ท้ายเมื่อใช้ ASC และอยู่ต้นเมื่อใช้ DESC
  • MySQL และเซิร์ฟเวอร์เอสคิวแอล: NULL จะอยู่ต้นเมื่อใช้ ASC และอยู่ท้ายเมื่อใช้ DESC (ถือว่าเป็นค่าที่เล็กที่สุด)

ผู้สัมภาษณ์ชอบถามว่า “NULL จะปรากฏที่ใดในการเรียงลำดับนี้” คำตอบที่ตรงไปตรงมาคือ ขึ้นอยู่กับระบบฐานข้อมูล เว้นแต่คุณจะควบคุมตำแหน่งนั้นอย่างชัดเจน

ควบคุมตำแหน่งของ NULL อย่างชัดเจน

หากต้องการให้ตำแหน่งแน่นอนโดยไม่ขึ้นกับค่าเริ่มต้นของระบบฐานข้อมูล ให้ใช้ NULLS FIRST หรือ NULLS LAST PostgreSQL ออราเคิล และเอสคิวไลต์รองรับคำสั่งนี้โดยตรง

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

SELECT name, hire_date
FROM employees
ORDER BY hire_date ASC NULLS LAST;

จำลอง NULLS LAST ใน MySQL

MySQL ไม่รองรับคำหลัก NULLS LAST วิธีแก้ที่ใช้ได้กับหลายระบบคือสร้างคีย์การเรียงลำดับตัวแรกเพื่อระบุว่าค่านั้นเป็น NULL หรือไม่

นิพจน์ hire_date IS NULL จะคืนค่า 0 สำหรับวันที่จริง และคืนค่า 1 สำหรับ NULL การเรียงนิพจน์นี้จากน้อยไปมากจะดัน NULL ไปไว้ท้าย จากนั้นคีย์ตัวที่สองจึงเรียงวันที่จริง

SELECT name, hire_date
FROM employees
ORDER BY (hire_date IS NULL) ASC, hire_date ASC;

จำลอง NULLS FIRST ในเซิร์ฟเวอร์เอสคิวแอล

เซิร์ฟเวอร์เอสคิวแอลก็ไม่มี NULLS FIRST/LAST เช่นกัน ให้ใช้นิพจน์ CASE เป็นคีย์การเรียงลำดับตัวแรก ในที่นี้ NULL จะได้รับลำดับ 0 จึงปรากฏก่อน

รูปแบบนี้ควรจดจำไว้: การวางคอลัมน์ธงที่คำนวณขึ้นไว้หน้าคอลัมน์ที่ใช้เรียงจริง ช่วยให้คุณควบคุมตำแหน่งของ NULL ได้อย่างสมบูรณ์ในภาษาถิ่นใดก็ตาม

SELECT name, hire_date
FROM employees
ORDER BY CASE WHEN hire_date IS NULL THEN 0 ELSE 1 END,
         hire_date ASC;

ตัวอย่างพร้อมคำอธิบาย: กระดานจัดอันดับ

สมมติว่าคุณกำลังสร้างกระดานจัดอันดับ โดยให้คะแนนสูงสุดอยู่ก่อน และหากคะแนนเท่ากัน ผู้เล่นที่ลงทะเบียนก่อนจะมีอันดับสูงกว่า ผู้เล่นที่ไม่เคยได้คะแนนเลย (คะแนนเป็น NULL) ควรอยู่ด้านล่าง

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

SELECT player, score, signup_date
FROM players
ORDER BY (score IS NULL) ASC,
         score DESC,
         signup_date ASC;

ข้อควรระวังเรื่องความคงที่ของการเรียงลำดับ

อีกคำถามยอดนิยมคือ “หากสองแถวมีค่าเท่ากันในทุกคีย์ของ ORDER BY ทั้งสองแถวจะกลับมาในลำดับใด”

คำตอบคือ ไม่กำหนด การเรียงลำดับของภาษาค้นข้อมูลไม่รับประกันว่าจะคงที่ ดังนั้นแถวที่เท่ากันอาจปรากฏในลำดับสัมพัทธ์ใดก็ได้ และลำดับนั้นอาจเปลี่ยนระหว่างการทำงานแต่ละครั้งหรือหลังจากเปลี่ยนดัชนี

วิธีแก้คือเพิ่มตัวตัดสินกรณีเสมอที่มีค่าไม่ซ้ำกันอย่างสมบูรณ์ ซึ่งโดยทั่วไปมักเป็นกุญแจหลัก เพื่อให้ได้ผลลัพธ์ที่ทำซ้ำได้

SELECT id, name, salary
FROM employees
ORDER BY salary DESC, id ASC;

หมายเหตุด้านประสิทธิภาพของการเรียงลำดับ

การเรียงลำดับอาจใช้ทรัพยากรมาก หาก ORDER BY ตรงกับดัชนีที่มีอยู่แล้วทั้งในลำดับคอลัมน์และทิศทาง ระบบฐานข้อมูลก็สามารถอ่านแถวที่เรียงไว้แล้วและข้ามขั้นตอนการเรียงลำดับแยกต่างหากได้

ทิศทางที่ไม่ตรงกัน เช่น ดัชนีเรียงจากน้อยไปมากทั้งหมด แต่คุณเรียงคอลัมน์หนึ่งจากมากไปน้อย มักทำให้ใช้วิธีนี้ไม่ได้ และบังคับให้เรียงลำดับในหน่วยความจำหรือบนดิสก์ การกล่าวถึงความเชื่อมโยงระหว่างลำดับของดัชนีกับต้นทุนการเรียงลำดับจะแสดงให้ผู้สัมภาษณ์เห็นถึงความเข้าใจในระดับสูง

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

ทดสอบความเข้าใจของคุณเกี่ยวกับกฎทิศทางในการเรียงลำดับหลายคอลัมน์

สรุปทบทวน

ประเด็นสำคัญเกี่ยวกับการเรียงลำดับหลายคอลัมน์และตำแหน่งของ NULL:

  • ชุดผลลัพธ์ไม่มีลำดับ เว้นแต่คุณจะเพิ่ม ORDER BY
  • ทิศทางกำหนดแยกกันในแต่ละคอลัมน์ โดย ASC เป็นค่าเริ่มต้น
  • ตำแหน่งของ NULL แตกต่างกันตามระบบ: อยู่ท้ายเมื่อใช้ ASC ใน PostgreSQL และออราเคิล แต่อยู่ต้นเมื่อใช้ ASC ใน MySQL และเซิร์ฟเวอร์เอสคิวแอล
  • ใช้ NULLS FIRST/LAST เมื่อระบบรองรับ หรือใช้ธงนำหน้าจาก IS NULL / CASE ในระบบอื่น
  • เพิ่มตัวตัดสินกรณีเสมอที่มีค่าไม่ซ้ำกัน เช่น กุญแจหลัก เพื่อให้ได้ลำดับที่ทำซ้ำได้

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

บทเรียน “การจัดเรียงหลายคอลัมน์และตำแหน่งของ NULL” ฟรีหรือไม่

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

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

การผสม ASC/DESC และความแตกต่างของ NULLS FIRST/LAST ในฐานข้อมูลแต่ละระบบ คุณปฏิบัติ SQL Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

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

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

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

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

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

  1. การจัดเรียงหลายคอลัมน์และตำแหน่งของ NULL
  2. LIMIT, OFFSET และ FETCH FIRST
  3. ส่งคืนแถว N อันดับแรกอย่างเชื่อถือได้
  4. จัดเรียงด้วยนิพจน์และนามแฝง
← กลับไปที่ SQL Interview Prep