← Quay lại Trang Chủ Blog
SQL trong Trình duyệt

SQL trong Trình duyệt — SQLite-WASM Chuyên Sâu — Lộ Trình Chi Tiết

4 tháng 7, 2026 · Lộ trình 17 bài học

SQL thật, chạy thẳng trong trình duyệt — không server, không cài đặt

Hầu hết tài liệu SQL dạy bạn cú pháp rồi dừng lại ở đó — chép SELECT/JOIN mẫu mà không bao giờ chạm tới câu hỏi engine thực sự nghĩ gì khi thực thi 1 câu query, tại sao 1 index làm query nhanh gấp 100 lần, hay điều gì thực sự xảy ra khi 2 transaction tranh chấp cùng 1 dòng dữ liệu. Series này biên soạn ở độ sâu học thuật của 1 cuốn sách chuyên ngành: mỗi tính năng được minh hoạ qua nhiều tình huống thực tế khác nhau (doanh thu, log, tồn kho, phân quyền...), không dừng ở ví dụ trừu tượng.

Engine chạy là SQLite biên dịch sang WebAssembly (sql.js) — SQL thật, không mô phỏng, chạy 100% phía client. Ở những chỗ browser về bản chất không demo nổi (transaction đa kết nối, WAL reader/writer đồng thời, disk I/O thật), series có thêm lab thực hành trên Docker PostgreSQL để bạn tự tay quan sát bằng 2 terminal.

🗄️

Về Series này

Mỗi bài có 1 SQL workbench thật chạy ngay trên trình duyệt của bạn: gõ query, bấm chạy, xem kết quả và thời gian thực thi tức thì — không cần cài SQLite, không cần backend. 4 bài đánh dấu 🐳 có thêm lab Docker PostgreSQL cho những khái niệm cần môi trường đa tiến trình thật.

3 Dịch chuyển Tư duy quan trọng (Mindset Shifts)

Để dùng SQL như một kỹ sư dữ liệu thay vì chỉ chép cú pháp, bạn cần chuyển đổi tư duy qua 3 điểm mấu chốt:

🔬 Bước 1: Từ "câu lệnh" sang "khai báo ý định, để engine tự tối ưu"
SQL là ngôn ngữ khai báo (declarative) — bạn mô tả kết quả mong muốn, không mô tả các bước thực hiện như vòng lặp trong lập trình mệnh lệnh. Cùng 1 câu SELECT có thể được engine thực thi theo hàng chục cách khác nhau (full scan, index seek, nested loop join, hash join...) — EXPLAIN QUERY PLAN chính là cửa sổ nhìn vào quyết định đó. Hiểu đây là 1 bài toán tối ưu, không phải 1 kịch bản tuần tự, là chìa khoá cho mọi bài học phía sau.
ℹ️ Bước 2: Từ "dữ liệu đúng" sang "dữ liệu đúng NGAY CẢ KHI có lỗi/tranh chấp"
Một query trả kết quả đúng khi chạy đơn lẻ không có nghĩa hệ thống đúng khi 1000 người dùng ghi đồng thời. Transaction, isolation level, và ràng buộc toàn vẹn (constraint) tồn tại để đảm bảo tính đúng đắn dưới tải thực tế và lỗi bất ngờ — mất điện giữa transaction, 2 request cùng trừ tồn kho 1 sản phẩm, ứng dụng crash giữa chừng. Đây là lý do series dành hẳn lab Docker cho ACID.
💡 Bước 3: Từ "SQLite là DB nhỏ cho demo" sang "SQLite là engine sản xuất thật"
SQLite không phải "phiên bản rút gọn" của PostgreSQL/MySQL để học cho vui — nó là database được triển khai nhiều nhất thế giới (mọi điện thoại, trình duyệt, hệ điều hành đều nhúng ít nhất 1 bản). Việc chạy nó qua WebAssembly ngay trong bài viết này là chạy chính engine đó, không phải bản mô phỏng — mọi thứ bạn học về B-Tree, WAL, hay query optimizer đều là cơ chế thật của phần mềm đang chạy trên hàng tỷ thiết bị.

Bảng thuật ngữ nền tảng (Glossary)

Để dễ dàng theo dõi loạt bài viết, bạn cần ghi nhớ các định nghĩa kỹ thuật sau:

Thuật ngữ (EN) Dịch nghĩa (VI) Định nghĩa ngắn gọn
Query Plan Kế hoạch thực thi Chuỗi bước cụ thể engine chọn để chạy 1 câu query (scan, seek, join order...).
B-Tree Index Chỉ mục cây B Cấu trúc dữ liệu sắp xếp sẵn giúp tra cứu O(log n) thay vì quét toàn bảng O(n).
Transaction Giao dịch Nhóm thao tác được đảm bảo tất-cả-hoặc-không-gì (atomicity) theo tính chất ACID.
Isolation Level Mức cô lập Mức độ 1 transaction "nhìn thấy" thay đổi từ transaction khác đang chạy song song.
WAL Write-Ahead Log Ghi thay đổi vào log trước khi cập nhật file chính — cho phép đọc/ghi đồng thời an toàn.
CTE Common Table Expression Bảng tạm đặt tên trong 1 câu query (WITH ... AS), hỗ trợ cả dạng đệ quy.

Lộ trình 17 bài học SQL chuyên sâu

Dưới đây là chi tiết lộ trình 17 bài viết thực chiến, từ mô hình quan hệ cơ bản tới nội tại engine, tìm kiếm toàn văn, và dự án Analytics Dashboard hoàn chỉnh. Bài đánh dấu 🐳 DOCKER có thêm lab thực hành trên PostgreSQL thật.

01

Bài 1: Mô Hình Quan Hệ & SELECT

Bảng/hàng/cột, hệ kiểu động của SQLite (type affinity), WHERE & toán tử, ORDER BY/LIMIT/OFFSET. Chạy query đầu tiên trên dataset kinh doanh thật ngay trong trình duyệt.

02

Bài 2: Môi Trường Thực Hành Kép — Browser & Docker🐳 DOCKER

Setup Docker PostgreSQL + psql, sqlite3 CLI, và bản đồ khác biệt dialect SQLite↔PostgreSQL. Chuẩn bị lab tại nhà dùng xuyên suốt các bài 🐳 phía sau.

03

Bài 3: JOIN Toàn Tập

INNER/LEFT/RIGHT/FULL/CROSS JOIN, khoá ngoại, self-join, và cái bẫy tích Descartes. Visualizer Venn minh hoạ từng loại JOIN trên dữ liệu đơn hàng/khách hàng thật.

04

Bài 4: Aggregate & GROUP BY

COUNT/SUM/AVG/MIN/MAX, GROUP BY nhiều cột, HAVING vs WHERE. Bảng tổng hợp doanh thu theo nhóm khách hàng + phát hiện dữ liệu bất thường.

05

Bài 5: Subquery & CTE

Subquery vô hướng/tương quan, IN/EXISTS, WITH (CTE), và CTE đệ quy duyệt cây danh mục sản phẩm lồng nhau nhiều cấp.

06

Bài 6: Graph Queries Bằng CTE Đệ Quy

Mô hình đồ thị bằng bảng cạnh (edge list), transitive closure, đường đi ngắn nhất, phát hiện chu trình. Demo mạng chuyến bay: tìm đường bay rẻ nhất bằng đúng 1 câu SQL.

07

Bài 7: Window Functions

OVER(PARTITION BY), ROW_NUMBER/RANK/DENSE_RANK, LAG/LEAD. Bảng xếp hạng nhân viên bán hàng & running total doanh thu trực quan.

08

Bài 8: Index & Query Plan

B-Tree index hoạt động thế nào, EXPLAIN QUERY PLAN, full scan vs index seek, composite & covering index. So sánh trực tiếp thời gian query trước/sau khi tạo index.

09

Bài 9: Query Optimizer Sâu🐳 DOCKER

ANALYZE & statistics, thứ tự join, partial/expression index, đọc bytecode VDBE qua EXPLAIN đầy đủ. Lab Docker: so sánh EXPLAIN ANALYZE của PostgreSQL.

10

Bài 10: SQLite Internals — B-Tree & File Format

Header 100 byte, cấu trúc page, record format & varint, overflow page, freelist. Page viewer đọc hex thật của file .sqlite ngay trong trình duyệt.

11

Bài 11: Transaction & ACID🐳 DOCKER

BEGIN/COMMIT/ROLLBACK, isolation level, ràng buộc toàn vẹn. Lab Docker: 2 terminal psql tự tay gây lock contention, non-repeatable read, so isolation level thật.

12

Bài 12: Trigger, View & Virtual Table

Trigger BEFORE/AFTER ghi audit log tự động, view như lớp trừu tượng, cơ chế virtual table đằng sau FTS3/FTS5. Đăng ký hàm SQL tuỳ biến bằng JavaScript.

13

Bài 13: JSON & Generated Columns

Hàm JSON (json_extract, ->/->>), json_each/json_tree, generated columns, index trên expression cho kho dữ liệu bán cấu trúc.

14

Bài 14: FTS5 Full-Text Search

Inverted index hoạt động thế nào, tokenizer, xếp hạng BM25, highlight()/snippet(). Xây search engine mini tìm kiếm tức thì trên hàng nghìn bài viết.

15

Bài 15: Performance Engineering🐳 DOCKER

Prepared statement, batch insert trong 1 transaction, PRAGMA tuning. Sân chơi benchmark và lab Docker: đo lường disk I/O & fsync thật — thứ browser không đo được.

16

Bài 16: WAL & Persistence Trong Browser🐳 DOCKER

WAL mode, OPFS + Worker, so sánh các chiến lược lưu trữ (sql.js vs wa-sqlite vs official WASM) và cấu hình CORS (COOP/COEP). Lab Docker: reader/writer đồng thời trên WAL thật.

17

Bài 17: Dự Án — Mini Analytics Dashboard

Ghép query + render biểu đồ SVG động. Tự động lưu trữ database vào IndexedDB, xuất nhập file .sqlite. Dự án thực chiến tổng kết toàn bộ lộ trình.