สั่งซื้อโดยใน MySQL: การค้นหาแบบ ASC และ DESC พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
สั่งซื้อโดยใน MySQL คำสั่งนี้จะเรียงลำดับชุดผลลัพธ์จากน้อยไปมากหรือจากมากไปน้อยโดยใช้คำหลัก ASC และ DESC ส่วนด้านล่างจะอธิบายไวยากรณ์ การเรียงลำดับแบบคอลัมน์เดียวและหลายคอลัมน์ การจัดการค่า NULL และตัวอย่างการใช้งานที่ดำเนินการกับฐานข้อมูลตัวอย่าง myflixdb

ORDER BY คืออะไร? MySQL?
MySQL สั่งโดย เป็นคำสั่งที่ใช้ร่วมกับคำสั่ง SELECT เพื่อจัดเรียงข้อมูลตามลำดับ MySQL คำสั่ง ORDER BY จะเรียงลำดับชุดผลลัพธ์ของคำสั่งค้นหาในลำดับจากน้อยไปมากหรือจากมากไปน้อย โดยอาจเรียงตามคอลัมน์เดียวหรือหลายคอลัมน์พร้อมกันก็ได้
เมื่อใช้คำสั่ง SELECT เพียงอย่างเดียว ข้อมูลจะถูกส่งคืนตามลำดับที่ระบบจัดเก็บข้อมูลอ่านได้ ซึ่งไม่ใช่ลำดับที่รับประกัน การเรียงลำดับคือการจัดเรียงข้อมูลเหล่านั้นใหม่ตามลำดับที่กำหนด สามารถทำได้กับข้อมูลประเภทตัวเลข สตริง และวันที่
MySQL ไวยากรณ์ ORDER BY
ก่อนที่จะดูตัวอย่าง เราควรทำความเข้าใจก่อนว่าข้อความดังกล่าวอยู่ในส่วนใดของคำสั่ง SELECT แบบเต็ม
SELECT statement... [WHERE condition | GROUP BY `field_name(s)` HAVING condition] ORDER BY `field_name(s)` [ASC | DESC];
ที่นี่
- "คำสั่ง SELECT... " คือคำสั่ง select ปกติ
- - - แสดงถึงทางเลือกต่างๆ
- “[เงื่อนไข WHERE | จัดกลุ่มตาม `field_name(s)` ที่มีเงื่อนไข]” เป็นเงื่อนไขเสริมที่ใช้ในการกรองชุดผลลัพธ์ของการค้นหา
- "สั่งโดย" ทำการเรียงลำดับชุดผลลัพธ์การค้นหา
- “[เอเอสซี | รายละเอียด]” เป็นคำหลักที่ใช้ในการเรียงลำดับชุดผลลัพธ์จากน้อยไปมากหรือจากมากไปน้อย โปรดทราบว่า ASC เป็นค่าเริ่มต้น
คำหลัก DESC และ ASC คืออะไร
ASC และ DESC เป็นทิศทางการเรียงลำดับสองแบบที่คำสั่ง ORDER BY รองรับ ตารางด้านล่างเปรียบเทียบทิศทางการเรียงลำดับทั้งสองแบบในประเภทข้อมูลที่คุณจะใช้ในการเรียงลำดับบ่อยที่สุด
ASC เป็นรูปแบบย่อของการขึ้น |
MySQL DESC เป็นรูปแบบย่อของการลงจากมากไปน้อย |
|---|---|
| ใช้เพื่อจัดเรียงผลลัพธ์แบบสอบถามในรูปแบบจากบนลงล่าง | ใช้สำหรับจัดเรียงผลลัพธ์การค้นหาจากล่างขึ้นบน |
| เมื่อทำงานกับชนิดข้อมูลวันที่ วันที่แรกสุดจะแสดงที่ด้านบนของรายการ | เมื่อทำงานกับข้อมูลประเภทวันที่ วันที่ล่าสุดจะแสดงอยู่ด้านบนสุดของรายการ |
| เมื่อทำงานกับชนิดข้อมูลตัวเลข ค่าต่ำสุดจะแสดงที่ด้านบนของรายการ | เมื่อทำงานกับข้อมูลประเภทตัวเลข ค่าสูงสุดจะปรากฏอยู่ด้านบนสุดของชุดผลลัพธ์การค้นหา |
| เมื่อทำงานกับชนิดข้อมูลสตริง ชุดผลลัพธ์คิวรีจะถูกเรียงลำดับจากที่ขึ้นต้นด้วยตัวอักษร A ไปจนถึงตัวอักษร Z | เมื่อทำงานกับชนิดข้อมูลสตริง ชุดผลลัพธ์คิวรีจะถูกเรียงลำดับจากที่ขึ้นต้นด้วยตัวอักษร Z ลงไปถึงตัวอักษร A |
คีย์เวิร์ด SQL DESC และ ASC ต่างก็ใช้ร่วมกับคำสั่ง SELECT และ MySQL เรียงตามข้อ
ไวยากรณ์ DESC และ ASC
คีย์เวิร์ดการเรียงลำดับ SQL DESC มีรูปแบบพื้นฐานดังต่อไปนี้
SELECT {fieldName(s) | *} FROM tableName(s) [WHERE condition] ORDER BY fieldname(s) ASC | DESC [LIMIT N];
ที่นี่
- SELECT {ชื่อฟิลด์ | *} จากชื่อตาราง คือคำสั่งที่มีฟิลด์และตารางที่จะใช้ดึงชุดผลลัพธ์
- [เงื่อนไขอยู่ที่ไหน] เป็นทางเลือกแต่สามารถใช้เพื่อกรองข้อมูลตามเงื่อนไขที่กำหนดได้
- เรียงลำดับตามชื่อฟิลด์ เป็นค่าบังคับและระบุชื่อฟิลด์ที่จะใช้ในการเรียงลำดับ MySQL คำหลัก DESC ระบุว่าการเรียงลำดับเป็นไปตามลำดับจากมากไปน้อย
- [จำกัดจำนวน] เป็นตัวเลือกเสริม แต่สามารถใช้เพื่อจำกัดจำนวนแถวที่แสดงในชุดผลลัพธ์ของการค้นหาได้
เหตุใดจึงใช้ DESC และ ASC ใน MySQL?
การรู้ไวยากรณ์เป็นเพียงครึ่งหนึ่งของภาพรวมทั้งหมด เหตุผลที่ต้องมีคำสั่ง ORDER BY ก็เพราะว่าชุดผลลัพธ์ที่ฐานข้อมูลสร้างได้ง่ายนั้น อาจไม่ใช่เรื่องง่ายสำหรับมนุษย์ที่จะอ่านเสมอไป
สมมติว่าคุณต้องการพิมพ์ประวัติการชำระเงินของสมาชิกห้องสมุดวิดีโอเพื่อให้พนักงานต้อนรับสามารถตอบคำถามได้อย่างรวดเร็ว การแสดงผลการชำระเงินตามลำดับเวลาจากล่าสุดไปยังเก่าที่สุดนั้นดูสมเหตุสมผลกว่ามาก คำว่า DESC ใน SQL จึงเป็นคำหลักที่ใช้ประโยชน์ได้ดีในสถานการณ์เช่นนี้ เพราะสามารถเรียงลำดับรายการตามวันที่ชำระเงินได้
สมมติว่าฝ่ายการตลาดต้องการรายชื่อภาพยนตร์แยกตามหมวดหมู่ เพื่อให้สมาชิกสามารถดูได้ว่าห้องสมุดมีภาพยนตร์เรื่องใดบ้างก่อนที่จะเช่า การเรียงลำดับชื่อหมวดหมู่และชื่อภาพยนตร์จากน้อยไปมากจะช่วยให้สมาชิกค้นหาข้อมูลได้อย่างรวดเร็ว เหมือนกับการค้นหาในสารบัญ คำหลัก ASC จึงตอบโจทย์นี้ได้
โดยสรุปแล้ว คำสั่ง ORDER BY จะแปลงชุดผลลัพธ์ดิบให้เป็นรายงาน คำหลักที่คุณเลือกจะขึ้นอยู่กับคำถามที่ผู้อ่านถาม: เกิดอะไรขึ้นล่าสุด เรียกร้องให้ใช้ DESC ในขณะที่ ฉันจะหาซื้อสินค้าชิ้นนี้ได้ที่ไหน เรียกร้องให้มี ASC
MySQL ตัวอย่างการเรียงลำดับตาม
ตัวอย่างทั้งหมดต่อไปนี้จะทำงานกับฐานข้อมูลตัวอย่าง myflixdb เริ่มต้นด้วยตารางสมาชิกที่ยังไม่ได้เรียงลำดับ ซึ่งจะแสดงผลในลำดับเริ่มต้น
SELECT * FROM members;
ดำเนินการสคริปต์ข้างต้นใน MySQL การทดสอบด้วย Workbench กับ myflixdb ให้ผลลัพธ์ดังที่แสดงด้านล่าง
| หมายเลขสมาชิก | full_names | เพศ | วันเกิด | ทางกายภาพ_ที่อยู่ | ที่อยู่ไปรษณีย์ | หมายเลขติดต่อ | อีเมล |
|---|---|---|---|---|---|---|---|
| 1 | เจเน็ต โจนส์ | หญิง | 21-07-1980 | ถนนสายแรก แปลงที่ 4 | กระเป๋าส่วนตัว | 0759 253 542 | janetjones@yagoo.cm |
| 2 | เจเน็ต สมิธ โจนส์ | หญิง | 23-06-1980 | เมลโรส 123 | NULL | NULL | jj@fstreet.com |
| 3 | โรเบิร์ต ฟิล | ชาย | 12-07-1989 | 3 ถนน 34 | NULL | 12345 | rm@tstreet.com |
| 4 | กลอเรียวิลเลียมส์ | หญิง | 14-02-1984 | 2 ถนน 23 | NULL | NULL | NULL |
| 5 | ลีโอนาร์ด ฮอฟสตัดเตอร์ | ชาย | NULL | วู้ดเครสต์ | NULL | 845738767 | NULL |
| 6 | เชลดอนคูเปอร์ | ชาย | NULL | วู้ดเครสต์ | NULL | 976736763 | NULL |
| 7 | ราชสีห์ คูทรพาลี | ชาย | NULL | วู้ดเครสต์ | NULL | 938867763 | NULL |
| 8 | เลสลี่ วิงเคิล | ชาย | 14-02-1984 | วู้ดเครสต์ | NULL | 987636553 | NULL |
| 9 | ฮาวเวิร์ด โวโลวิทซ์ | ชาย | 24-08-1981 | SouthPark | PO Box 4563 | 987786553 | NULL |
การเรียงลำดับจากมากไปน้อยด้วย DESC
สมมติว่าฝ่ายการตลาดต้องการให้ข้อมูลสมาชิกเรียงลำดับจากวันเกิดที่มากที่สุดไปน้อยที่สุด เพื่อช่วยให้ทีมสามารถส่งคำอวยพรวันเกิดได้ทันท่วงที รายชื่อดังกล่าวได้มาจากการใช้คำสั่งค้นหาด้านล่าง
SELECT * FROM members ORDER BY date_of_birth DESC;
ดำเนินการสคริปต์ข้างต้นใน MySQL การทดสอบด้วย Workbench กับ myflixdb ให้ผลลัพธ์ดังที่แสดงด้านล่าง
เรียงลำดับจากน้อยไปมาก (ASC)
การค้นหาแบบเดียวกันในลำดับจากน้อยไปมาก เพียงแค่สลับคำหลักเท่านั้น
SELECT * FROM members ORDER BY date_of_birth ASC;
หมายเหตุ NULL หมายถึงไม่มีค่าใดๆ เลย ซึ่งไม่เหมือนกับศูนย์หรือสตริงว่าง สังเกตในภาพหน้าจอทั้งสองภาพว่าวันที่ที่เป็น NULL ถูกจัดกลุ่มไว้ด้วยกันอย่างไร: MySQL ระบบจะถือว่าค่า NULL มีค่าต่ำกว่าค่าอื่นๆ ดังนั้นแถวที่มีค่า NULL จะปรากฏก่อนในลำดับ ASC และแถวที่มีค่า NULL จะปรากฏทีหลังในลำดับ DESC
วิธีการเรียงลำดับตามหลายคอลัมน์ใน MySQL
การเรียงลำดับตามคอลัมน์เดียวจะตอบคำถามง่ายๆ แต่โดยทั่วไปแล้วรายงานมักต้องการการเรียงลำดับในระดับที่สอง และคำสั่ง ORDER BY สามารถรับรายการฟิลด์ที่คั่นด้วยเครื่องหมายจุลภาคเพื่อจุดประสงค์นั้นได้
พิจารณาสคริปต์การเรียงลำดับ SQL ต่อไปนี้ ซึ่งแสดงรายการบันทึกสมาชิกทั้งหมดโดยไม่มีคำสั่งกำหนดทิศทางที่ชัดเจน
SELECT * FROM `members`;
เมื่อดำเนินการสคริปต์ข้างต้นจะได้ผลลัพธ์ดังแสดงด้านล่าง
| หมายเลขสมาชิก | full_names | เพศ | วันเกิด | ทางกายภาพ_ที่อยู่ | ที่อยู่ไปรษณีย์ | หมายเลขติดต่อ | อีเมล |
|---|---|---|---|---|---|---|---|
| 1 | เจเน็ต โจนส์ | หญิง | 21-07-1980 | ถนนสายแรก แปลงที่ 4 | กระเป๋าส่วนตัว | 0759 253 542 | janetjones@yagoo.cm |
| 2 | เจเน็ต สมิธ โจนส์ | หญิง | 23-06-1980 | เมลโรส 123 | NULL | NULL | jj@fstreet.com |
| 3 | โรเบิร์ต ฟิล | ชาย | 12-07-1989 | 3 ถนน 34 | NULL | 12345 | rm@tstreet.com |
| 4 | กลอเรียวิลเลียมส์ | หญิง | 14-02-1984 | 2 ถนน 23 | NULL | NULL | NULL |
| 5 | ลีโอนาร์ด ฮอฟสตัดเตอร์ | ชาย | NULL | วู้ดเครสต์ | NULL | 845738767 | NULL |
| 6 | เชลดอนคูเปอร์ | ชาย | NULL | วู้ดเครสต์ | NULL | 976736763 | NULL |
| 7 | ราชสีห์ คูทรพาลี | ชาย | NULL | วู้ดเครสต์ | NULL | 938867763 | NULL |
| 8 | เลสลี่ วิงเคิล | ชาย | 14-02-1984 | วู้ดเครสต์ | NULL | 987636553 | NULL |
| 9 | ฮาวเวิร์ด โวโลวิทซ์ | ชาย | 24-08-1981 | SouthPark | PO Box 4563 | 987786553 | NULL |
การเรียงลำดับคอลัมน์เดียวตามลำดับเริ่มต้น
สมมติว่าเราต้องการรายการที่เรียงลำดับชุดผลลัพธ์การค้นหาโดยใช้ฟิลด์เพศ สคริปต์ด้านล่างนี้ทำเช่นนั้นโดยไม่ต้องระบุทิศทาง
SELECT * FROM `members` ORDER BY `gender`;
| หมายเลขสมาชิก | full_names | เพศ | วันเกิด | ทางกายภาพ_ที่อยู่ | ที่อยู่ไปรษณีย์ | หมายเลขติดต่อ | อีเมล |
|---|---|---|---|---|---|---|---|
| 1 | เจเน็ต โจนส์ | หญิง | 21-07-1980 | ถนนสายแรก แปลงที่ 4 | กระเป๋าส่วนตัว | 0759 253 542 | janetjones@yagoo.cm |
| 2 | เจเน็ต สมิธ โจนส์ | หญิง | 23-06-1980 | เมลโรส 123 | NULL | NULL | jj@fstreet.com |
| 4 | กลอเรียวิลเลียมส์ | หญิง | 14-02-1984 | 2 ถนน 23 | NULL | NULL | NULL |
| 3 | โรเบิร์ต ฟิล | ชาย | 12-07-1989 | 3 ถนน 34 | NULL | 12345 | rm@tstreet.com |
| 5 | ลีโอนาร์ด ฮอฟสตัดเตอร์ | ชาย | NULL | วู้ดเครสต์ | NULL | 845738767 | NULL |
| 6 | เชลดอนคูเปอร์ | ชาย | NULL | วู้ดเครสต์ | NULL | 976736763 | NULL |
| 7 | ราชสีห์ คูทรพาลี | ชาย | NULL | วู้ดเครสต์ | NULL | 938867763 | NULL |
| 8 | เลสลี่ วิงเคิล | ชาย | 14-02-1984 | วู้ดเครสต์ | NULL | 987636553 | NULL |
| 9 | ฮาวเวิร์ด โวโลวิทซ์ | ชาย | 24-08-1981 | SouthPark | PO Box 4563 | 987786553 | NULL |
สมาชิกที่เป็น "เพศหญิง" จะแสดงก่อน ตามด้วยสมาชิกที่เป็น "เพศชาย" ทั้งนี้เนื่องจากเมื่อใช้คำสั่ง ORDER BY โดยไม่ระบุ ASC หรือ MySQL คำหลัก DESC, MySQL โดยค่าเริ่มต้น ระบบจะเรียงลำดับชุดผลลัพธ์การค้นหาจากน้อยไปมาก
การเรียงลำดับสองคอลัมน์ในทิศทางตรงกันข้าม
ต่อไปนี้เรามาดูตัวอย่างที่แสดงการทำงานดังกล่าวกัน การเรียงลำดับโดยใช้สองคอลัมน์คอลัมน์แรกคือ เรียง in ลำดับจากน้อยไปมาก โดยค่าเริ่มต้น ในขณะที่คอลัมน์ที่สองคือ เรียง in ลำดับจากมากไปน้อย.
SELECT * FROM `members` ORDER BY `gender`, `date_of_birth` DESC;
ดำเนินการสคริปต์ข้างต้นใน MySQL การทดสอบด้วย Workbench กับ myflixdb ให้ผลลัพธ์ดังต่อไปนี้
โดยค่าเริ่มต้น คอลัมน์เพศจะถูกจัดเรียงจากน้อยไปมาก ในขณะที่คอลัมน์วันเกิดจะถูกจัดเรียงจากมากไปน้อยอย่างชัดเจน คำสำคัญแสดงทิศทางแต่ละคำจะใช้ได้เฉพาะกับคอลัมน์ที่ตามมาเท่านั้น
วิธีการใช้คำสั่ง ORDER BY ร่วมกับ WHERE, LIMIT และ GROUP BY
โดยปกติแล้ว ORDER BY ไม่ใช่เงื่อนไขเดียวในคำสั่งค้นหาข้อมูลที่ใช้ในการผลิต MySQL โปรแกรมจะประเมินข้อความตามลำดับที่กำหนดไว้เสมอ และการทราบลำดับนั้นจะช่วยอธิบายว่าทำไมผลลัพธ์จึงออกมาเป็นเช่นนั้น
- จาก อ่านข้อมูลแต่ละแถวจากตาราง
- WHERE ลบแถวที่ไม่ตรงตามเงื่อนไขออก
- จัดกลุ่มตาม คำสั่งนี้จะรวมแถวที่เหลืออยู่เข้าด้วยกันเป็นกลุ่ม จากนั้นคำสั่ง HAVING จะกรองกลุ่มเหล่านั้น
- สั่งโดย เรียงลำดับตามแถวที่เหลืออยู่
- LIMIT ตัดแถวตามจำนวนที่ต้องการออกจากรายการที่เรียงลำดับแล้ว
เนื่องจากคำสั่ง ORDER BY ทำงานหลัง WHERE และ GROUP BY แต่ก่อน LIMIT ดังนั้นคำสั่งค้นหาเช่น “สมาชิกที่อายุน้อยที่สุดห้าคนจาก Woodcrest” จึงแสดงออกมาในคำสั่งเดียว
SELECT full_names, date_of_birth FROM members WHERE physical_address = 'Woodcrest' ORDER BY date_of_birth DESC LIMIT 5;
ลำดับเดียวกันนี้ใช้กับผลลัพธ์ที่จัดกลุ่มไว้ด้วย ค่ารวมที่สร้างขึ้นโดย ฟังก์ชั่นรวม เช่น สามารถจัดเรียงข้อมูลจำนวนนับได้ เพื่อให้หมวดหมู่ที่มีการใช้งานมากที่สุดปรากฏอยู่ด้านบนสุดของรายงาน
SELECT gender, COUNT(*) AS members_count FROM members GROUP BY gender ORDER BY members_count DESC;
เคล็ดลับ: คำสั่ง ORDER BY สามารถเรียงลำดับตามชื่อเรียกแทนคอลัมน์ ตามนิพจน์ หรือแม้กระทั่งตามตำแหน่งของคอลัมน์ เช่น ORDER BY 3 การเรียงลำดับตามตำแหน่งนั้นไม่เสถียร เพราะการเพิ่มคอลัมน์ใหม่ลงในรายการ SELECT จะเปลี่ยนคีย์การเรียงลำดับโดยไม่แจ้งให้ทราบล่วงหน้า ดังนั้นควรตั้งชื่อคอลัมน์แทน
มีประเด็นสำคัญอย่างหนึ่งที่ควรจดจำเกี่ยวกับประสิทธิภาพการทำงาน เมื่อคอลัมน์ที่เรียงลำดับแล้วมีดัชนีอยู่ด้วย MySQL สามารถอ่านแถวตามลำดับดัชนีและข้ามขั้นตอนการเรียงลำดับไปได้เลย หากไม่มีดัชนี ตารางขนาดใหญ่จะบังคับให้มีการเรียงลำดับไฟล์ในหน่วยความจำหรือบนดิสก์ ซึ่งเป็นสาเหตุหลักที่ทำให้การค้นหาข้อมูลในรายงานช้าลง

ASC เป็นรูปแบบย่อของการขึ้น
MySQL DESC เป็นรูปแบบย่อของการลงจากมากไปน้อย

