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
Cùng plan, khác intent: DISTINCT để dedupe, GROUP BY để aggregate. DISTINCT ON (PostgreSQL) giải 'top N per group' gọn; window function là alternative portable.
- 05~15 phút
Pattern matching — vì sao LIKE '%x' không dùng được index
LIKE với % và _, case-insensitive bằng LOWER(), regex, full-text. Nguyên lý: leading wildcard vô hiệu hoá index có thứ tự — agnostic giữa các RDBMS.
- 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 — diagnose 3 bug M02
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.