บทความนี้เป็นส่วนหนึ่งของซีรีส์ Full-Stack PHP 8 + Bootstrap 5 + MySQL — สร้างเว็บไซต์แบบ Full Stack ตั้งแต่พื้นฐานจนใช้งานได้จริง พร้อมสร้างและเผยแพร่เว็บไซต์ Portfolio ของตนเอง (เรียบเรียงจากคู่มืออบรมของ Wutthiphon Tassana — Wirabyte CO., LTD.) — ตอนที่ 9/10
SQL (Structured Query Language) คือภาษาที่ใช้สั่งงานฐานข้อมูล ทั้งค้นหา เพิ่ม แก้ไข และลบข้อมูล คำสั่งหลักที่ใช้ประจำมี 4 คำสั่ง
| คำสั่ง | หน้าที่ |
|---|---|
| SELECT | ดึงข้อมูลมาแสดง |
| INSERT | เพิ่มข้อมูลใหม่ |
| UPDATE | แก้ไขข้อมูลเดิม |
| DELETE | ลบข้อมูล |
ตัวอย่างในบทนี้อ้างอิงตาราง projects และ categories ของเว็บ Portfolio สามารถพิมพ์ทดลองได้เลยในแท็บ SQL ของ phpMyAdmin
SELECT ดึงข้อมูลมาแสดง
ตัวอย่าง
-- ดึงทุกแถว ทุกคอลัมน์ ของตาราง projects
SELECT * FROM projects;
-- กรองเฉพาะแถวที่ตรงเงื่อนไขด้วย WHERE
SELECT * FROM projects WHERE category_id = 1;
-- เรียงลำดับด้วย ORDER BY (DESC ใหม่ไปเก่า , ASC เก่าไปใหม่)
SELECT * FROM projects ORDER BY id DESC; LEFT JOIN เชื่อมข้อมูลสองตาราง
ตาราง projects เก็บ category_id ไว้เป็นตัวเลข ถ้าอยากแสดงชื่อหมวดหมู่จริง ๆ ต้องไปเอาจากตาราง categories การดึงข้อมูลจากสองตารางพร้อมกันใช้ JOIN โดย LEFT JOIN หมายถึง ยึดตารางฝั่งซ้าย (ตารางแรก) เป็นหลัก แถวไหนไม่มีคู่ในตารางขวาก็ยังแสดง เพียงแต่ค่าที่ควรเชื่อมมาจะเป็น NULL (ค่าว่าง)
การทำงานของ LEFT JOIN ระหว่างตาราง projects กับ categories
ตัวอย่าง
SELECT projects.*, categories.name AS category_name
FROM projects
LEFT JOIN categories ON projects.category_id = categories.id;
- ON บอกว่าให้จับคู่สองตารางด้วยคอลัมน์ไหน
- AS คือการตั้งชื่อใหม่ให้คอลัมน์ผลลัพธ์ ป้องกันชื่อ name ชนกับคอลัมน์ name ของตารางอื่น
INSERT เพิ่มข้อมูลใหม่
ตัวอย่าง
INSERT INTO categories(name) VALUES ('เว็บไซต์');
INSERT INTO projects(title, description, link, image_url, category_id)
VALUES ('เว็บแนะนำตัวเอง', 'เว็บ HTML แรกของผม', 'https://example.com', 'https://picsum.photos/600/400', 1);
ลำดับของค่าใน VALUES ต้องตรงกับลำดับชื่อคอลัมน์ในวงเล็บแรก ส่วน id ไม่ต้องใส่เพราะ AUTO_INCREMENT รันให้อัตโนมัติ
UPDATE แก้ไขข้อมูลเดิม
ตัวอย่าง
UPDATE projects SET title = 'ชื่อใหม่' WHERE id = 1;
ระวัง! ถ้าลืมใส่ WHERE ข้อมูลจะถูกแก้ทั้งตารางทันที
DELETE ลบข้อมูล
ตัวอย่าง
DELETE FROM projects WHERE id = 1;
เช่นเดียวกัน ถ้าลืมใส่ WHERE ข้อมูลจะถูกลบทั้งตาราง และการลบในฐานข้อมูลไม่มีถังขยะให้กู้คืน ควรตรวจเงื่อนไขให้ดีก่อนกดรันเสมอ
🧪 Workshop 6: สร้าง Database และ table
สร้าง Database และ table ต่าง ๆ ผ่าน PhpMyAdmin และคำสั่ง SQL เพื่อให้พร้อมสำหรับเก็บข้อมูลผลงานและรางวัล และข้อมูลสมุดเยี่ยมชม
วิธีทำ
- เข้า PhpMyAdmin ผ่าน URL: http://localhost/phpmyadmin/
- คลิก New ที่เมนู Aside ด้านซ้าย
- สร้าง Database ชื่อ portfolio_db เลือก unicode เป็น utf8mb4_unicode_ci
- คลิกเลือก Database portfolio_db แล้วไปที่แท็บ SQL
- คัดลอกคำสั่ง SQL ด้านล่างทั้งหมดไปวาง แล้วกด Go
- ตรวจที่แท็บ Structure ต้องเห็นตาราง categories , projects , messages ครบทั้ง 3 ตาราง
- ลองรันชุดคำสั่ง INSERT ข้อมูลตัวอย่าง แล้วเปิดดูข้อมูลผ่านแท็บ Browse (Exclusive)
- ลองเขียนคำสั่ง INSERT ข้อมูลเข้าด้วยตัวเอง และ SELECT เพื่อเรียกข้อมูล
คำสั่ง SQL สำหรับวางในแท็บ SQL (คัดลอกได้ทั้งก้อน)
-- ตารางหมวดหมู่ผลงาน
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
) DEFAULT CHARSET=utf8mb4;
-- ตารางผลงานและรางวัล
CREATE TABLE projects (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
description TEXT,
link VARCHAR(255),
image_url VARCHAR(255),
category_id INT
) DEFAULT CHARSET=utf8mb4;
-- ตารางสมุดเยี่ยม (created_at บันทึกเวลาให้อัตโนมัติตอน INSERT)
CREATE TABLE messages (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
message TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) DEFAULT CHARSET=utf8mb4;
-- (Exclusive) ข้อมูลตัวอย่างไว้ทดสอบ
INSERT INTO categories(name) VALUES ('เว็บไซต์'), ('เกม'), ('อื่น ๆ');
INSERT INTO projects(title, description, link, image_url, category_id) VALUES
('เว็บ Portfolio', 'เว็บที่กำลังสร้างในวันนี้', 'https://example.com', 'https://picsum.photos/600/400', 1);
INSERT INTO messages(name, message) VALUES ('เพื่อนร่วมห้อง', 'เว็บสวยมาก สู้ ๆ');