/อ่าน 14 นาที

SQL คืออะไร? คู่มือ Structured Query Language ฉบับครบ

แอปแทบทุกแบบที่คุณใช้ ตั้งแต่โซเชียลมีเดีย ธนาคาร ไปจนถึงอีคอมเมิร์ซ ล้วนเก็บข้อมูลในฐานข้อมูลเชิงสัมพันธ์และดึงข้อมูลด้วย SQL การเข้าใจ SQL จึงเป็นทักษะสำคัญสำหรับงานพัฒนา software, data analysis และ IT

SQL คืออะไร?

SQL ย่อมาจาก Structured Query Language เป็นภาษามาตรฐานสำหรับสร้าง query, แก้ไข และจัดการข้อมูลใน ฐานข้อมูลเชิงสัมพันธ์

SQL เป็นภาษาแบบ declarative คือคุณบอกว่าต้องการข้อมูลอะไร ส่วน database engine จะตัดสินใจเองว่าจะดึงข้อมูลอย่างมีประสิทธิภาพอย่างไร จึงต่างจากภาษาแบบเขียนขั้นตอน เช่น JavaScript หรือ Python

SQL ยังเป็นเทคโนโลยีหลัก เพราะใช้กับฐานข้อมูลอย่าง PostgreSQL, MySQL, SQLite, SQL Server, Oracle Database และระบบ analytics จำนวนมาก

การออกเสียง

SQL อ่านได้ทั้งแบบ "sequel" และแบบสะกดทีละตัวว่า "S-Q-L" ทั้งสองแบบเป็นที่เข้าใจทั่วไป ทีมงานมักใช้ตามชุมชนหรือระบบฐานข้อมูลที่ทำงานด้วย

ประวัติย่อของ SQL

SQL เริ่มจาก relational model ของ Edgar F. Codd ในปี 1970 จากนั้น Donald Chamberlin และ Raymond Boyce จาก IBM สร้าง SEQUEL ซึ่งต่อมากลายเป็น SQL เพื่อใช้ query ข้อมูลเชิงสัมพันธ์

ปีเหตุการณ์สำคัญ
1970Edgar F. Codd เผยแพร่แนวคิด relational model
1974IBM พัฒนา SEQUEL ซึ่งต่อมาถูกเปลี่ยนชื่อเป็น SQL
1979Oracle เปิดตัวฐานข้อมูล SQL เชิงพาณิชย์รุ่นแรก
1986SQL กลายเป็นมาตรฐาน ANSI
1992SQL-92 เพิ่มความสามารถสำคัญด้าน JOIN และ expressions
1999SQL:1999 เพิ่ม triggers, CTEs และ recursive queries
2016-2023มาตรฐาน SQL ยุคใหม่เพิ่ม JSON และ graph query features

อธิบายฐานข้อมูลเชิงสัมพันธ์

ฐานข้อมูลเชิงสัมพันธ์จัดข้อมูลเป็นตาราง โดยแต่ละตารางมักประกอบด้วย:

  • Columns หรือคอลัมน์ สำหรับกำหนด field เช่น name, email, price หรือ created_at
  • Rows หรือแถว โดยแต่ละแถวคือหนึ่ง record
  • Primary keys สำหรับระบุแถวแบบไม่ซ้ำ
  • Foreign keys สำหรับเชื่อมข้อมูลระหว่างตาราง
users(id, name, email)
orders(id, user_id, total, order_date)

orders.user_id -> users.id

โครงสร้างนี้ช่วยลดข้อมูลซ้ำ เช่น รายละเอียดลูกค้าเก็บไว้ครั้งเดียวในตาราง users แล้วตาราง orders อ้างถึงลูกค้าด้วย id

พื้นฐาน SQL Syntax

คำสั่ง SQL มักแบ่งออกเป็นหมวดหมู่ดังนี้:

หมวดหมู่คำสั่งจุดประสงค์
DQLSELECTดึงข้อมูล
DMLINSERT, UPDATE, DELETEแก้ไขข้อมูล
DDLCREATE, ALTER, DROPกำหนด schema และ tables
DCLGRANT, REVOKEควบคุมสิทธิ์
TCLBEGIN, COMMIT, ROLLBACKจัดการ transactions
SELECT users.name, orders.total
FROM users
JOIN orders ON orders.user_id = users.id
WHERE orders.total > 100
ORDER BY orders.total DESC;

CRUD Operations

CRUD หมายถึง create, read, update และ delete ซึ่งเป็นการทำงานพื้นฐานที่แอปส่วนใหญ่ทำกับข้อมูลที่เก็บไว้

-- Create
INSERT INTO products (name, price) VALUES ('Keyboard', 49.99);

-- Read
SELECT id, name, price FROM products WHERE price > 20;

-- Update
UPDATE products SET price = 44.99 WHERE id = 1;

-- Delete
DELETE FROM products WHERE id = 1;

การกรอง การเรียงลำดับ และการสรุปผล

Query จริงมักต้องกรองแถว เรียงผลลัพธ์ จัดกลุ่มข้อมูล และคำนวณค่าสรุป เช่น count, sum, average, minimum และ maximum

  • WHERE ใช้กรองแถว
  • ORDER BY ใช้เรียงผลลัพธ์
  • GROUP BY ใช้จัดกลุ่มเพื่อสรุปผล
  • HAVING ใช้กรองผลลัพธ์หลังจัดกลุ่ม

JOINs: การรวมตาราง

JOINs ใช้รวมข้อมูลจากหลายตาราง เป็นความสามารถสำคัญที่ทำให้ฐานข้อมูลเชิงสัมพันธ์แทนความสัมพันธ์จริงได้โดยไม่ต้องคัดลอกข้อมูลซ้ำไปทุกที่

  • INNER JOIN: คืนเฉพาะแถวที่ match กันทั้งสองตาราง
  • LEFT JOIN: คืนทุกแถวจากตารางซ้าย พร้อมแถวที่ match จากตารางขวา
  • RIGHT JOIN: คืนทุกแถวจากตารางขวา พร้อมแถวที่ match จากตารางซ้าย
  • FULL OUTER JOIN: คืนแถวจากทั้งสองฝั่ง และจับคู่เมื่อ match กัน
SELECT users.name, orders.order_date, orders.total
FROM users
INNER JOIN orders ON orders.user_id = users.id;

Subqueries และ CTEs

Subquery คือ query ที่อยู่ภายในอีก query หนึ่ง ส่วน CTE ที่เขียนด้วย WITH ใช้ตั้งชื่อ result set ชั่วคราว เพื่อให้ SQL ที่ซับซ้อนอ่านง่ายและนำไปใช้ต่อได้

Indexes และ Performance

Index คือโครงสร้างข้อมูลที่ช่วยให้ฐานข้อมูลค้นหาแถวได้เร็วขึ้น มักใช้ B-tree เป็นพื้นฐาน Index ช่วยเร่งการอ่าน แต่ใช้พื้นที่เพิ่ม และอาจทำให้การเขียนช้าลง เพราะ INSERT, UPDATE หรือ DELETE ต้องปรับ index ด้วย

CREATE INDEX idx_products_category ON products(category);
EXPLAIN SELECT * FROM products WHERE category = 'Electronics';

ข้อแลกเปลี่ยนของ Index

อย่า index ทุกคอลัมน์ ให้เน้นคอลัมน์ที่ใช้บ่อยใน WHERE, JOIN, ORDER BY และ uniqueness checks แล้วตรวจสอบผลด้วย EXPLAIN

Transactions และ ACID

คุณสมบัติความหมาย
Atomicityทุก operation สำเร็จทั้งหมด หรือ rollback ทั้งหมด
Consistencyฐานข้อมูลย้ายจากสถานะที่ถูกต้องหนึ่งไปสู่อีกสถานะที่ถูกต้อง
IsolationTransactions ที่ทำพร้อมกันไม่ทำให้ข้อมูลเสียหายกันเอง
Durabilityข้อมูลที่ commit แล้วต้องยังอยู่แม้ระบบล่ม
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

COMMIT;
-- ROLLBACK;

เปรียบเทียบ SQL Dialects

แม้ SQL จะมีมาตรฐาน แต่ฐานข้อมูลแต่ละตัวก็เพิ่ม feature และ syntax เฉพาะของตัวเอง

FeatureMySQLPostgreSQLSQLiteSQL Server
Auto-incrementAUTO_INCREMENTSERIAL / GENERATEDAUTOINCREMENTIDENTITY
จำกัดจำนวนแถวLIMITLIMITLIMITTOP / OFFSET-FETCH
ต่อ stringCONCAT()||||+
UpsertON DUPLICATE KEYON CONFLICTON CONFLICTMERGE
รองรับ JSONJSON typeJSONBJSON functionsJSON functions

SQL Injection และความปลอดภัย

SQL injection เกิดขึ้นเมื่อเอา input จากผู้ใช้มาต่อเป็น SQL โดยตรง ผู้โจมตีอาจเปลี่ยนความหมายของ query และอ่าน แก้ไข หรือลบข้อมูลได้

-- Vulnerable: string concatenation
query = "SELECT * FROM users WHERE name = '" + userInput + "'";

-- Safe: parameterized query
query = "SELECT * FROM users WHERE name = ?";
db.execute(query, [userInput]);

ใช้ Parameterized Queries เสมอ

อย่าต่อ user input เข้าไปใน SQL string โดยตรง ให้ใช้ prepared statements หรือ parameterized queries เพื่อให้ input ถูกมองเป็นข้อมูล ไม่ใช่ SQL ที่รันได้

แนวทางปฏิบัติที่ดี

  • จัดรูปแบบ SQL ให้สม่ำเสมอ ใช้ keyword ตัวใหญ่และ indentation ที่อ่านง่าย เครื่องมือ SQL formatter ช่วยได้
  • ตั้งชื่อตารางและคอลัมน์ให้สื่อความหมาย
  • หลีกเลี่ยง SELECT * ใน production query และเลือกเฉพาะคอลัมน์ที่ต้องใช้
  • เพิ่ม indexes อย่างมีกลยุทธ์ และตรวจสอบด้วย EXPLAIN
  • ใช้ transactions สำหรับการเปลี่ยนแปลงที่ต้องสำเร็จหรือ fail พร้อมกัน
  • ใช้ parameterized queries กับค่าที่มาจากผู้ใช้ทุกครั้ง
  • สำรองข้อมูลสม่ำเสมอ และทดสอบขั้นตอนการ restore ด้วย

SQL เทียบกับ NoSQL

NoSQL databases เช่น MongoDB, Redis, Cassandra และ DynamoDB เหมาะกับงานบางแบบที่ relational model ไม่ใช่คำตอบที่ดีที่สุด

ด้านSQLNoSQL
Data modelตารางที่มี rows และ columnsDocuments, key-value, graph หรือ wide-column
Schemaกำหนด schema ชัดเจนschema ยืดหยุ่น
Scalingมักเริ่มจาก vertical scalingมักเริ่มจาก horizontal scaling
Consistencyรองรับ ACID เข้มแข็งมักเป็น eventual หรือตั้งค่าได้
เหมาะกับข้อมูลมีโครงสร้างและ transactionsข้อมูลยืดหยุ่นและ workload ปริมาณสูง

ในทางปฏิบัติ ระบบสมัยใหม่จำนวนมากใช้ทั้งสองแบบ เช่น SQL สำหรับข้อมูลธุรกรรมอย่าง users และ orders และ NoSQL สำหรับ caching, search, events หรือ document storage

จัดรูปแบบ SQL ได้ทันที

ใช้ SQL Formatter ฟรีของเราเพื่อ beautify, indent และจัดมาตรฐาน SQL queries รองรับ dialect ที่พบบ่อย และทำงานในเบราว์เซอร์ของคุณ

ลองใช้ SQL Formatter ->

แหล่งอ้างอิง

  1. Codd, E. F. A Relational Model of Data for Large Shared Data Banks. https://dl.acm.org/doi/10.1145/362384.362685
  2. ISO/IEC 9075:2023. Information technology - Database languages - SQL.
  3. OWASP Foundation. SQL Injection. https://owasp.org/www-community/attacks/SQL_Injection
  4. PostgreSQL Global Development Group. PostgreSQL Documentation. https://www.postgresql.org/docs/
  5. MySQL. MySQL Reference Manual. https://dev.mysql.com/doc/
USTHJP