SQL เบื้องต้น: SELECT, INSERT, UPDATE, DELETE, JOIN

SQL (Structured Query Language) คือภาษามาตรฐานสำหรับจัดการฐานข้อมูลเชิงสัมพันธ์ ใช้สร้างตาราง เพิ่มข้อมูล อ่านข้อมูล แก้ไข ลบ และเชื่อมข้อมูลหลายตารางเข้าด้วยกัน

Timeline/ประวัติศาสตร์

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#fabd2f", "primaryTextColor": "#282828", "primaryBorderColor": "#b57614", "lineColor": "#7c6f64", "secondaryColor": "#83a598", "tertiaryColor": "#b8bb26", "background": "#fbf1c7", "mainBkg": "#ebdbb2", "fontFamily": "Tahoma, sans-serif"}}}%%
flowchart LR
  subgraph Era1["ยุคไฟล์ข้อมูล / File Era"]
    A["CSV/Text File
ค้นหาและเชื่อมข้อมูลยาก"] end subgraph Era2["ยุค Relational DB / SQL Era"] B["Table + Row
โครงสร้างชัดเจน"] C["SQL
ภาษาจัดการข้อมูล"] end subgraph Era3["ยุค Analytics / Modern SQL"] D["JOIN + Aggregate
วิเคราะห์ข้อมูล"] E["Index + Query Plan
เพิ่มประสิทธิภาพ"] end A --> B --> C --> D --> E

คำสั่งหลัก

ตารางเปรียบเทียบ JOIN

JOIN ความหมาย เหมาะกับ
INNER JOIN เอาเฉพาะแถวที่ match กัน รายการที่มีข้อมูลสัมพันธ์ครบ
LEFT JOIN เอาฝั่งซ้ายทั้งหมด ผู้ใช้ทั้งหมด แม้ยังไม่มี order
RIGHT JOIN เอาฝั่งขวาทั้งหมด กรณีเน้นตารางขวา
FULL OUTER JOIN เอาทั้งสองฝั่ง ตรวจข้อมูลที่ไม่ match

Mermaid Diagram: SQL Query Flow

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#fabd2f", "primaryTextColor": "#282828", "primaryBorderColor": "#b57614", "lineColor": "#7c6f64", "secondaryColor": "#83a598", "tertiaryColor": "#b8bb26", "background": "#fbf1c7", "mainBkg": "#ebdbb2", "fontFamily": "Tahoma, sans-serif"}}}%%
flowchart TD
  A["SQL Query
คำสั่ง SQL"] --> B["Parser
ตรวจ syntax"] B --> C["Planner
วางแผน query"] C --> D["Executor
อ่าน/เขียนข้อมูล"] D --> E["Result Set
ผลลัพธ์"]

สมการคณิตศาสตร์: จำนวนแถวหลัง JOIN

R=AB

Code Example

-- สร้างตาราง users และ posts
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100) NOT NULL,
  email VARCHAR(150) UNIQUE NOT NULL,
  age INT
);

CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  user_id INT REFERENCES users(id),
  title VARCHAR(200) NOT NULL
);

-- เพิ่มข้อมูล
INSERT INTO users (name, email, age)
VALUES ('Ana', 'ana@example.com', 21);

-- อ่านข้อมูลพร้อมเงื่อนไข
SELECT * FROM users
WHERE age > 18
ORDER BY name
LIMIT 10;

-- แก้ไขข้อมูล
UPDATE users SET name = 'Bob'
WHERE id = 1;

-- JOIN ข้อมูลผู้ใช้กับโพสต์
SELECT users.name, posts.title
FROM users
INNER JOIN posts ON posts.user_id = users.id;

-- สรุปจำนวนโพสต์ต่อผู้ใช้
SELECT users.name, COUNT(posts.id) AS post_count
FROM users
LEFT JOIN posts ON posts.user_id = users.id
GROUP BY users.id, users.name
HAVING COUNT(posts.id) >= 0;

-- ตัวอย่างการใช้งาน:
-- นำคำสั่งไปรันใน PostgreSQL หรือ SQLite ที่ปรับชนิดข้อมูลให้ตรงระบบ

กิจกรรมท้ายบท

  1. สร้างตาราง users และ courses
  2. เพิ่มข้อมูลอย่างน้อย 3 แถว
  3. เขียน SELECT แบบมี WHERE และ ORDER BY
  4. เขียน JOIN เพื่อเชื่อมข้อมูลสองตาราง

กลับสัปดาห์ที่ 11