Database & SQL
เก็บข้อมูลถาวรด้วยฐานข้อมูลและภาษา SQL
ทำไมต้อง Database?
ในบทที่แล้วเราเก็บข้อมูลใน ตัวแปร ในหน่วยความจำ ปัญหาคือ: ปิดเซิร์ฟเวอร์ → ข้อมูลหายหมด
Database (ฐานข้อมูล) แก้ปัญหานี้ — เก็บข้อมูล ถาวร บนดิสก์ และจัดการข้อมูลจำนวนมากได้ดีกว่าตัวแปรมาก
ประเภท Database หลัก
| ประเภท | ตัวอย่าง | เหมาะกับ |
|---|---|---|
| Relational (SQL) | MySQL, PostgreSQL, SQLite | ข้อมูลเป็นตาราง มีความสัมพันธ์ชัดเจน |
| NoSQL | MongoDB | ข้อมูลเป็น document (คล้าย object) |
ในบทนี้เราใช้ SQLite — เพราะ:
- ✅ ฝังมากับ Node ได้ง่าย ไม่ต้องติดตั้งเซิร์ฟเวอร์แยก
- ✅ เก็บข้อมูลในไฟล์เดียว
- ✅ ใช้ภาษา SQL เดียวกับ MySQL/PostgreSQL
ภาพ Database
Database ประกอบด้วย ตาราง (table) แต่ละตารางมี แถว (row) และ คอลัมน์ (column):
ตาราง users:
| id | name | |
|---|---|---|
| 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. ทำไมต้องใช้ database แทนการเก็บในตัวแปร?
2. คำสั่ง SQL ใดใช้ดึงข้อมูล?
3. คำสั่ง SQL ใดใช้เพิ่มข้อมูลใหม่?
กำลังโหลด…