ข้ามไปยังเนื้อหา

CRUD & SQL

ฐานข้อมูลจะมีประโยชน์ก็ต่อเมื่อคุณใส่ข้อมูลเข้าไป ดึงกลับออกมา แก้ไข และลบได้ ใน PostgreSQL คุณทำทั้งหมดนั้นได้ด้วยการส่ง SQL — ภาษาแบบข้อความที่ server เข้าใจ คุณไม่ต้องแก้ไฟล์ table ด้วยมือ แค่เขียนคำสั่ง (statement) แล้ว server จะ parse และรันให้ ก่อนส่งกลับมาเป็นจำนวน row ที่ได้รับผลกระทบหรือชุดผลลัพธ์ (result set)

แทบทุกคำสั่ง SQL ที่คุณเขียนจะตรงกับหนึ่งในสี่แนวคิด ซึ่งรวมเรียกว่า CRUD: create, read, update และ delete โมดูลนี้จะพาเดินผ่านแต่ละอันด้วยตัวอย่างที่คุณวางลงใน psql ได้ตรง ๆ พร้อมกับ operation เดียวกันเป๊ะ ๆ ที่เขียนในรูปแบบ driver ยอดนิยมสี่ตัว เพื่อให้คุณนำความรู้นี้ไปใช้ในโค้ดแอปพลิเคชันจริงได้

ตัวย่อ CRUD เรียงตรงกับ SQL keyword สี่คำ เรียนรู้สิ่งเหล่านี้แล้วคุณก็ทำงานฐานข้อมูลในแต่ละวันได้แทบทั้งหมดแล้ว

CRUD actionSQL keywordWhat it does
CreateINSERTAdds new rows to a table
ReadSELECTReturns rows matching your criteria
UpdateUPDATEChanges columns in existing rows
DeleteDELETERemoves rows from a table

ทุกอย่างถูกสร้างขึ้นรอบ ๆ row ใน table table คือ table ที่มีชื่อ ประกอบด้วย column ที่มี type ตายตัว ส่วน row คือหนึ่งระเบียน (record) คำสั่ง SQL อธิบายว่า อะไร คือสิ่งที่คุณต้องการ — “ขอหนังสือที่ตีพิมพ์หลังปี 2000 ให้หน่อย” — แล้ว server จะคิดเองว่า จะทำอย่างไร

ไม่ว่าคุณจะพิมพ์ใน psql หรือเรียก driver จากแอปของคุณ เส้นทางเหมือนกัน: โค้ดของคุณส่ง SQL string ไปให้ server แล้ว server ทำงานกับ row ที่จัดเก็บอยู่ ก่อนส่งคำตอบกลับมา

flowchart LR
  A[Your app or psql] -->|SQL text| B[PostgreSQL server]
  B -->|reads and writes| C[(Table rows on disk)]
  C -->|result set or row count| B
  B -->|reply| A
round trip ของคำสั่ง SQL

เพื่อให้ทุกอย่างเป็นรูปธรรม ทุกบทเรียนในโมดูลนี้ใช้ schema เล็ก ๆ อันเดียวซ้ำกัน: table ของ authors และ table ของ books นี่คือการตั้งค่า ซึ่งคุณรันครั้งเดียวเพื่อทำตามไปด้วยกันได้

CREATE TABLE authors (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name text NOT NULL,
born int
);
CREATE TABLE books (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title text NOT NULL,
author_id bigint REFERENCES authors (id),
published int,
copies_sold int NOT NULL DEFAULT 0
);

ใน pgAdmin: เปิด Query Tool บนฐานข้อมูลของคุณ วางคำสั่ง CREATE TABLE แล้วกดปุ่มรัน คุณจะเห็น table ใหม่ปรากฏขึ้นใต้ Schemas แล้ว Tables ในแผนผัง browser ฝั่งซ้าย

  • Insert — เพิ่ม row ทีละ row หรือเป็นชุด ปล่อยให้ column รับค่า default และดึง id ที่ถูกสร้างขึ้นกลับมา
  • Select and filtering — เลือก column จำกัดด้วย WHERE เรียงลำดับ และแบ่งหน้า
  • Update and delete — แก้ไขและลบ row อย่างปลอดภัย และทำไม WHERE ที่ลืมใส่จึงอันตราย
  • Upsert — เพิ่ม row ใหม่ หรือ update row เดิมถ้ามีอยู่แล้ว ในคำสั่งเดียว
  • SQL keyword ไม่สนใจตัวพิมพ์เล็กพิมพ์ใหญ่ (select เท่ากับ SELECT) แต่การเขียน keyword เป็นตัวพิมพ์ใหญ่เป็นธรรมเนียมเพื่อความอ่านง่ายที่ใช้ตลอดทั้งคอร์สนี้
  • identifier อย่างชื่อ table และ column จะถูกแปลงเป็นตัวพิมพ์เล็กเว้นแต่คุณจะใส่เครื่องหมายอัญประกาศคู่ครอบ ดังนั้น Authors และ authors จึงหมายถึง table เดียวกัน
  • คำสั่งหนึ่งจบด้วยเซมิโคลอนใน psql driver มักส่งหนึ่งคำสั่งต่อการเรียกหนึ่งครั้ง ดังนั้นเซมิโคลอนจึงไม่บังคับ
  • การอ่าน (SELECT) ไม่เคยเปลี่ยนแปลงข้อมูล ส่วนอีกสามคำกริยาที่เหลือทำ ดังนั้นจงใช้ด้วยความระมัดระวังมากกว่า
SQL keyword ตัวไหนตรงกับส่วน "read" ของ CRUD?
ใน PostgreSQL เราแก้ข้อมูลที่เก็บอยู่บน disk ได้อย่างไร?
statement ตัวไหนที่ไม่ได้แก้ข้อมูลใน table?