Wavi Books · Data Engineering & Phân tích dữ liệu
Học SQL cho người mới: lộ trình từ SELECT đến phân tích dữ liệu
Nguyễn Minh Trí · Biên tập chuyên môn Wavi Books

Lộ trình học SQL cho người mới bắt đầu từ SELECT, JOIN, GROUP BY đến window function và bài tập phân tích dữ liệu thực tế.
## Học SQL cho người mới: lộ trình từ SELECT đến phân tích dữ liệu
SQL là ngôn ngữ truy vấn dữ liệu quan hệ và là kỹ năng cốt lõi của Data Analyst, Data Engineer lẫn Backend Developer. Người mới nên học cách đặt câu hỏi với dữ liệu trước khi ghi nhớ cú pháp.
Một lộ trình tốt đi từ lọc và sắp xếp, sang tổng hợp, kết nối bảng, subquery, CTE rồi window function. Mỗi chủ đề cần bài tập có kết quả kiểm chứng được.
## Những khái niệm cốt lõi cần nắm
- SELECT và WHERE chọn dữ liệu cần thiết.
- JOIN kết nối các thực thể.
- GROUP BY tổng hợp theo chiều phân tích.
- Window function tính toán mà không làm mất chi tiết.
## Lộ trình thực hành từng bước
- Bước 1: Luyện trên schema nhỏ như bán hàng và khách hàng.
- Bước 2: Giải cùng một câu hỏi bằng nhiều cách.
- Bước 3: Đọc execution plan và học tối ưu sau khi đã viết đúng.
## Những sai lầm thường gặp
- Dùng SELECT * trong truy vấn sản xuất.
- JOIN khi chưa hiểu khóa và quan hệ.
- Không xử lý NULL rõ ràng.
## Góc nhìn dành cho người học và developer Việt Nam
Ứng viên dữ liệu tại Hà Nội và TP.HCM nên có dự án SQL mô tả câu hỏi kinh doanh, cách kiểm tra số liệu và kết luận, không chỉ đăng danh sách câu lệnh.
## Nên học tiếp như thế nào?
Sau khi nắm phần cốt lõi, bạn nên tự xây một dự án nhỏ, ghi lại giả định, tiêu chí đánh giá và giới hạn của giải pháp. Các sách liên quan được Wavi Books gợi ý trong bài giúp bạn đào sâu kiến thức theo lộ trình có hệ thống thay vì chỉ ghép các hướng dẫn rời rạc.
## Tư duy theo tập hợp thay vì xử lý từng dòng
SQL mô tả kết quả cần lấy, còn optimizer quyết định kế hoạch thực thi. Người mới thường nghĩ như vòng lặp: lấy từng đơn hàng rồi tìm khách hàng. Tư duy theo tập hợp yêu cầu xác định grain của dữ liệu, quan hệ giữa bảng và phép biến đổi toàn bộ tập.
Trước mỗi truy vấn, hãy viết một câu: “Mỗi hàng kết quả đại diện cho điều gì?”. Nếu không trả lời được, bạn rất dễ đếm trùng sau JOIN hoặc dùng GROUP BY sai cấp độ.
## Thứ tự logic của một truy vấn SELECT
SQL được viết theo SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY nhưng tư duy logic gần với FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT. Vì alias ở SELECT thường chưa tồn tại tại WHERE. Hiểu thứ tự giúp debug thay vì thử cú pháp ngẫu nhiên.
## JOIN và bài toán đếm trùng
Nếu bảng customers có một hàng mỗi khách và orders có nhiều hàng mỗi khách, JOIN làm lặp thông tin khách theo số đơn. Điều này đúng về quan hệ nhưng có thể làm sai COUNT. Hãy kiểm tra khóa, cardinality một-một/một-nhiều/nhiều-nhiều và số hàng trước/sau JOIN.
```sql WITH monthly_revenue AS ( SELECT DATE_TRUNC('month', created_at) AS month, customer_id, SUM(total_amount) AS revenue FROM orders WHERE status = 'completed' GROUP BY 1, 2 ) SELECT month, SUM(revenue) AS total_revenue, COUNT(DISTINCT customer_id) AS active_customers, SUM(revenue) / NULLIF(COUNT(DISTINCT customer_id), 0) AS revenue_per_customer FROM monthly_revenue GROUP BY month ORDER BY month; ```
CTE đầu tiên cố định grain ở tháng-khách hàng; truy vấn ngoài tổng hợp lên tháng. Cách chia tầng làm rõ ý nghĩa từng metric và giảm lỗi khi thêm cột.
## Window function: giữ chi tiết nhưng vẫn tính theo nhóm
GROUP BY gộp nhiều hàng thành một, còn window function giữ từng hàng và tính trong cửa sổ. Đây là công cụ cho xếp hạng, running total, so sánh kỳ trước và chọn bản ghi mới nhất.
```sql SELECT customer_id, created_at, total_amount, SUM(total_amount) OVER ( PARTITION BY customer_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS lifetime_value FROM orders; ```
## NULL và logic ba giá trị
NULL không bằng 0 hay chuỗi rỗng; so sánh `= NULL` không trả true. Dùng IS NULL, IS NOT NULL và COALESCE có chủ đích. Khi tính tỷ lệ, NULL đôi khi đúng hơn 0 vì thể hiện không đủ dữ liệu. Việc thay toàn bộ NULL bằng 0 có thể làm sai trung bình và báo cáo.
## Tối ưu sau khi truy vấn đã đúng
Bắt đầu bằng EXPLAIN/EXPLAIN ANALYZE. Kiểm tra full scan, join strategy, số hàng ước tính và thực tế. Index hữu ích khi cột lọc/chuyển nối có tính chọn lọc, nhưng index cũng tốn dung lượng và làm chậm ghi. Không tạo index cho mọi cột.
Các nguyên tắc thực dụng gồm chỉ chọn cột cần, lọc sớm, tránh hàm trên cột index khi có thể, giới hạn dữ liệu thời gian và pre-aggregate ở grain hợp lý. Với warehouse dạng cột, partitioning và clustering có thể quan trọng hơn index truyền thống.
## Bộ bài tập từ cơ bản đến phỏng vấn
- Tính doanh thu theo tháng và tỷ lệ tăng trưởng so với tháng trước.
- Tìm khách mua lần đầu, lần gần nhất và số ngày quay lại.
- Xây cohort retention theo tháng đăng ký.
- Phát hiện đơn trùng và giải thích tiêu chí giữ bản ghi.
- Viết funnel xem sản phẩm → thêm giỏ → đặt hàng.
- So sánh hai cách truy vấn bằng execution plan.
## Cách trình bày dự án SQL
Repository nên có schema, dữ liệu mẫu, câu hỏi nghiệp vụ, truy vấn, test kiểm tra và phần giải thích kết quả. Nhà tuyển dụng quan tâm khả năng làm dữ liệu đáng tin hơn là số lượng câu lệnh bạn thuộc.
Câu hỏi thường gặp
Học SQL cho người mới: lộ trình từ SELECT đến phân tích dữ liệu có phù hợp với người mới không?
Có, nếu bắt đầu từ khái niệm nền tảng và một bài tập nhỏ. Người mới nên ưu tiên hiểu luồng dữ liệu, mục tiêu và cách kiểm tra kết quả trước khi học công cụ nâng cao.
Mất bao lâu để áp dụng học sql cho người mới: lộ trình từ select đến phân tích dữ liệu vào dự án?
Thời gian phụ thuộc nền tảng và phạm vi. Một bản thử nghiệm nhỏ có thể hoàn thành trong vài ngày, nhưng để vận hành ổn định cần thêm kiểm thử, bảo mật, theo dõi và tài liệu.
Nên học lý thuyết hay làm dự án trước?
Nên học vừa đủ lý thuyết để hiểu quyết định, sau đó làm dự án và quay lại đào sâu phần gây lỗi. Cách học lặp này hiệu quả hơn việc chỉ đọc hoặc chỉ sao chép mã.