🗄️ MySQL/MariaDB

จัดการข้อมูลในฐานข้อมูลให้โปรด้วย MySQL และ MariaDB String & Date Functions

8 นาที 12 views บันทึกเป็น PDF
จัดการข้อมูลในฐานข้อมูลให้โปรด้วย MySQL และ MariaDB String & Date Functions

มือใหม่หัดใช้ฐานข้อมูลต้องรู้! วิธีจัดการข้อความและวันเวลาด้วยฟังก์ชัน MySQL/MariaDB เช่น CONCAT, SUBSTRING และ DATE_ADD ช่วยลดงานเขียนโค้ดได้เพียบ

ทำความรู้จักฟังก์ชันจัดการข้อมูลในฐานข้อมูล

เวลาเราเก็บข้อมูลใน 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 เสมอ เพราะไม่มีใครจำได้ทั้งหมดตั้งแต่ครั้งแรกครับ

แชร์บทความ

Facebook X LINE

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

MySQL/MariaDB

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

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

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

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

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

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

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

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

1 month ago 8 นาที
23 views