Notes & software courses · Free to learn
Aph's Blog
On this page

SQL เจาะลึก

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

ภาษาสำหรับคุยกับฐานข้อมูล — สร้าง ดึง แก้ ลบ และรวมข้อมูลข้ามตารางด้วย JOIN

SQL (Structured Query Language) คือภาษาที่ใช้สั่งงานฐานข้อมูล relational ทุกตัว หัวข้อนี้ครอบคลุมตั้งแต่คำสั่งพื้นฐานจนถึง JOIN และ GROUP BY ที่ใช้บ่อยในงานจริง

CRUD พื้นฐาน

sql
-- สร้างตาราง
CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    age INTEGER
);

-- เพิ่มข้อมูล
INSERT INTO users (name, age) VALUES ('Aph', 25);

-- ดึงข้อมูล
SELECT * FROM users;
SELECT name, age FROM users WHERE age >= 18;

-- แก้ไข
UPDATE users SET age = 26 WHERE name = 'Aph';

-- ลบ
DELETE FROM users WHERE id = 1;
DELETE/UPDATE ต้องมี WHERE

DELETE FROM users; (ไม่มี WHERE) = ลบทุกแถวในตาราง! เช่นเดียวกับ UPDATE ที่ไม่มี WHERE จะแก้ทุกแถว — ตรวจ WHERE ให้ดีก่อนรันเสมอ โดยเฉพาะบนฐานข้อมูลจริง

WHERE, ORDER BY, LIMIT

sql
SELECT * FROM users
WHERE age >= 18 AND name LIKE 'A%'   -- เงื่อนไข (LIKE = คล้าย)
ORDER BY age DESC                     -- เรียงจากมากไปน้อย
LIMIT 10;                             -- เอาแค่ 10 แถว

JOIN — รวมข้อมูลข้ามตาราง

JOIN เชื่อมตารางเข้าด้วยกันผ่าน key เช่น เอาโพสต์มาแสดงพร้อมชื่อเจ้าของ INNER JOIN เอาเฉพาะที่จับคู่ได้, LEFT JOIN เอาฝั่งซ้ายทั้งหมด

sql
-- เอาโพสต์พร้อมชื่อผู้เขียน
SELECT posts.title, users.name
FROM posts
INNER JOIN users ON posts.user_id = users.id;

-- LEFT JOIN: เอา users ทุกคน แม้ไม่มีโพสต์ (โพสต์เป็น NULL)
SELECT users.name, posts.title
FROM users
LEFT JOIN posts ON users.id = posts.user_id;

GROUP BY + aggregate

จัดกลุ่มแล้วสรุปด้วยฟังก์ชันรวม: COUNT, SUM, AVG, MAX, MIN

sql
-- นับจำนวนโพสต์ของแต่ละผู้ใช้
SELECT user_id, COUNT(*) AS post_count
FROM posts
GROUP BY user_id;

-- อายุเฉลี่ยแยกตามเมือง (เฉพาะกลุ่มที่เกิน 1 คน)
SELECT city, AVG(age) AS avg_age
FROM users
GROUP BY city
HAVING COUNT(*) > 1;   -- HAVING = WHERE สำหรับหลัง GROUP BY

สรุปหัวข้อนี้

  • CRUD: CREATE/INSERT/SELECT/UPDATE/DELETE — DELETE/UPDATE ต้องมี WHERE
  • WHERE กรอง, ORDER BY เรียง, LIMIT จำกัดจำนวน
  • JOIN รวมตารางผ่าน key: INNER (จับคู่ได้) / LEFT (ซ้ายทั้งหมด)
  • GROUP BY + COUNT/SUM/AVG สรุปตามกลุ่ม; HAVING กรองหลังกลุ่ม
แบบฝึกหัด

1) เขียน SELECT ดึงผู้ใช้อายุ >= 20 เรียงตามชื่อ 2) JOIN posts กับ users เอา title + ชื่อผู้เขียน 3) นับจำนวนโพสต์ต่อผู้ใช้ด้วย GROUP BY 4) หาเมืองที่มีผู้ใช้มากกว่า 2 คน (HAVING)