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

จัดเรียงด้วยนิพจน์และนามแฝง

กรณีที่สามารถอ้างอิงนามแฝงใน ORDER BY ได้ และวิธีจัดเรียงตามตรรกะที่คำนวณแล้ว

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

ORDER BY ยืดหยุ่นกว่าที่คิด

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

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

เหตุใดนามแฝงจึงใช้ใน ORDER BY ได้

ทบทวนลำดับการทำงานเชิงตรรกะ: FROM, WHERE, GROUP BY, HAVING, SELECT แล้วจึงเป็น ORDER BY เนื่องจาก SELECT ทำงานก่อน ORDER BY นามแฝงคอลัมน์ที่คุณกำหนดใน SELECT จึงมีอยู่แล้วเมื่อ ORDER BY ทำการประเมิน

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

SELECT name, salary * 12 AS annual_pay
FROM employees
ORDER BY annual_pay DESC;

เรียงลำดับด้วยนิพจน์ดิบ

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

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

SELECT name, salary * 12 AS annual_pay
FROM employees
ORDER BY salary * 12 DESC;

เรียงลำดับด้วยตำแหน่งคอลัมน์ (ลำดับเลข)

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

คำแนะนำในการสัมภาษณ์: ควรรู้ว่าวิธีนี้มีอยู่ และโดยทั่วไปไม่แนะนำให้ใช้ในโค้ดใช้งานจริงเพื่อความอ่านง่ายและปลอดภัย

SELECT name, hire_date
FROM employees
ORDER BY 2 DESC;

เรียงลำดับด้วย CASE ที่คำนวณขึ้น

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

CASE จะสร้างอันดับสำหรับการเรียงลำดับซึ่งไม่มีคอลัมน์ของตัวเอง ระบบฐานข้อมูลจะประเมินค่านี้เพื่อใช้จัดลำดับเท่านั้น

SELECT name, salary
FROM employees
ORDER BY CASE WHEN salary >= 100000 THEN 0 ELSE 1 END,
         salary DESC;

การเรียงลำดับหมวดหมู่แบบกำหนดเอง

คอลัมน์สถานะแทบไม่เคยเรียงตามตัวอักษรได้อย่างเหมาะสม "ใช้งานอยู่, รอดำเนินการ, ปิดแล้ว" เมื่อเรียงตามตัวอักษรจะกลายเป็น "ใช้งานอยู่, ปิดแล้ว, รอดำเนินการ" ซึ่งไม่ถูกต้อง CASE จะจับคู่ค่าแต่ละค่ากับอันดับที่กำหนดไว้อย่างชัดเจน

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

SELECT id, status
FROM orders
ORDER BY CASE status
           WHEN 'active'  THEN 1
           WHEN 'pending' THEN 2
           WHEN 'closed'  THEN 3
           ELSE 4
         END;

เรียงลำดับด้วยผลลัพธ์ของฟังก์ชัน

ฟังก์ชันสเกลาร์ใด ๆ ก็ใช้ใน ORDER BY ได้ ตัวอย่างเช่น เรียงโดยไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ด้วย LOWER หรือเรียงตามความยาวข้อความ หรือส่วนของวันที่

โปรดทราบว่า การห่อคอลัมน์ด้วยฟังก์ชันระหว่างการเรียงลำดับอาจทำให้ระบบฐานข้อมูลไม่สามารถใช้ดัชนีของคอลัมน์นั้นได้ เช่นเดียวกับที่เกิดขึ้นใน WHERE

SELECT name
FROM employees
ORDER BY LOWER(name) ASC;

นามแฝงกับค่ารวมในคิวรี GROUP BY

ในคิวรีแบบจัดกลุ่ม คุณมักเรียงลำดับด้วยค่ารวม คุณสามารถอ้างอิงนามแฝงของค่ารวมใน ORDER BY ได้อีกครั้ง เพราะ SELECT ทำงานก่อน

คิวรีด้านล่างนับรายการสั่งซื้อของลูกค้าแต่ละรายและเรียงตามจำนวนนั้นจากมากไปน้อย โดยใช้นามแฝง order_count

SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id
ORDER BY order_count DESC;

จุดพลาดเมื่อนามแฝงชนกับชื่อคอลัมน์

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

หากคุณตั้งนามแฝงให้ salary * 2 AS salary แล้วใช้ ORDER BY salary ระบบจะเรียงตามค่าที่เพิ่มเป็นสองเท่า ไม่ใช่คอลัมน์ต้นทาง หลีกเลี่ยงการใช้ชื่อคอลัมน์ซ้ำเป็นนามแฝงเพื่อป้องกันความกำกวมนี้

SELECT salary * 2 AS salary
FROM employees
ORDER BY salary;

ผสมนิพจน์และทิศทางการเรียงลำดับ

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

การวางคีย์หลายชั้นเช่นนี้เป็นพื้นฐานสำคัญของคิวรีรายงานที่ใช้จริง

SELECT name, salary,
       salary * 0.1 AS bonus
FROM employees
ORDER BY bonus DESC, name ASC;

ข้อควรระวังด้านความเข้ากันได้ข้ามระบบ

แม้นิพจน์และนามแฝงใน ORDER BY จะได้รับการรองรับอย่างกว้างขวาง แต่มีข้อควรทราบบางประการสำหรับการสัมภาษณ์:

  • ตำแหน่งลำดับเลข (ORDER BY 2) เป็นมาตรฐาน แต่ไม่แนะนำให้ใช้
  • การมองเห็นนามแฝงใน ORDER BY สอดคล้องกันในระบบฐานข้อมูลหลัก ๆ ต่างจากใน WHERE/HAVING
  • SELECT DISTINCT มีข้อจำกัด: คุณสามารถใช้ ORDER BY ได้เฉพาะนิพจน์ที่ปรากฏอยู่ในรายการ SELECT เท่านั้น

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

เชื่อมโยงการมองเห็นชื่อแทนเข้ากับลำดับการทำงาน

สรุป

การเรียงลำดับด้วยนิพจน์และชื่อแทน:

  • ORDER BY รองรับชื่อแทน นิพจน์โดยตรง ฟังก์ชัน ตรรกะของ CASE และตำแหน่งตามลำดับ
  • ชื่อแทนใช้งานได้เพราะ ORDER BY ทำงาน หลังจาก SELECT ตามลำดับเชิงตรรกะ
  • ใช้ CASE สำหรับการจัดลำดับหมวดหมู่แบบกำหนดเอง
  • หลีกเลี่ยงชื่อแทนที่ซ้ำกับชื่อคอลัมน์จริง เพื่อป้องกันความกำกวม
  • ฟังก์ชันในคีย์การเรียงลำดับอาจทำให้ไม่สามารถใช้ดัชนีได้

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

บทเรียน “จัดเรียงด้วยนิพจน์และนามแฝง” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “จัดเรียงด้วยนิพจน์และนามแฝง”

กรณีที่สามารถอ้างอิงนามแฝงใน ORDER BY ได้ และวิธีจัดเรียงตามตรรกะที่คำนวณแล้ว คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “จัดเรียงด้วยนิพจน์และนามแฝง” ใช้เวลานานแค่ไหน

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

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

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

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

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