การจัดเรียงหลายคอลัมน์และตำแหน่งของ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การจัดเรียงหลายคอลัมน์และตำแหน่งของ NULL
- LIMIT, OFFSET และ FETCH FIRST
- ส่งคืนแถว N อันดับแรกอย่างเชื่อถือได้
- จัดเรียงด้วยนิพจน์และนามแฝง