Full-Stack PHP 8 ตอนที่ 9: ภาษา SQL เบื้องต้น

บทความนี้เป็นส่วนหนึ่งของซีรีส์ 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 ('เพื่อนร่วมห้อง', 'เว็บสวยมาก สู้ ๆ');
Wutthiphon Tassana
Wutthiphon Tassana