สอนภาษา SQL ตั้งแต่ต้น

สอนภาษา SQL ตั้งแต่ต้น

SQL (Structured Query Language) คือภาษาที่ใช้สั่งงานฐานข้อมูลเชิงสัมพันธ์ ไม่ว่าจะเป็น SQLite, PostgreSQL, MySQL หรือ SQL Server คำสั่งพื้นฐานส่วนใหญ่เหมือนกัน บทความนี้จะให้คุณสร้างตาราง เพิ่มข้อมูล ค้นหา เชื่อมตาราง จัดกลุ่ม และแก้ไขข้อมูล โดยใช้ SQLite ที่ไม่ต้องติดตั้งเซิร์ฟเวอร์

ทุกคำสั่งในบทความนี้ถูกรันจริงด้วย SQLite 3.50 และได้ผลลัพธ์ตามที่แสดง

สิ่งที่ต้องเตรียม

ภาพรวมของตารางและความสัมพันธ์

ภาพแผนผังตาราง students, classes และ scores ที่เชื่อมกันด้วยคีย์
ภาพแผนผังตาราง students, classes และ scores ที่เชื่อมกันด้วยคีย์

สร้างตารางและเพิ่มข้อมูล

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);

ค้นหาด้วย 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

ข้อผิดพลาดที่มือใหม่มักเจอ

ขั้นต่อไป

ลองออกแบบตารางของคุณเอง เช่น ตารางสินค้าและคำสั่งซื้อ แล้วเขียน `JOIN` เพื่อดูยอดขายรวมแยกตามสินค้า จากนั้นเรียนรู้ดัชนี (index) และธุรกรรม (transaction) ซึ่งสำคัญเมื่อข้อมูลมากขึ้น

สรุป

SQL ใช้สร้างโครงสร้างด้วย `CREATE` จัดการข้อมูลด้วย `INSERT`, `UPDATE` และ `DELETE` และค้นหาด้วย `SELECT` ร่วมกับ `WHERE`, `JOIN`, `GROUP BY` และ `HAVING` การรันทดสอบบนข้อมูลตัวอย่างเล็ก ๆ จะช่วยให้เข้าใจผลของแต่ละคำสั่งได้ชัดเจนที่สุด