ทำความรู้จักฟังก์ชันจัดการข้อมูลในฐานข้อมูล
เวลาเราเก็บข้อมูลใน MySQL หรือ MariaDB ซึ่งเป็นระบบจัดการฐานข้อมูล (ซอฟต์แวร์ที่ใช้เก็บและดึงข้อมูล) เรามักไม่ได้เก็บแค่ตัวเลข แต่เราเก็บชื่อคน วันที่ หรือข้อความยาวๆ ด้วย บางครั้งข้อมูลที่เก็บมาอาจจะยังไม่พร้อมใช้งานทันที เช่น ชื่อกับนามสกุลแยกกันอยู่ หรือรูปแบบวันที่ไม่ตรงกับที่หน้าเว็บต้องการ
ฟังก์ชัน (ชุดคำสั่งที่เขียนไว้ให้เรียกใช้ได้ทันที) จึงเข้ามาช่วยจัดการข้อมูลเหล่านี้ให้เป็นระเบียบโดยไม่ต้องเขียนโค้ดขึ้นมาใหม่เอง เปรียบเหมือนการมีเครื่องทุ่นแรงที่ช่วยตัดแปะข้อความหรือคำนวณวันเวลาให้เราแบบอัตโนมัติ ทำให้เราประหยัดเวลาในการเขียนโปรแกรมไปได้เยอะมาก
มือใหม่หลายคนมักจะพยายามเขียนโค้ดภาษาโปรแกรมอย่าง PHP หรือ Python เพื่อจัดการข้อมูลเหล่านี้หลังจากดึงออกมาแล้ว แต่จริงๆ แล้วการให้ฐานข้อมูลจัดการให้ตั้งแต่ต้นจะเร็วกว่าและมีประสิทธิภาพมากกว่าเยอะเลยครับ
จัดการข้อความด้วย CONCAT, SUBSTRING และ LENGTH
ฟังก์ชันกลุ่มข้อความช่วยให้เราปรับแต่งข้อมูลที่เป็นตัวอักษรได้ตามใจชอบ ลองนึกภาพว่าเรามีข้อมูลชื่อและนามสกุลคนละช่องในฐานข้อมูล แต่เราต้องการแสดงผลรวมกันบนหน้าเว็บ หรือต้องการตัดแค่ตัวอักษรบางช่วงมาโชว์เป็นตัวย่อเพื่อความสวยงาม
ฟังก์ชัน CONCAT() ใช้เชื่อมข้อความเข้าด้วยกัน ส่วน SUBSTRING() ใช้ตัดข้อความบางส่วนออกมา และ LENGTH() ใช้ตรวจดูว่าข้อความนั้นยาวกี่ตัวอักษร ฟังก์ชันเหล่านี้เป็นพื้นฐานที่โปรแกรมเมอร์ต้องใช้บ่อยมากเวลาทำระบบสมาชิกหรือระบบค้นหาข้อมูล
จุดที่มือใหม่มักพลาดคือการลืมเว้นวรรคระหว่างเชื่อมข้อความด้วย CONCAT() ทำให้ชื่อกับนามสกุลติดกันเป็นพืด หรือการนับตำแหน่งตัวอักษรใน SUBSTRING() ที่เริ่มนับจากเลข 1 ไม่ใช่เลข 0 เหมือนในหลายภาษาโปรแกรม
-- เชื่อมชื่อและนามสกุลโดยเว้นวรรคตรงกลาง
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM users;
-- ตัดเอาตัวอักษร 3 ตัวแรกของรหัสสินค้า
SELECT SUBSTRING(product_code, 1, 3) AS code_prefix
FROM products;
-- นับความยาวของชื่อผู้ใช้
SELECT LENGTH(username) AS name_length
FROM users;
บรรทัดแรกใช้ CONCAT รวมช่องชื่อและนามสกุลโดยใส่ช่องว่าง ' ' คั่นกลาง บรรทัดที่สองใช้ SUBSTRING เริ่มตัดจากตัวที่ 1 ไปยาว 3 ตัวอักษร ส่วนบรรทัดสุดท้าย LENGTH จะส่งกลับมาเป็นตัวเลขจำนวนตัวอักษรทั้งหมด
ผลลัพธ์ที่ได้: สมมติชื่อ Somchai นามสกุล Dee จะได้ full_name เป็น Somchai Dee และถ้า product_code คือ A01-123 จะได้ code_prefix เป็น A01
จัดการวันเวลาด้วย NOW และ DATEDIFF
วันเวลาเป็นข้อมูลที่ซับซ้อนที่สุดอย่างหนึ่งในฐานข้อมูล เพราะมันมีรูปแบบที่หลากหลาย ทั้งปี-เดือน-วัน หรือเวลาที่ต้องแม่นยำระดับวินาที ฟังก์ชัน NOW() จะช่วยดึงวันที่และเวลาปัจจุบันของระบบออกมาใช้งานได้ทันที
ส่วน DATEDIFF() คือฟังก์ชันที่ใช้หาความแตกต่างระหว่างวันที่สองวันที่ เช่น อยากรู้ว่าลูกค้าสมัครสมาชิกมาแล้วกี่วัน หรือสินค้าชิ้นนี้ค้างอยู่ในสต็อกมากี่วันแล้ว การคำนวณนี้ช่วยให้เราทำระบบแจ้งเตือนหรือสรุปรายงานได้ง่ายขึ้นมาก
เวลาใช้งานต้องระวังเรื่องรูปแบบวันที่ที่ฐานข้อมูลเก็บไว้ หากรูปแบบไม่ถูกต้อง ฟังก์ชันเหล่านี้จะทำงานผิดพลาดหรือให้ค่าเป็นว่างทันที แนะนำให้เก็บวันที่ในรูปแบบมาตรฐานของฐานข้อมูลเสมอ คือ YYYY-MM-DD
-- ดึงวันที่และเวลาปัจจุบัน
SELECT NOW() AS current_time;
-- หาจำนวนวันที่ต่างกันระหว่างสองวันที่
SELECT DATEDIFF('2023-12-31', '2023-01-01') AS days_passed;
บรรทัดแรก NOW() จะดึงเวลาปัจจุบันจากเซิร์ฟเวอร์มาแสดง บรรทัดที่สอง DATEDIFF จะนำวันที่ด้านหลังไปลบออกจากวันที่ด้านหน้าเพื่อหาผลต่างเป็นจำนวนวัน
ผลลัพธ์ที่ได้: current_time จะแสดงเป็น 2023-10-27 10:00:00 (ตัวอย่าง) และ days_passed จะได้ผลลัพธ์เป็น 364 วัน
ปรับแต่งวันเวลาด้วย DATE_ADD
บ่อยครั้งที่เราต้องการคำนวณวันเวลาในอนาคตหรืออดีต เช่น การกำหนดวันหมดอายุของคูปองส่วนลด หรือการหาว่าอีก 7 วันข้างหน้าคือวันที่เท่าไหร่ ฟังก์ชัน DATE_ADD() ออกแบบมาเพื่อจัดการเรื่องนี้โดยเฉพาะ
เราสามารถเลือกบวกได้ทั้งวัน เดือน หรือปี โดยระบุหน่วยให้ชัดเจนในคำสั่ง การใช้ฟังก์ชันนี้ดีกว่าการนำตัวเลขมาบวกกันตรงๆ เพราะฐานข้อมูลจะจัดการเรื่องจำนวนวันในแต่ละเดือนหรือปีอธิกสุรทิน (ปีที่มี 366 วัน) ให้เราโดยอัตโนมัติ
ข้อควรระวังคือการระบุหน่วยเวลาให้ถูกต้อง หากต้องการลบวันออกไป ให้ใช้ฟังก์ชัน DATE_SUB() หรือใส่ค่าเป็นติดลบใน DATE_ADD() แทน เพื่อไม่ให้เกิดความสับสนในการอ่านโค้ดในอนาคต
-- บวกเพิ่มไปอีก 7 วันจากวันที่ปัจจุบัน
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY) AS next_week;
-- บวกเพิ่มไปอีก 1 เดือน
SELECT DATE_ADD('2023-01-01', INTERVAL 1 MONTH) AS next_month;
บรรทัดแรกใช้ DATE_ADD ร่วมกับ INTERVAL 7 DAY เพื่อขยับเวลาไปข้างหน้า 7 วัน บรรทัดที่สองเป็นการบวกเพิ่ม 1 เดือนจากวันที่กำหนดตายตัว
ผลลัพธ์ที่ได้: ถ้าวันนี้วันที่ 1 next_week จะเป็นวันที่ 8 และถ้าบวก 1 เดือนจาก 2023-01-01 จะได้ 2023-02-01
แปลงโฉมวันที่ด้วย DATE_FORMAT
ฐานข้อมูลมักเก็บวันที่ในรูปแบบ YYYY-MM-DD ซึ่งดูเป็นทางการเกินไปสำหรับหน้าเว็บที่ผู้ใช้งานจริงต้องการเห็น เช่น 27 ตุลาคม 2566 หรือ 27/10/2023 ฟังก์ชัน DATE_FORMAT() คือตัวช่วยเปลี่ยนหน้าตาของวันที่ให้เป็นไปตามที่เราต้องการ
การใช้งานคือการใส่โค้ดรูปแบบ (Format code) ลงไป เช่น %d คือวันที่ %m คือเดือน และ %Y คือปี คุณสามารถผสมสัญลักษณ์เหล่านี้เข้ากับเครื่องหมายทับหรือช่องว่างได้ตามความเหมาะสมของดีไซน์ในหน้าเว็บ
อย่าลืมว่า การแปลงด้วย DATE_FORMAT จะทำให้ข้อมูลกลายเป็นข้อความ ซึ่งจะไม่สามารถนำไปคำนวณต่อได้ด้วยฟังก์ชันวันเวลา ดังนั้นควรแปลงรูปแบบเฉพาะตอนจะแสดงผลที่หน้าเว็บเท่านั้น ไม่ควรแปลงเก็บไว้ในฐานข้อมูล
-- แปลงวันที่เป็นรูปแบบ วัน/เดือน/ปี
SELECT DATE_FORMAT(NOW(), '%d/%m/%Y') AS formatted_date;
-- แปลงวันที่เป็นแบบอ่านง่าย (ชื่อเดือน)
SELECT DATE_FORMAT(NOW(), '%d %M %Y') AS readable_date;
บรรทัดแรกใช้ %d/%m/%Y เพื่อให้ได้รูปแบบวันที่แบบมาตรฐานไทย บรรทัดที่สองใช้ %M เพื่อให้ฐานข้อมูลแสดงชื่อเดือนแบบเต็มออกมาแทนตัวเลข
ผลลัพธ์ที่ได้: formatted_date จะเป็น 27/10/2023 ส่วน readable_date จะได้เป็น 27 October 2023
สรุปการประยุกต์ใช้ในงานจริง
การฝึกใช้ฟังก์ชันเหล่านี้จะช่วยให้คุณทำงานกับข้อมูลได้คล่องตัวขึ้นมาก ลองนึกภาพว่าคุณกำลังทำระบบร้านค้าออนไลน์ คุณต้องใช้ CONCAT เพื่อรวมชื่อลูกค้า ใช้ DATE_ADD เพื่อกำหนดวันหมดอายุของสินค้า และใช้ DATE_FORMAT เพื่อแสดงวันที่สั่งซื้อให้ลูกค้าอ่านง่าย
เมื่อต้องเขียนโปรแกรมจริง ให้ลองฝึกเขียน Query (คำสั่งจัดการฐานข้อมูล) เหล่านี้ในโปรแกรมจัดการฐานข้อมูลก่อนเสมอ อย่าเพิ่งรีบเขียนโค้ดภาษาหลักจนกว่าผลลัพธ์จากฐานข้อมูลจะถูกต้องตามต้องการ เพราะจะช่วยให้การแก้บั๊ก (ข้อผิดพลาดในโปรแกรม) ง่ายขึ้นเยอะ
สุดท้ายนี้ โปรแกรมเมอร์ที่เก่งไม่ได้วัดกันที่จำฟังก์ชันได้ทั้งหมด แต่วัดกันที่การเลือกใช้เครื่องมือให้ถูกกับงาน หากติดขัดเรื่องรูปแบบคำสั่ง ให้เปิดดูคู่มือออนไลน์หรือ Documentation (เอกสารอ้างอิง) ของ MySQL เสมอ เพราะไม่มีใครจำได้ทั้งหมดตั้งแต่ครั้งแรกครับ