ทำความรู้จักกับ PostgreSQL และการดึงข้อมูลพื้นฐาน
เวลาเราสร้างแอปพลิเคชัน ข้อมูลทุกอย่างต้องมีที่เก็บที่เป็นระเบียบ PostgreSQL (ระบบจัดการฐานข้อมูลแบบเชิงสัมพันธ์) จึงกลายเป็นเครื่องมือสำคัญที่โปรแกรมเมอร์ต้องใช้ เพื่อเก็บข้อมูลผู้ใช้งานหรือรายการสินค้าให้ค้นหาได้ง่าย เราจะใช้ภาษาที่เรียกว่า SQL (ภาษาสำหรับคุยกับฐานข้อมูล) ในการสั่งงาน
การดึงข้อมูลเริ่มต้นด้วยคำสั่ง SELECT (คำสั่งเลือกดูข้อมูล) ซึ่งเปรียบเหมือนการบอกให้ฐานข้อมูลหยิบสมุดรายชื่อมาเปิดดูให้เรา ถ้าคุณอยากได้ข้อมูลทั้งหมดจากตาราง ให้ใช้เครื่องหมาย * (ดอกจัน) เพื่อบอกว่าเอาทุกคอลัมน์ นี่คือขั้นตอนพื้นฐานที่สุดที่โปรแกรมเมอร์ทุกคนต้องคล่องแคล่ว
การเขียนโค้ดต้องมีการเว้นวรรคและใช้คำสั่งให้ถูกหลัก Syntax (ไวยากรณ์หรือรูปแบบการเขียนโปรแกรมที่ถูกต้อง) หากคุณพิมพ์ผิดแม้แต่ตัวเดียว ฐานข้อมูลจะแจ้งเตือนว่าหาคำสั่งไม่เจอ ดังนั้นควรฝึกพิมพ์ให้ชินมือและตรวจสอบชื่อตารางให้ถูกต้องเสมอ ก่อนที่จะกดรันคำสั่งจริงในโปรเจกต์ของคุณ
-- ดึงข้อมูลทั้งหมดจากตารางชื่อ users
SELECT * FROM users;
-- เลือกเฉพาะชื่อและอีเมลจากตาราง users
SELECT name, email FROM users;
บรรทัดแรกใช้ SELECT * เพื่อดึงทุกอย่างที่อยู่ในตาราง users ส่วนบรรทัดที่สองระบุเฉพาะคอลัมน์ name และ email เพื่อลดปริมาณข้อมูลที่ไม่จำเป็น บรรทัดสุดท้ายต้องปิดด้วยเครื่องหมายเซมิโคลอน ; เพื่อบอกว่าจบคำสั่งแล้ว
ผลลัพธ์ที่ได้จะเป็นตารางที่มีข้อมูลเรียงกันตามคอลัมน์ที่คุณเลือก หากตาราง users ของคุณมีข้อมูล 3 คน ผลลัพธ์จะแสดงชื่อและอีเมลของทั้ง 3 คนนั้นออกมาเป็นแถวๆ
การคัดกรองข้อมูลด้วย WHERE
ในชีวิตจริงเราคงไม่ต้องการข้อมูลทั้งหมดออกมาดูพร้อมกันตลอดเวลา เรามักต้องการแค่ข้อมูลเฉพาะบางอย่าง เช่น ข้อมูลของลูกค้าที่ชื่อ "Somchai" เท่านั้น นี่คือหน้าที่ของ WHERE (คำสั่งกรองข้อมูลตามเงื่อนไข) ซึ่งเปรียบเสมือนการสั่งให้พนักงานไปคัดแยกเอกสารมาให้เราแค่บางแผ่น
การใช้ WHERE ช่วยให้แอปพลิเคชันทำงานได้เร็วขึ้น เพราะฐานข้อมูลไม่ต้องส่งข้อมูลทั้งหมดมาให้เรา แต่จะส่งเฉพาะข้อมูลที่ตรงกับเงื่อนไขกลับมาให้ การรู้วิธีคัดกรองข้อมูลอย่างมีประสิทธิภาพจะช่วยลดภาระของเซิร์ฟเวอร์ (คอมพิวเตอร์ที่ให้บริการข้อมูล) ได้อย่างมาก
จุดที่มือใหม่มักพลาดคือการลืมใส่เครื่องหมายคำพูด ' ' (single quote) เวลาเปรียบเทียบข้อมูลที่เป็นข้อความ ฐานข้อมูลจะมองว่าข้อความไม่ใช่ชื่อคอลัมน์ แต่เป็นค่าที่คุณต้องการเปรียบเทียบ ดังนั้นต้องใส่ให้ถูกต้องทุกครั้งเพื่อป้องกันข้อผิดพลาดที่น่ารำคาญใจ
-- ดึงข้อมูลผู้ใช้ที่มีชื่อว่า Somchai
SELECT * FROM users WHERE name = 'Somchai';
-- ดึงข้อมูลสินค้าที่มีราคามากกว่า 500 บาท
SELECT * FROM products WHERE price > 500;
คำสั่งแรกใช้ WHERE name = 'Somchai' เพื่อเลือกแถวที่มีชื่อตรงกับค่าในเครื่องหมายคำพูด คำสั่งที่สองใช้เครื่องหมาย > (มากกว่า) เพื่อหาเฉพาะสินค้าที่ราคาสูงกว่า 500 บาท ฐานข้อมูลจะไล่ตรวจทีละแถวและดึงเฉพาะแถวที่เงื่อนไขเป็นจริงออกมา
ผลลัพธ์จะแสดงเฉพาะรายการที่ตรงกับเงื่อนไขเท่านั้น เช่น ถ้าไม่มีใครชื่อ Somchai เลย ผลลัพธ์จะเป็นตารางว่างๆ ที่ไม่มีข้อมูลใดๆ ปรากฏอยู่
ตัวดำเนินการตรรกศาสตร์สำหรับการรวมเงื่อนไข
บางครั้งเงื่อนไขเดียวอาจไม่เพียงพอ เราอาจต้องการหาลูกค้าที่ชื่อ "Somchai" และ อยู่ในจังหวัด "Bangkok" เท่านั้น เราจึงต้องใช้ AND (และ), OR (หรือ) และ NOT (ไม่ใช่) เข้ามาช่วยรวมเงื่อนไขให้ซับซ้อนและแม่นยำขึ้น
การใช้ AND หมายความว่าข้อมูลต้องตรงตามเงื่อนไขทั้งหมดถึงจะถูกเลือก ส่วน OR หมายความว่าขอแค่เงื่อนไขใดเงื่อนไขหนึ่งเป็นจริงก็พอ การทำความเข้าใจตรรกะเหล่านี้เป็นพื้นฐานสำคัญของการเขียนโปรแกรมทุกภาษา ไม่ใช่แค่กับฐานข้อมูลเท่านั้น
คำแนะนำสำหรับมือใหม่คือการใช้ ( ) (วงเล็บ) ครอบเงื่อนไขเสมอเมื่อมีการใช้ AND และ OR ร่วมกัน เพื่อกำหนดลำดับการทำงานให้ชัดเจน ป้องกันไม่ให้ฐานข้อมูลตีความหมายผิดพลาดจนได้ข้อมูลไม่ตรงตามที่ตั้งใจไว้
-- หาผู้ใช้ที่ชื่อ Somchai และมาจาก Bangkok
SELECT * FROM users WHERE name = 'Somchai' AND city = 'Bangkok';
-- หาผู้ใช้ที่ชื่อ Somchai หรือชื่อ Somying
SELECT * FROM users WHERE name = 'Somchai' OR name = 'Somying';
ตัวอย่างแรกใช้ AND เชื่อมเงื่อนไขเพื่อให้ได้ผลลัพธ์ที่เจาะจงมากขึ้น ตัวอย่างที่สองใช้ OR เพื่อดึงข้อมูลของทั้งสองคนออกมาพร้อมกัน การเรียงลำดับเงื่อนไขไม่มีผลต่อผลลัพธ์ แต่การเขียนให้เป็นระเบียบจะช่วยให้คุณอ่านโค้ดตัวเองได้ง่ายขึ้นในอนาคต
ผลลัพธ์จะแสดงรายการข้อมูลที่ผ่านการคัดกรองตามตรรกะที่คุณกำหนด หากใช้ AND จำนวนข้อมูลที่ได้มักจะน้อยกว่าการใช้ OR เสมอ
การใช้ IN และ BETWEEN เพื่อความกระชับ
หากคุณต้องเช็กเงื่อนไขว่าค่าอยู่ในกลุ่มที่กำหนดไหม เช่น "จังหวัดไหนก็ได้ใน 3 จังหวัดนี้" การเขียน OR หลายๆ ครั้งจะดูรกและอ่านยาก เราจึงใช้ IN (คำสั่งตรวจสอบค่าในรายการ) เข้ามาแทนที่เพื่อให้โค้ดดูสะอาดตาและเข้าใจง่ายขึ้น
นอกจากนี้ยังมี BETWEEN (คำสั่งตรวจสอบช่วงของข้อมูล) สำหรับกรณีที่เราต้องการค่าในช่วงตัวเลขหรือวันที่ เช่น ต้องการดูยอดขายตั้งแต่วันที่ 1 ถึง 30 ของเดือน ซึ่งช่วยประหยัดเวลาในการเขียนเงื่อนไข >= และ <= หลายๆ บรรทัด
การเลือกใช้คำสั่งที่เหมาะสมจะทำให้คุณกลายเป็นโปรแกรมเมอร์ที่เขียนโค้ดได้ "ฉลาด" ขึ้น โค้ดที่สั้นและอ่านง่ายไม่ได้มีไว้แค่ให้เราดูเอง แต่มีไว้เพื่อให้คนในทีมที่มาดูแลต่อเข้าใจสิ่งที่เราต้องการจะสื่อสารได้ทันที
-- หาผู้ใช้ที่อยู่ในกลุ่มจังหวัดที่กำหนด
SELECT * FROM users WHERE city IN ('Bangkok', 'Chonburi', 'Rayong');
-- หาผู้ใช้ที่มีอายุระหว่าง 20 ถึง 30 ปี
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
คำสั่ง IN รับค่าเป็นรายการในวงเล็บคั่นด้วยคอมม่า , ส่วน BETWEEN จะรวมค่าขอบทั้งสองข้าง (20 และ 30) เข้าไปด้วยเสมอ การใช้งานแบบนี้ลดความผิดพลาดจากการพิมพ์เงื่อนไขซ้ำซ้อนได้ดีมาก
ผลลัพธ์จะแสดงข้อมูลที่อยู่ในกลุ่มหรือช่วงที่คุณกำหนดไว้ หากไม่มีข้อมูลในช่วงนั้น ฐานข้อมูลก็จะแสดงผลลัพธ์ว่างเปล่าตามปกติ
ค้นหาข้อความแบบ Case-Insensitive ด้วย ILIKE
เวลาผู้ใช้งานพิมพ์ค้นหา พวกเขาอาจจะพิมพ์ตัวเล็กหรือตัวใหญ่สลับกันไปมา เช่น "somchai" หรือ "SOMCHAI" ถ้าเราใช้ LIKE ปกติ ฐานข้อมูลจะมองว่าสองคำนี้ไม่เหมือนกัน เราจึงต้องใช้ ILIKE (คำสั่งค้นหาข้อความแบบไม่สนตัวเล็กตัวใหญ่) เข้ามาจัดการ
คำว่า Case-Insensitive (ไม่สนใจตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่) คือหัวใจสำคัญของฟีเจอร์ค้นหาที่ดีในแอปพลิเคชัน การใช้เครื่องหมาย % (เปอร์เซ็นต์) ร่วมกับ ILIKE จะช่วยให้เราค้นหาข้อความบางส่วนได้ เช่น หาชื่อที่มีคำว่า "chai" อยู่ข้างใน
ระวังเรื่องประสิทธิภาพการค้นหาเมื่อข้อมูลมีจำนวนมหาศาล การใช้ ILIKE กับข้อมูลหลักล้านแถวอาจทำให้ฐานข้อมูลทำงานหนักและช้าลงได้ หากโปรเจกต์ของคุณเริ่มมีผู้ใช้เยอะ ควรศึกษาเรื่อง Index (ดัชนีช่วยค้นหาข้อมูล) เพิ่มเติมในอนาคต
-- ค้นหาชื่อที่มีคำว่า chai โดยไม่สนตัวเล็กตัวใหญ่
SELECT * FROM users WHERE name ILIKE '%chai%';
-- ค้นหาอีเมลที่ลงท้ายด้วย @gmail.com
SELECT * FROM users WHERE email ILIKE '%@gmail.com';
เครื่องหมาย % คือ Wildcard (ตัวแทนข้อความอะไรก็ได้) การวางไว้หน้าและหลัง %chai% หมายความว่ามีอะไรอยู่ข้างหน้าหรือข้างหลังคำว่า chai ก็ได้ ส่วน ILIKE '%@gmail.com' จะหาเฉพาะบรรทัดที่ลงท้ายด้วยคำนั้นพอดี
ผลลัพธ์จะแสดงรายชื่อหรืออีเมลทั้งหมดที่ตรงตามรูปแบบที่คุณพิมพ์ แม้ผู้ใช้จะพิมพ์ตัวอักษรพิมพ์ใหญ่หรือพิมพ์เล็กผสมกันมาก็ตาม
สรุป: การนำไปใช้จริงในการพัฒนาซอฟต์แวร์
ทั้งหมดนี้คือเครื่องมือพื้นฐานที่คุณต้องใช้ในทุกๆ โปรเจกต์ ไม่ว่าจะเป็นการทำเว็บแอปพลิเคชันหรือระบบจัดการหลังบ้าน การดึงข้อมูลให้แม่นยำด้วย WHERE และ ILIKE จะทำให้แอปของคุณดูเป็นมืออาชีพและใช้งานง่ายสำหรับผู้ใช้เสมอ ความเชี่ยวชาญเหล่านี้เกิดจากการฝึกฝนทำโจทย์จริง
สมมติว่าคุณกำลังทำระบบร้านค้าออนไลน์ คุณจะต้องใช้ SELECT เพื่อดึงรายการสินค้า ใช้ WHERE กับ BETWEEN เพื่อทำระบบกรองสินค้าตามราคา และใช้ ILIKE เพื่อทำช่องค้นหาสินค้าที่พิมพ์หาชื่อได้ง่าย แม้ลูกค้าจะพิมพ์ตัวเล็กตัวใหญ่ผสมกัน ระบบของคุณก็จะยังทำงานได้อย่างถูกต้อง
จงจำไว้ว่าไม่มีโปรแกรมเมอร์คนไหนเก่งขึ้นจากการอ่านเพียงอย่างเดียว หลังจากอ่านบทความนี้จบ ให้ลองติดตั้ง PostgreSQL ในเครื่องตัวเอง แล้วสร้างตารางจำลองขึ้นมาทดลองรันคำสั่งเหล่านี้ดู การได้เห็นผลลัพธ์ด้วยตาตัวเองคือวิธีเรียนรู้ที่เร็วที่สุดสำหรับมือใหม่ทุกคน