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