Nội dung
Danh sách bài học
- 01~16 phút
SELECT — projection + alias, vì sao SELECT * chậm gấp 17 lần
Projection ở executor layer + network/serialization overhead. Cú pháp column list, expression, alias. Vì sao Prisma select() và Spring @Query đều chọn explicit column.
- 02~22 phút
WHERE + NULL three-valued logic — vì sao age != 30 không trả NULL row
TRUE/FALSE/UNKNOWN. 5 NULL pitfall thực chiến: COUNT, IN/NOT IN, JOIN, string concat, ORM. Codd 1979 paper context.
- 03~18 phút
ORDER BY + pagination — vì sao OFFSET 100k chậm 200 lần
OFFSET cost tỷ lệ skip rows. Keyset pagination O(1). NULL ordering. Stable sort cần tiebreaker. Pattern infinite scroll dashboard.
- 04~14 phút
DISTINCT vs GROUP BY — cùng plan, khác intent
PG planner biến DISTINCT thành Group/HashAggregate. Khi nào dùng cái nào theo intent. DISTINCT ON PG-specific cho 'top N per group' không cần window.
- 05~16 phút
Pattern matching — vì sao LIKE '%x' kill index
4 cấp pattern matching: LIKE, ILIKE, regex, FTS. B-tree prefix scan vs leading wildcard. pg_trgm cho fuzzy. Decision tree theo use case.
- 06~14 phút
CASE + COALESCE + NULLIF — switch/fallback/safe-divide trong SQL
Conditional expression không có IF. CASE cho switch, COALESCE cho fallback, NULLIF tránh divide-by-zero. Pattern bucketize, status icon, defensive arithmetic.
- 07~25 phút
Mini-challenge: dashboard query TaskFlow — diagnose 3 bug từ M02 concepts
PM yêu cầu dashboard 'tasks active của user X tuần này, due ≤ 3 ngày, paginate 20'. Naive query có 3 bug từ M02.1-M02.6. Fix sang keyset + NULL handling + JOIN tease.