สอนภาษา SQL ตั้งแต่ต้น
SQL (Structured Query Language) คือภาษาที่ใช้สั่งงานฐานข้อมูลเชิงสัมพันธ์ ไม่ว่าจะเป็น SQLite, PostgreSQL, MySQL หรือ SQL Server คำสั่งพื้นฐานส่วนใหญ่เหมือนกัน บทความนี้จะให้คุณสร้างตาราง เพิ่มข้อมูล ค้นหา เชื่อมตาราง จัดกลุ่ม และแก้ไขข้อมูล โดยใช้ SQLite ที่ไม่ต้องติดตั้งเซิร์ฟเวอร์
ทุกคำสั่งในบทความนี้ถูกรันจริงด้วย SQLite 3.50 และได้ผลลัพธ์ตามที่แสดง
สิ่งที่ต้องเตรียม
- SQLite (ตรวจด้วย `sqlite3 --version`) หรือโปรแกรม DB Browser for SQLite ที่ฟรี
ภาพรวมของตารางและความสัมพันธ์
สร้างตารางและเพิ่มข้อมูล
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
class_id INTEGER
);
CREATE TABLE classes (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE scores (
student_id INTEGER REFERENCES students(id),
subject TEXT,
score INTEGER
);
INSERT INTO classes VALUES (1, 'ม.4/1'), (2, 'ม.4/2');
INSERT INTO students VALUES (1, 'สมชาย', 1), (2, 'สมหญิง', 1), (3, 'สมศักดิ์', 2);
INSERT INTO scores VALUES (1, 'คณิต', 85), (1, 'อังกฤษ', 70), (2, 'คณิต', 72), (3, 'คณิต', 45), (3, 'อังกฤษ', 60);
- `PRIMARY KEY` ระบุคีย์หลักที่ไม่ซ้ำกัน
- `NOT NULL` บังคับให้ต้องมีค่า
- `REFERENCES` สร้างความสัมพันธ์ระหว่างตาราง ทำให้ `scores.student_id` ต้องมีอยู่ในตาราง `students`
ค้นหาด้วย SELECT และ WHERE
SELECT name FROM students WHERE class_id = 1;
เชื่อมตารางด้วย JOIN
SELECT s.name, c.title FROM students s JOIN classes c ON c.id = s.class_id ORDER BY s.name;
`JOIN` เชื่อมแถวจากสองตารางที่คีย์ตรงกัน ตัวอักษร `s` และ `c` เป็นชื่อย่อของตาราง
จัดกลุ่มด้วย GROUP BY
SELECT subject, AVG(score) AS avg_score, COUNT(*) AS n FROM scores GROUP BY subject ORDER BY subject;
ฟังก์ชันรวม เช่น `AVG`, `COUNT`, `SUM` ทำงานกับแต่ละกลุ่มที่ `GROUP BY` แบ่งไว้ ใช้ `HAVING` เพื่อกรองหลังจัดกลุ่ม
SELECT student_id, SUM(score) AS total FROM scores GROUP BY student_id HAVING SUM(score) >= 100;
แก้ไขและลบข้อมูล
UPDATE scores SET score = score + 5 WHERE student_id = 3 AND subject = 'คณิต';
DELETE FROM scores WHERE score < 50;
SELECT student_id, subject, score FROM scores ORDER BY student_id, subject;
ควรสังเกตว่าการ `UPDATE` ทำให้คะแนน 45 กลายเป็น 50 ดังนั้น `DELETE` ที่ลบคะแนนต่ำกว่า 50 จึงไม่ลบแถวใดเลย
ผลลัพธ์ที่ได้จากการรันจริง
name
------
สมชาย
สมหญิง
name title
-------- -----
สมชาย ม.4/1
สมศักดิ์ ม.4/2
สมหญิง ม.4/1
subject avg_score n
------- ---------------- -
คณิต 67.3333333333333 3
อังกฤษ 65.0 2
student_id total
---------- -----
1 155
3 105
student_id subject score
---------- ------- -----
1 คณิต 85
1 อังกฤษ 70
2 คณิต 72
3 คณิต 50
3 อังกฤษ 60
ข้อผิดพลาดที่มือใหม่มักเจอ
- **ลืม `WHERE` ใน `UPDATE` หรือ `DELETE`:** จะแก้หรือลบทุกแถวในตาราง ควรรัน `SELECT` ด้วยเงื่อนไขเดียวกันก่อนเสมอ
- **เขียน `WHERE` ใช้กับฟังก์ชันรวม:** เงื่อนไขกับผลรวมต้องใช้ `HAVING`
- **ใช้เครื่องหมายคำพูดคู่กับค่าข้อความ:** ใน SQL มาตรฐานใช้เครื่องหมายคำพูดเดี่ยว `'...'` สำหรับค่าข้อความ
- **ลืมว่า `ORDER BY` ไม่มีผลถ้าไม่ระบุ:** ถ้าต้องการลำดับที่แน่นอนต้องระบุเสมอ
ขั้นต่อไป
ลองออกแบบตารางของคุณเอง เช่น ตารางสินค้าและคำสั่งซื้อ แล้วเขียน `JOIN` เพื่อดูยอดขายรวมแยกตามสินค้า จากนั้นเรียนรู้ดัชนี (index) และธุรกรรม (transaction) ซึ่งสำคัญเมื่อข้อมูลมากขึ้น
สรุป
SQL ใช้สร้างโครงสร้างด้วย `CREATE` จัดการข้อมูลด้วย `INSERT`, `UPDATE` และ `DELETE` และค้นหาด้วย `SELECT` ร่วมกับ `WHERE`, `JOIN`, `GROUP BY` และ `HAVING` การรันทดสอบบนข้อมูลตัวอย่างเล็ก ๆ จะช่วยให้เข้าใจผลของแต่ละคำสั่งได้ชัดเจนที่สุด