🗄️ MySQL/MariaDB

สอนใช้ MySQL และ MariaDB: การเรียงลำดับ (ORDER BY) การจำกัดข้อมูล (LIMIT) และการทำ Pagination

7 นาที 18 views บันทึกเป็น PDF
สอนใช้ MySQL และ MariaDB: การเรียงลำดับ (ORDER BY) การจำกัดข้อมูล (LIMIT) และการทำ Pagination

อยากทำเว็บให้โหลดไวต้องอ่าน! เรียนรู้วิธีจัดการข้อมูลในฐานข้อมูลด้วย ORDER BY, LIMIT และ OFFSET เพื่อทำระบบแบ่งหน้า (Pagination) ให้แอปฯ ของคุณทำงานได้ลื่นไหล

ทำไมต้องจัดเรียงและแบ่งหน้าข้อมูล

เวลาเราทำแอปพลิเคชัน ข้อมูลในฐานข้อมูลมักจะมีจำนวนมหาศาล ถ้าเราดึงข้อมูลออกมาทั้งหมดพร้อมกันในครั้งเดียว จะทำให้แอปฯ ของเราโหลดช้าและกินทรัพยากรเครื่องมาก MySQL และ MariaDB ซึ่งเป็นระบบจัดการฐานข้อมูล (ซอฟต์แวร์เก็บและจัดการข้อมูล) จึงมีเครื่องมือช่วยจัดการเรื่องนี้

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

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

จัดเรียงลำดับด้วย ORDER BY

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

เรามักจะใช้คู่กับคำสั่ง ASC (ย่อมาจาก Ascending คือการเรียงจากน้อยไปมาก) หรือ DESC (ย่อมาจาก Descending คือการเรียงจากมากไปน้อย) ถ้าคุณไม่ระบุอะไรเลย ระบบจะถือว่าคุณต้องการเรียงแบบ ASC เป็นค่าเริ่มต้นเสมอ

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

-- เรียงลำดับชื่อพนักงานจาก ก ถึง ฮ
SELECT name FROM employees ORDER BY name ASC;

-- เรียงลำดับเงินเดือนจากมากไปน้อย
SELECT name, salary FROM employees ORDER BY salary DESC;

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

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

จำกัดจำนวนผลลัพธ์ด้วย LIMIT

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

ปกติเราจะใช้ LIMIT ร่วมกับ ORDER BY เสมอ เพื่อให้แน่ใจว่า 10 แถวที่เราได้มานั้นเป็นข้อมูลที่เราต้องการจริงๆ เช่น อยากได้คนที่ได้คะแนนสอบสูงสุด 5 คนแรก เราต้องเรียงคะแนนก่อนแล้วค่อยตัดให้เหลือแค่ 5

ข้อควรระวังคือ ถ้าคุณใช้ LIMIT โดยไม่เรียงลำดับ ข้อมูลที่ได้อาจเปลี่ยนไปมาในแต่ละครั้งที่กดรีเฟรชหน้าจอ เพราะฐานข้อมูลไม่ได้การันตีว่าข้อมูลชุดไหนจะถูกดึงขึ้นมาก่อนหากไม่มีเกณฑ์การเรียงที่ชัดเจน

-- ดึงข้อมูลสินค้าที่ราคาถูกที่สุด 3 ชิ้นแรก
SELECT product_name, price FROM products ORDER BY price ASC LIMIT 3;

คำสั่งนี้เริ่มจากดึงชื่อและราคาจากตารางสินค้า จากนั้นใช้ ORDER BY price ASC เพื่อเรียงราคาจากน้อยไปมาก แล้วปิดท้ายด้วย LIMIT 3 เพื่อบอกฐานข้อมูลว่าเอาแค่ 3 รายการแรกพอ

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

ทำระบบแบ่งหน้าด้วย OFFSET

เมื่อเราต้องการทำระบบแบ่งหน้า เราจะใช้ OFFSET (ตัวระบุจุดเริ่มต้น) เข้ามาช่วย มันคือการบอกฐานข้อมูลว่า ให้ข้ามข้อมูลชุดแรกไปกี่แถวแล้วค่อยเริ่มดึงข้อมูลต่อจากนั้น

สมมติว่าคุณต้องการแสดงข้อมูลหน้าละ 10 แถว หน้าแรกคุณก็ใช้แค่ LIMIT 10 แต่ถ้าจะดูหน้าสอง คุณต้องข้าม 10 แถวแรกไปก่อน จึงต้องใช้ LIMIT 10 OFFSET 10 เพื่อดึงข้อมูลชุดถัดไป

หัวใจสำคัญของการทำ Pagination คือการคำนวณเลข OFFSET ให้ถูกต้องตามหมายเลขหน้าเสมอ ถ้าหน้าแรกคือ 0 หน้าที่สองคือ 10 หน้าที่สามคือ 20 จะเห็นว่ามันคือการเอา (หน้า - 1) คูณด้วยจำนวนข้อมูลต่อหน้า

-- ดึงข้อมูลหน้า 2 โดยแสดงหน้าละ 5 รายการ
SELECT * FROM users LIMIT 5 OFFSET 5;

คำสั่งนี้คือการดึงข้อมูลทั้งหมดจากตารางผู้ใช้งาน โดยให้แสดงผลเพียง 5 แถว OFFSET 5 จะทำหน้าที่ข้าม 5 แถวแรกที่อยู่หน้าแรกไป เพื่อไปแสดงผลข้อมูลชุดที่ 6 ถึง 10 แทน

ผลลัพธ์ที่ได้คือรายชื่อผู้ใช้งานในหน้า 2 ซึ่งจะแสดงต่อเนื่องจากหน้าแรกอย่างเป็นระเบียบ ทำให้แอปฯ ไม่โหลดข้อมูลทั้งหมดออกมาจนเครื่องค้าง

จุดที่มือใหม่มักพลาดในการเขียนคำสั่ง

ข้อผิดพลาดอันดับหนึ่งคือการเรียงลำดับคำสั่งผิด ลำดับการเขียนมีความสำคัญมาก คุณต้องเขียน SELECT แล้วตามด้วย FROM จากนั้นเป็น ORDER BY ต่อด้วย LIMIT และ OFFSET เสมอ หากสลับที่กันฐานข้อมูลจะฟ้องว่าคำสั่งผิดพลาด

อีกเรื่องคือการคำนวณ OFFSET พลาด มือใหม่มักลืมว่าฐานข้อมูลเริ่มนับเลขแถวจาก 0 ไม่ใช่ 1 ถ้าคุณคำนวณหน้าผิดพลาด ข้อมูลอาจจะหายไปหรือซ้ำซ้อนกันระหว่างหน้าได้ แนะนำให้วาดภาพในกระดาษก่อนเขียนโค้ดจริง

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

สรุปการนำไปใช้จริง

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

ลองนึกถึงตอนคุณทำโปรเจกต์ทำเว็บ Blog ของตัวเอง คุณต้องดึงบทความมาแสดงหน้าละ 5 เรื่อง โดยเรียงจากวันที่โพสต์ล่าสุดขึ้นก่อน คุณจะต้องใช้ ORDER BY created_at DESC LIMIT 5 OFFSET 0 สำหรับหน้าแรก และเปลี่ยนค่า OFFSET ไปเรื่อยๆ ตามหน้าถัดไป

ฝึกฝนการเขียนคำสั่งเหล่านี้บ่อยๆ จนจำรูปแบบได้ขึ้นใจ แล้วคุณจะพบว่าการจัดการข้อมูลมหาศาลไม่ใช่เรื่องยากอีกต่อไป ขอให้สนุกกับการเขียนโค้ดและพัฒนาฝีมือให้เก่งขึ้นในทุกๆ วันครับ

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

MySQL/MariaDB

สอนวิธี Backup และ Restore ฐานข้อมูล MySQL/MariaDB ด้วย mysqldump บน Windows

มือใหม่หัดเขียนโปรแกรมต้องรู้! วิธีสำรองข้อมูล (Backup) และกู้คืน (Restore) ฐานข้อมูลด้วย mysqldump ผ่าน Command Line ป้องกันงานหาย ทำตามได้จริง

1 month ago 9 นาที
24 views
จัดการ User และสิทธิ์ใน MySQL/MariaDB ให้ปลอดภัยด้วยคำสั่ง GRANT และ REVOKE
MySQL/MariaDB

จัดการ User และสิทธิ์ใน MySQL/MariaDB ให้ปลอดภัยด้วยคำสั่ง GRANT และ REVOKE

มือใหม่หัดใช้ฐานข้อมูลต้องรู้! วิธีสร้าง User, กำหนดสิทธิ์ (Permission) และตั้งค่าความปลอดภัยให้ MySQL/MariaDB เพื่อป้องกันข้อมูลรั่วไหลแบบมือโปร

1 month ago 8 นาที
27 views
เข้าใจ MySQL และ MariaDB Trigger: เขียนคำสั่งอัตโนมัติให้ฐานข้อมูลทำงานแทนเรา
MySQL/MariaDB

เข้าใจ MySQL และ MariaDB Trigger: เขียนคำสั่งอัตโนมัติให้ฐานข้อมูลทำงานแทนเรา

อยากให้ฐานข้อมูลทำงานอัตโนมัติเมื่อมีการเพิ่มหรือลบข้อมูลไหม? มาเรียนรู้การใช้ Trigger (ตัวกระตุ้นการทำงาน) ใน MySQL และ MariaDB เพื่อลดภาระงานโค้ดกัน

1 month ago 8 นาที
24 views