⏱️ ~13 นาที

Database & SQL

เก็บข้อมูลถาวรด้วยฐานข้อมูลและภาษา SQL

ทำไมต้อง Database?

ในบทที่แล้วเราเก็บข้อมูลใน ตัวแปร ในหน่วยความจำ ปัญหาคือ: ปิดเซิร์ฟเวอร์ → ข้อมูลหายหมด

Database (ฐานข้อมูล) แก้ปัญหานี้ — เก็บข้อมูล ถาวร บนดิสก์ และจัดการข้อมูลจำนวนมากได้ดีกว่าตัวแปรมาก

ประเภท Database หลัก

ประเภทตัวอย่างเหมาะกับ
Relational (SQL)MySQL, PostgreSQL, SQLiteข้อมูลเป็นตาราง มีความสัมพันธ์ชัดเจน
NoSQLMongoDBข้อมูลเป็น document (คล้าย object)

ในบทนี้เราใช้ SQLite — เพราะ:

  • ✅ ฝังมากับ Node ได้ง่าย ไม่ต้องติดตั้งเซิร์ฟเวอร์แยก
  • ✅ เก็บข้อมูลในไฟล์เดียว
  • ✅ ใช้ภาษา SQL เดียวกับ MySQL/PostgreSQL

ภาพ Database

Database ประกอบด้วย ตาราง (table) แต่ละตารางมี แถว (row) และ คอลัมน์ (column):

ตาราง users:

idnameemail
1สมชายsom@x.com
2มาลีmalee@x.com

เหมือนตาราง Excel เลย แต่ค้นหา/จัดการได้ทรงพลังกว่า

SQL พื้นฐาน — 4 คำสั่งหลัก (CRUD)

1. CREATE TABLE — สร้างตาราง

CREATE TABLE users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  email TEXT UNIQUE
);

2. INSERT — เพิ่มข้อมูล (Create)

INSERT INTO users (name, email)
VALUES ('สมชาย', 'som@x.com');

3. SELECT — อ่านข้อมูล (Read)

-- ดูทั้งหมด
SELECT * FROM users;

-- เลือกบางคอลัมน์
SELECT name, email FROM users;

-- มีเงื่อนไข
SELECT * FROM users WHERE name = 'สมชาย';

4. UPDATE — แก้ไข (Update)

UPDATE users
SET email = 'new@x.com'
WHERE id = 1;

⚠️ ห้ามลืม WHERE ไม่งั้นจะแก้ ทุกแถว!

5. DELETE — ลบ (Delete)

DELETE FROM users WHERE id = 2;

⚠️ ห้ามลืม WHERE เช่นกัน ไม่งั้น ลบหมดตาราง

ลองทำจริง: Express + SQLite

ติดตั้ง:

mkdir db-api
cd db-api
npm init -y
npm install express sqlite3

สร้าง index.js:

const express = require("express");
const sqlite3 = require("sqlite3").verbose();
const app = express();
app.use(express.json());

// เปิด/สร้างไฟล์ database ชื่อ shop.db
const db = new sqlite3.Database("./shop.db");

// สร้างตาราง (ถ้ายังไม่มี)
db.serialize(() => {
  db.run(`
    CREATE TABLE IF NOT EXISTS products (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      name TEXT NOT NULL,
      price REAL
    )
  `);
});

// GET /products — ดูทั้งหมด
app.get("/products", (req, res) => {
  db.all("SELECT * FROM products", [], (err, rows) => {
    if (err) return res.status(500).json({ error: err.message });
    res.json(rows);
  });
});

// POST /products — เพิ่มใหม่
app.post("/products", (req, res) => {
  const { name, price } = req.body;
  db.run(
    "INSERT INTO products (name, price) VALUES (?, ?)",
    [name, price],
    function (err) {
      if (err) return res.status(500).json({ error: err.message });
      res.status(201).json({ id: this.lastID, name, price });
    }
  );
});

// GET /products/:id — ดูอันเดียว
app.get("/products/:id", (req, res) => {
  db.get(
    "SELECT * FROM products WHERE id = ?",
    [req.params.id],
    (err, row) => {
      if (err) return res.status(500).json({ error: err.message });
      if (!row) return res.status(404).json({ error: "ไม่พบ" });
      res.json(row);
    }
  );
});

// DELETE /products/:id — ลบ
app.delete("/products/:id", (req, res) => {
  db.run(
    "DELETE FROM products WHERE id = ?",
    [req.params.id],
    function (err) {
      if (err) return res.status(500).json({ error: err.message });
      res.status(204).send();
    }
  );
});

app.listen(3000, () => console.log("http://localhost:3000"));

ลองรันแล้ว POST เพิ่มสินค้า แล้ว GET ดู — ข้อมูลอยู่ในไฟล์ shop.db ถาวรแล้ว!

ระวัง SQL Injection!

อันตราย (ต่อสตริงเอง):

db.run(`SELECT * FROM users WHERE name = '${name}'`);

ผู้ใช้ใส่ ' OR '1'='1 ทำให้ดูข้อมูลทั้งหมดได้

ปลอดภัย (ใช้ ? parameter):

db.run("SELECT * FROM users WHERE name = ?", [name]);

กฎเหตุเตือน: อย่าต่อข้อมูลจากผู้ใช้เข้า SQL โดยตรง ใช้ ? เสมอ

เครื่องมือดู database

  • DB Browser for SQLite — GUI ดูไฟล์ .db ฟรี
  • DBeaver — ดูได้หลายประเภท database

สรุป

SQLใช้ทำอะไร
CREATE TABLEสร้างตาราง
INSERT INTOเพิ่ม
SELECTอ่าน
UPDATEแก้ (อย่าลืม WHERE)
DELETEลบ (อย่าลืม WHERE)

จบโมดูล Backend! บทหน้า: มาเรียน React เพื่อทำ Frontend ทันสมัย ⚛️

อ่านจบแล้ว? ทำเครื่องหมายว่าเสร็จเพื่อบันทึกความคืบหน้า

🧠

แบบทดสอบ

ตอบให้ครบแล้วกด “ตรวจคำตอบ” เพื่อเช็คความเข้าใจ

  1. 1. ทำไมต้องใช้ database แทนการเก็บในตัวแปร?

  2. 2. คำสั่ง SQL ใดใช้ดึงข้อมูล?

  3. 3. คำสั่ง SQL ใดใช้เพิ่มข้อมูลใหม่?

กำลังโหลด…