Skip to content

Lộ trình 30 ngày học SQL ​

Tóm tắt: Trang này là bản đồ của cả khóa: 30 bài chia thành 4 chặng, từ câu SELECT đầu tiên đến index, transaction, window function, tối ưu truy vấn và bảo mật, kết thúc bằng một dự án cuối khóa. Cả khóa dùng một hệ quản trị duy nhất là PostgreSQL 16 và một bộ dữ liệu chung là cửa hàng DSC Shop, nên mọi ví dụ đều chạy được trên máy bạn.

Sau bài này bạn có thể:

  • Biết mỗi ngày học gì, ngày nào phụ thuộc ngày nào.
  • Dựng xong môi trường thực hành (PostgreSQL 16 + dữ liệu DSC Shop) trước khi vào Ngày 1.
  • Biết cách học một bài: đọc, chạy lại ví dụ, tự làm bài tập rồi mới mở đáp án.

Khóa học này dùng gì ​

Thành phầnLựa chọnVì sao
Hệ quản trị CSDLPostgreSQL 16Miễn phí, bám sát chuẩn SQL, có đủ mọi thứ khóa học cần: CTE, window function, FULL JOIN, INTERSECT/EXCEPT, JSONB, partition, EXPLAIN ANALYZE
Dữ liệuDSC Shop, cửa hàng đồ công nghệ: 7 bảng categories, products, customers, employees, orders, order_items, paymentsMột bộ dữ liệu cho cả khóa, nên bài sau dùng lại được những gì bài trước đã khám phá
Dữ liệu lớnSchema perf: 100.000 khách, 1.000.000 đơn hàngDùng cho các bài hiệu năng (Ngày 15, 20, 25, 28)
Công cụpsql (dòng lệnh) và Adminer (web), tùy chọn DBeaver/pgAdmin/VS Codepsql có sẵn trong mọi bản cài PostgreSQL

Khi cú pháp PostgreSQL khác hẳn MySQL hoặc SQL Server (ví dụ LIMIT và TOP, IDENTITY và AUTO_INCREMENT), bài học có một hộp Ghi chú dialect ngắn để bạn không bỡ ngỡ khi gặp hệ khác ngoài đời.

Chuẩn bị môi trường ​

Làm phần này trước Ngày 1. Hướng dẫn đầy đủ nằm ở setup/README.md; tóm tắt như sau.

Cách 1: Docker (khuyến nghị). Cài Docker Desktop, rồi ở thư mục gốc của repo chạy:

sh
docker compose up -d

Bạn có PostgreSQL 16 ở localhost:5432 (user postgres, mật khẩu postgres, database sql_challenge) đã nạp sẵn dữ liệu DSC Shop, và giao diện web Adminer ở http://localhost:8080.

Cách 2: cài PostgreSQL trực tiếp. Cài PostgreSQL 16 trở lên từ https://www.postgresql.org/download/, tạo database sql_challenge rồi nạp hai file setup/init/01_schema.sql và setup/init/02_seed.sql (lệnh cụ thể ở setup/README.md).

Kiểm tra nhanh: mở psql và chạy

sh
docker compose exec db psql -U postgres -d sql_challenge
sql
SELECT version();

Nếu dòng kết quả bắt đầu bằng PostgreSQL 16 là xong. Ngày 1 sẽ đi kỹ từng bước và giải thích các công cụ.

Hai việc sẽ cần về sau, chưa phải làm ngay:

  • Trước Ngày 15: nạp dữ liệu lớn bằng setup/perf_seed.sql (xem mục "Dữ liệu lớn cho các bài hiệu năng" trong setup/README.md).
  • Bất cứ khi nào lỡ sửa hỏng dữ liệu: chạy lại script init theo mục "Làm lại từ đầu" trong setup/README.md.

Cách học mỗi bài ​

Mọi bài (trừ bài ôn tập và bài đọc) có cùng khung:

  1. Tóm tắt và Sau bài này bạn có thể: đọc để biết đích đến.
  2. Cần biết trước: các bài phải học xong trước. Học theo thứ tự là đủ.
  3. Phần lý thuyết: mỗi khái niệm đi từ trực giác, đến cú pháp, đến ví dụ trên DSC Shop, kèm kết quả thật. Hãy gõ lại và chạy từng ví dụ, so với bảng kết quả trong bài.
  4. Lỗi thường gặp: các bẫy hay gặp, có ví dụ sai và cách sửa.
  5. Bài tập chia ba mức Cơ bản, Vận dụng, Thử thách. Tự làm trước, sau đó mới bấm "Đáp án".
  6. Tóm tắt và Đọc thêm.

Khoảng 1 đến 2 giờ mỗi ngày là vừa. Không cần học liền 30 ngày; quan trọng là làm hết bài tập và bài ôn tập trước khi sang chặng mới.

Chặng 1: Nền tảng và truy vấn đơn giản (Ngày 1-7) ​

NgàyBàiNội dung chính
1Giới thiệu SQL, RDBMS và môi trường thực hànhSQL, RDBMS, PostgreSQL; dựng môi trường bằng Docker (hoặc cài trực tiếp); psql và Adminer; khám phá DSC Shop (\dt, \d customers, SELECT đầu tiên); các nhóm lệnh DDL, DML, DCL, TCL
2Bảng, kiểu dữ liệu và ràng buộcBảng, cột, dòng; kiểu dữ liệu PostgreSQL (INT/BIGINT, NUMERIC và FLOAT cho tiền, VARCHAR/TEXT, DATE/TIMESTAMP/TIMESTAMPTZ, BOOLEAN, JSONB); IDENTITY; ràng buộc PRIMARY KEY, FOREIGN KEY (ON DELETE CASCADE/SET NULL/RESTRICT), UNIQUE, NOT NULL, CHECK, DEFAULT; ALTER TABLE, DROP TABLE; đọc schema DSC Shop
3SELECT, WHERE và NULLSELECT, cột tính toán, bí danh AS, DISTINCT; WHERE với =, <>, >, <, AND/OR/NOT, IN, BETWEEN, LIKE/ILIKE; IS NULL/IS NOT NULL, logic ba trị, vì sao = NULL sai; thứ tự thực thi FROM → WHERE → SELECT
4Sắp xếp và giới hạn kết quảORDER BY nhiều cột, ASC/DESC, NULLS FIRST/LAST; LIMIT/OFFSET, FETCH FIRST; phân trang và vấn đề OFFSET lớn
5Toán tử, hàm chuỗi, ngày giờ và xử lý NULLSố học (chia nguyên, %), nối chuỗi ||; UPPER, LOWER, TRIM, LENGTH, SUBSTRING, REPLACE, CONCAT; CURRENT_DATE, now(), EXTRACT, DATE_TRUNC, AGE, INTERVAL; CAST/::, ROUND; COALESCE, NULLIF; làm sạch customers.city
6Thêm, sửa, xóa dữ liệuINSERT (nhiều dòng, RETURNING, INSERT ... SELECT), UPDATE (có điều kiện, UPDATE ... FROM), DELETE, UPSERT ON CONFLICT, TRUNCATE; quy trình an toàn: SELECT xem trước, chạy trong BEGIN ... ROLLBACK/COMMIT; lỗi vi phạm ràng buộc
7Ôn tập 1Bài tập tổng hợp Ngày 1-6

Chặng 2: Tổng hợp và kết hợp dữ liệu (Ngày 8-14) ​

NgàyBàiNội dung chính
8Hàm tổng hợpCOUNT, SUM, AVG, MIN, MAX; COUNT(*), COUNT(cột) và COUNT(DISTINCT ...); NULL trong hàm tổng hợp; tính tổng tiền đơn từ order_items
9GROUP BY và HAVINGNhóm theo một và nhiều cột, HAVING khác WHERE, thứ tự thực thi logic đầy đủ; ROLLUP nhắc qua
10JOININNER/LEFT/RIGHT/FULL/CROSS JOIN, SELF JOIN (employees), JOIN 3-4 bảng, alias bảng, điều kiện ở ON và ở WHERE với LEFT JOIN, anti-join, nhân dòng khi JOIN rồi SUM
11Truy vấn con và CTESubquery vô hướng, IN, EXISTS/NOT EXISTS, bẫy NOT IN với NULL, subquery tương quan, subquery trong FROM, CTE WITH (không đệ quy)
12Toán tử tập hợpUNION, UNION ALL, INTERSECT, EXCEPT (và bản ALL), quy tắc số cột và kiểu, ORDER BY ở cuối
13CASE và tổng hợp có điều kiệnCASE simple/searched, CASE trong SELECT/ORDER BY/UPDATE, SUM(CASE ...), FILTER (WHERE ...), pivot đơn giản
14Ôn tập 2Bài tập tổng hợp Ngày 8-13 (chưa dùng window function)

Chặng 3: Index, transaction và các đối tượng database (Ngày 15-21) ​

NgàyBàiNội dung chính
15Chỉ mục (index)B-tree, đo trước/sau trên schema perf, index nhiều cột và quy tắc tiền tố trái, UNIQUE index, partial index, expression index, selectivity, chi phí ghi, index cho khóa ngoại
16Transaction và ACIDACID, BEGIN/COMMIT/ROLLBACK, SAVEPOINT, autocommit; isolation level và các hiện tượng (dirty/non-repeatable/phantom read, lost update) có demo hai phiên psql; SELECT ... FOR UPDATE; deadlock; chuyển tiền an toàn
17Function và procedureFunction và procedure bằng SQL và PL/pgSQL, tham số, RETURNS TABLE, CALL, xử lý lỗi (RAISE, EXCEPTION), transaction trong procedure
18TriggerTrigger PL/pgSQL: BEFORE/AFTER, ROW/STATEMENT, NEW/OLD; trừ tồn kho, audit log, chặn dữ liệu sai; khi nào không nên dùng trigger
19ViewView, view cập nhật được và giới hạn, WITH CHECK OPTION, materialized view và REFRESH, dùng view để giới hạn những gì người khác được xem
20Đọc kế hoạch thực thiEXPLAIN, EXPLAIN ANALYZE, BUFFERS: cost, số dòng ước lượng và thực tế, Seq/Index/Index Only/Bitmap Scan, Nested Loop/Hash/Merge Join, Sort; ANALYZE và thống kê; số liệu đo thật trên perf
21Ôn tập 3Bài tập tổng hợp Ngày 15-20

Chặng 4: SQL trong thực tế (Ngày 22-30) ​

NgàyBàiNội dung chính
22JSON và JSONB->, ->>, @>, ?, jsonb_array_elements, jsonb_set, GIN index; khi nào dùng JSONB, khi nào tách bảng (products.attributes)
23Kết nối từ ứng dụngPython (psycopg 3) và Node.js (pg); truy vấn tham số hóa và vì sao chặn được SQL injection; connection pool; transaction từ code; xử lý lỗi; ORM và vấn đề N+1
24Import và export dữ liệuCOPY và \copy, CSV (header, delimiter, encoding), xử lý dòng lỗi qua bảng staging, xuất kết quả truy vấn; file mẫu trong setup/data
25SQL và dữ liệu lớnPartition RANGE/LIST/HASH, partition pruning; replication, sharding, kho dữ liệu dạng cột ở mức tổng quan
26SQL và NoSQLSo sánh mô hình dữ liệu, khi nào chọn gì (bài đọc)
27Thiết kế cơ sở dữ liệuERD, quan hệ 1-1/1-n/n-n và bảng trung gian, phụ thuộc hàm, chuẩn hóa 1NF/2NF/3NF/BCNF, khi nào phi chuẩn hóa; vì sao DSC Shop được thiết kế như vậy
28Tối ưu truy vấnSargability, viết lại truy vấn, EXISTS/IN/JOIN, phân trang keyset, tránh SELECT *, N+1, đo bằng EXPLAIN ANALYZE trên perf
29Window function và truy vấn đệ quyROW_NUMBER/RANK/DENSE_RANK/NTILE, SUM/AVG OVER, PARTITION BY, frame ROWS/RANGE, LAG/LEAD, top-N mỗi nhóm; CTE đệ quy trên cây categories và employees, chống vòng lặp
30Bảo mật và sao lưuRole/user, GRANT/REVOKE, quyền tối thiểu, row-level security nhắc qua, demo SQL injection trong code, lưu mật khẩu bằng hash, sao lưu pg_dump/pg_restore
🎯Tổng kết và dự án cuối khóaĐề dự án có rubric: ERD, schema 3NF có ràng buộc, seed, 15-20 truy vấn báo cáo, transaction, view, function/trigger, EXPLAIN trước/sau index, API nhỏ dùng truy vấn tham số hóa, backup; lộ trình học tiếp

Các chủ đề xuyên suốt ​

Vài chủ đề không nằm gọn trong một ngày mà được học dần:

Chủ đềHọc ở
NULLNgày 2 (NOT NULL), Ngày 3 (IS NULL, logic ba trị), Ngày 5 (COALESCE, NULLIF), Ngày 8 (NULL trong hàm tổng hợp), Ngày 10 (LEFT JOIN sinh NULL), Ngày 11 (bẫy NOT IN)
Thứ tự thực thi logic của câu SELECTNgày 3 (FROM → WHERE → SELECT), Ngày 4 (ORDER BY, LIMIT), Ngày 9 (đầy đủ với GROUP BY, HAVING)
Hiệu năngNgày 15 (index) → Ngày 20 (đọc plan) → Ngày 28 (tối ưu), cùng đo trên schema perf
Ràng buộc và thiết kếNgày 2 (ràng buộc) → Ngày 18 (trigger) → Ngày 27 (chuẩn hóa) → dự án cuối khóa
An toàn dữ liệuNgày 6 (BEGIN ... ROLLBACK) → Ngày 16 (transaction) → Ngày 23 (truy vấn tham số hóa) → Ngày 30 (quyền, injection, backup)

Tóm tắt ​

  • 30 bài, 4 chặng, 3 bài ôn tập (Ngày 7, 14, 21) và một dự án cuối khóa.
  • Chỉ dùng PostgreSQL 16 và bộ dữ liệu DSC Shop; khác biệt với MySQL/SQL Server được ghi trong hộp "Ghi chú dialect".
  • Dựng môi trường trước Ngày 1 theo setup/README.md; Docker là cách nhanh nhất.
  • Mỗi bài: chạy lại ví dụ, tự làm bài tập rồi mới xem đáp án.

Đọc thêm ​


📚 Mục lục | Ngày 1: Giới thiệu SQL, RDBMS và môi trường thực hành ➡️

Phát hành theo giấy phép MIT.