ทำความรู้จักกับ Database และคำสั่งดึงข้อมูล
เวลาเราสร้างแอปพลิเคชันหรือเว็บไซต์ ข้อมูลต่างๆ จะถูกเก็บไว้ในที่ที่เรียกว่า Database (ฐานข้อมูล) ซึ่งเปรียบเสมือนตู้เก็บเอกสารขนาดใหญ่ที่จัดระเบียบข้อมูลไว้อย่างดี การที่เราจะดึงข้อมูลบางส่วนออกมาใช้งาน เราต้องใช้ภาษาที่ชื่อว่า SQL (Structured Query Language - ภาษาสำหรับคุยกับฐานข้อมูล) เพื่อบอกให้มันรู้ว่าเราต้องการอะไร
คนที่เป็นโปรแกรมเมอร์ต้องคุยกับฐานข้อมูลให้เป็น เพราะเกือบทุกโปรเจกต์ต้องมีการเก็บข้อมูลผู้ใช้งานหรือรายการสินค้า MySQL และ MariaDB คือระบบจัดการฐานข้อมูลยอดนิยมที่ใช้หลักการทำงานเหมือนกันเป๊ะ คุณเรียนรู้ครั้งเดียวก็เอาไปใช้ได้กับทั้งสองระบบเลย มันเหมือนกับการขับรถยี่ห้อไหนก็ได้ ถ้าคุณรู้วิธีขับรถยนต์พื้นฐานแล้ว
ก่อนจะเริ่มเขียนคำสั่ง เรามาลองนึกภาพตู้เก็บเอกสารที่มีแฟ้มรายชื่อพนักงาน ข้อมูลแต่ละแถวคือพนักงานหนึ่งคน และในแต่ละแถวก็มีช่องเก็บชื่อ อายุ และแผนก การดึงข้อมูลคือการเดินไปที่ตู้แล้วบอกว่า "ขอรายชื่อพนักงานทุกคน" หรือ "ขอแค่ชื่อของพนักงานในแผนกไอที" นั่นเอง
การดึงข้อมูลพื้นฐานด้วยคำสั่ง SELECT
คำสั่ง SELECT คือหัวใจสำคัญของการดึงข้อมูล คุณใช้มันเพื่อบอกฐานข้อมูลว่าต้องการดูอะไรบ้าง ถ้าเปรียบเทียบกับการสั่งอาหาร SELECT ก็เหมือนกับการบอกพนักงานเสิร์ฟว่าคุณต้องการสั่งอะไรจากเมนู โดยคุณต้องระบุชื่อคอลัมน์ (หัวข้อของข้อมูลในตาราง) ที่คุณสนใจจะหยิบออกมา
ถ้าคุณต้องการดึงข้อมูลทั้งหมดที่มีในตาราง เราจะใช้เครื่องหมายดอกจัน * ซึ่งเป็น Wildcard (สัญลักษณ์ตัวแทนที่หมายถึงทั้งหมด) การใช้ * ช่วยให้เราดูโครงสร้างข้อมูลได้เร็วขึ้น แต่ในงานจริงเรามักจะเลือกเฉพาะคอลัมน์ที่จำเป็นเท่านั้น เพื่อช่วยประหยัดทรัพยากรของเครื่องเซิร์ฟเวอร์ (คอมพิวเตอร์ที่ให้บริการข้อมูล)
ลองดูตัวอย่างการดึงข้อมูลจากตารางชื่อ employees (พนักงาน) กันครับ
-- ดึงข้อมูลทุกคอลัมน์จากตารางพนักงาน
SELECT * FROM employees;
-- ดึงเฉพาะชื่อและอีเมล
SELECT name, email FROM employees;
บรรทัดแรก SELECT * FROM employees; คือการสั่งให้ดึงทุกคอลัมน์จากตาราง employees ออกมาทั้งหมด ส่วนบรรทัดที่สองระบุชื่อคอลัมน์ name และ email คั่นด้วยเครื่องหมายคอมมา เพื่อเจาะจงเอาแค่สองอย่างนี้เท่านั้น
ผลลัพธ์ที่ได้จากการรันคำสั่งแรก จะเป็นตารางที่มีข้อมูลพนักงานทุกคนพร้อมรายละเอียดครบทุกช่อง ส่วนคำสั่งที่สองจะได้ผลลัพธ์เป็นตารางที่มีแค่สองคอลัมน์คือรายชื่อและอีเมลของพนักงานทุกคนครับ
การคัดกรองข้อมูลด้วยเงื่อนไข WHERE
บ่อยครั้งที่เราไม่ต้องการข้อมูลทั้งหมด แต่ต้องการเฉพาะข้อมูลที่ตรงตามเงื่อนไขเท่านั้น เช่น "ขอรายชื่อพนักงานที่อายุมากกว่า 30 ปี" เราจึงต้องใช้คำสั่ง WHERE (ที่ที่...) เพื่อกำหนดเงื่อนไขในการคัดกรองข้อมูล ถ้าไม่มี WHERE ฐานข้อมูลจะส่งข้อมูลทั้งหมดกลับมาให้คุณ ซึ่งอาจจะเยอะเกินความจำเป็นจนทำให้แอปช้าได้
การใช้ WHERE จะวางไว้หลังชื่อตารางเสมอ เปรียบเหมือนการบอกว่า "เอาข้อมูลจากตารางนี้ แต่ต้องมีเงื่อนไขแบบนี้นะ" ถ้าเงื่อนไขเป็นจริง ข้อมูลแถวนั้นก็จะถูกดึงออกมา ถ้าเงื่อนไขเป็นเท็จ ข้อมูลนั้นก็จะถูกข้ามไป นี่คือทักษะสำคัญที่ช่วยให้คุณจัดการข้อมูลได้แม่นยำขึ้น
ลองดูตัวอย่างการคัดกรองพนักงานที่มีแผนกเป็น 'IT' กันครับ
-- ดึงข้อมูลพนักงานที่ทำงานในแผนกไอที
SELECT * FROM employees WHERE department = 'IT';
คำสั่งนี้เริ่มจาก SELECT * เพื่อเอาทุกคอลัมน์ ตามด้วย FROM employees เพื่อบอกแหล่งข้อมูล และตบท้ายด้วย WHERE department = 'IT' เพื่อกรองเอาเฉพาะคนที่อยู่ในแผนกไอทีเท่านั้น
ผลลัพธ์ที่ได้จะเป็นรายชื่อพนักงานทุกคนที่สังกัดแผนก IT เท่านั้น หากในตารางไม่มีคนแผนกนี้เลย ผลลัพธ์ที่ได้จะเป็นตารางว่างเปล่า ซึ่งถือเป็นเรื่องปกติในการเขียนโค้ดครับ
ใช้ตัวดำเนินการเปรียบเทียบเพื่อความแม่นยำ
นอกจากเครื่องหมายเท่ากับ = แล้ว เรายังมีตัวดำเนินการเปรียบเทียบอื่นๆ อีกมากมายที่ใช้ร่วมกับ WHERE เพื่อสร้างเงื่อนไขที่ซับซ้อนขึ้น เช่น เครื่องหมาย > (มากกว่า), < (น้อยกว่า), >= (มากกว่าหรือเท่ากับ), และ != หรือ <> (ไม่เท่ากับ)
ตัวดำเนินการเหล่านี้ช่วยให้เราตั้งเงื่อนไขได้ละเอียดมากขึ้น เช่น การหาพนักงานที่เงินเดือนสูงกว่า 50,000 บาท หรือการค้นหาข้อมูลที่ไม่ใช่แผนกการตลาด การเลือกใช้ตัวดำเนินการที่ถูกต้องจะช่วยลดจำนวนโค้ดที่คุณต้องเขียนลงไปได้อย่างมาก
ลองดูตัวอย่างการใช้ตัวดำเนินการเปรียบเทียบเพื่อหาพนักงานเงินเดือนสูงกันครับ
-- ดึงข้อมูลพนักงานที่เงินเดือนมากกว่า 50,000
SELECT * FROM employees WHERE salary > 50000;
-- ดึงข้อมูลพนักงานที่ไม่ใช่แผนก HR
SELECT * FROM employees WHERE department != 'HR';
บรรทัดแรกใช้ salary > 50000 เพื่อคัดกรองตัวเลขเงินเดือน บรรทัดที่สองใช้ department != 'HR' เพื่อดึงข้อมูลทุกคนที่ไม่ได้อยู่ในฝ่ายบุคคล การใช้ != เป็นวิธีมาตรฐานในการระบุสิ่งที่เราไม่ต้องการ
ผลลัพธ์ที่ได้จากคำสั่งแรกคือรายชื่อพนักงานที่มีเงินเดือนเกิน 50,000 บาท ส่วนคำสั่งที่สองคือรายชื่อพนักงานทุกคนยกเว้นคนที่อยู่ฝ่าย HR ครับ
ตรรกศาสตร์ขั้นสูงด้วย AND, OR, NOT, IN, BETWEEN
เมื่อเงื่อนไขเริ่มเยอะขึ้น เราต้องใช้ตัวเชื่อมทางตรรกศาสตร์ (Logic) เข้ามาช่วย AND ใช้เมื่อต้องการให้ทุกเงื่อนไขเป็นจริงพร้อมกัน OR ใช้เมื่อต้องการเพียงเงื่อนไขใดเงื่อนไขหนึ่งเป็นจริง และ NOT ใช้เพื่อกลับค่าเงื่อนไขให้เป็นตรงกันข้าม
นอกจากนี้ยังมี IN ที่ช่วยเช็คว่าข้อมูลอยู่ในกลุ่มที่เรากำหนดไหม และ BETWEEN ที่ใช้หาข้อมูลในช่วงตัวเลขหรือวันที่ที่ต้องการ สิ่งเหล่านี้ช่วยให้คุณเขียนคำสั่งได้สั้นและอ่านง่ายขึ้นมาก แทนที่จะเขียนเงื่อนไขยาวเหยียดซ้ำไปซ้ำมา
ตัวอย่างการใช้งานเพื่อหาข้อมูลที่เฉพาะเจาะจงมากขึ้น
-- หาพนักงานแผนก IT ที่เงินเดือนมากกว่า 50,000
SELECT * FROM employees WHERE department = 'IT' AND salary > 50000;
-- หาพนักงานที่อายุระหว่าง 25 ถึง 30 ปี
SELECT * FROM employees WHERE age BETWEEN 25 AND 30;
คำสั่งแรกใช้ AND เชื่อมสองเงื่อนไขเข้าด้วยกัน ทำให้ต้องผ่านทั้งสองเกณฑ์ถึงจะถูกดึงออกมา คำสั่งที่สองใช้ BETWEEN เพื่อระบุช่วงของอายุ 25 ถึง 30 ปี ซึ่งสะอาดกว่าการเขียนว่า age >= 25 AND age <= 30
ผลลัพธ์ของคำสั่งแรกคือพนักงาน IT ที่รวยกว่า 50,000 บาทเท่านั้น ส่วนผลลัพธ์ของคำสั่งที่สองคือรายชื่อพนักงานที่อายุอยู่ในช่วง 25 ถึง 30 ปีพอดีครับ
สรุป: การนำไปใช้ในงานจริง
การเข้าใจ SELECT และ WHERE คือก้าวแรกที่สำคัญที่สุดของโปรแกรมเมอร์ทุกคน ฐานข้อมูลเป็นหัวใจของแอปพลิเคชันแทบทุกตัวที่คุณจะได้ทำในอนาคต ไม่ว่าจะเป็นระบบสมาชิก เว็บขายของ หรือแอปจองตั๋วหนัง คุณต้องดึงข้อมูลมาแสดงผลให้ผู้ใช้งานเห็นอย่างถูกต้องเสมอ
สมมติว่าคุณกำลังทำระบบจัดการคลังสินค้า คุณจะต้องใช้คำสั่งเหล่านี้ในการดึงข้อมูลสินค้าที่เหลืออยู่ต่ำกว่า 10 ชิ้น เพื่อแจ้งเตือนให้แอดมินทราบ หรือดึงรายการสินค้าในหมวดหมู่ที่ลูกค้ากำลังสนใจ เพื่อแสดงผลบนหน้าแรกของเว็บไซต์ การฝึกฝนจนคล่องจะทำให้คุณทำงานได้เร็วและลดบั๊ก (ข้อผิดพลาดของโปรแกรม) ได้ดีขึ้น
อย่าลืมว่าการเขียนโค้ดคือทักษะที่ต้องใช้การฝึกฝน ลองเปิดโปรแกรมจัดการฐานข้อมูลแล้วพิมพ์คำสั่งเหล่านี้ด้วยตัวเอง ดูผลลัพธ์ที่เปลี่ยนไปเมื่อคุณเปลี่ยนเงื่อนไข นี่คือวิธีเดียวที่จะทำให้คุณจำได้แม่นและก้าวไปเป็นโปรแกรมเมอร์ที่เก่งขึ้นในทุกๆ วันครับ