Mở đầu — vì sao bài này quan trọng
Nếu bạn đã làm Finance hay Kế toán vài năm, có một sự thật mà ít người nói cho bạn nghe: bạn đã biết SQL từ lâu rồi, chỉ là bạn chưa gọi nó bằng cái tên đó. Mỗi lần bạn lọc một bảng dữ liệu công nợ trong Excel, bạn đang viết một câu WHERE. Mỗi lần bạn dựng một PivotTable để xem doanh thu theo từng chi nhánh, bạn đang viết GROUP BY. Mỗi lần bạn dùng VLOOKUP để kéo tên khách hàng từ sheet danh mục sang sheet hóa đơn, bạn đang viết một câu JOIN. Tư duy đã có sẵn — chỉ là cú pháp khác đi.
Đây chính là lợi thế khổng lồ của người từ Finance chuyển sang BA. Phần lớn người mới học SQL phải vật lộn với khái niệm "dữ liệu dạng bảng", "quan hệ giữa các bảng", "tổng hợp theo nhóm". Bạn thì không. Bạn đã sống trong thế giới dữ liệu dạng bảng suốt sự nghiệp của mình. Việc của bài này không phải dạy bạn một thứ hoàn toàn mới, mà là bắc một cây cầu từ thứ bạn đã thành thạo (Excel) sang thứ mà mọi BA cần (SQL).
Tại sao một BA cần SQL? Vì trong 90% dự án thực tế, khi bạn muốn hiểu nghiệp vụ thật sự đang chạy thế nào, bạn không thể chỉ ngồi nghe stakeholder kể. Bạn phải tự mở database lên, đếm xem có bao nhiêu đơn hàng bị treo trạng thái, tự tay kiểm tra dữ liệu có khớp với quy trình hay không. Một BA biết SQL là một BA không phải đi xin developer "anh ơi chạy giúp em query này" mỗi lần cần con số. Đó là sự độc lập, và nó khiến bạn đáng giá hơn rất nhiều trên thị trường.
Khái niệm cốt lõi
Bảng ánh xạ Excel → SQL
Hãy bắt đầu bằng tấm bản đồ dịch thuật giữa hai thế giới. In tấm bảng này ra, dán lên màn hình, và mỗi lần bí, hãy nhìn nó:
| Excel | SQL | Ý nghĩa |
|---|---|---|
| Workbook (file) | Database | Toàn bộ kho dữ liệu |
| Sheet | Table (bảng) | Một tập dữ liệu cùng chủ đề |
| Cột (Column A, B...) | Field / Column | Một thuộc tính của dữ liệu |
| Dòng | Row / Record | Một bản ghi cụ thể |
| Ô tiêu đề cột | Tên field | Định danh của cột |
| Filter (Auto Filter) | WHERE | Lọc dòng theo điều kiện |
| Sort A→Z | ORDER BY | Sắp xếp kết quả |
| PivotTable (Rows) | GROUP BY | Gom nhóm để tổng hợp |
| SUM / COUNT / AVERAGE trong Pivot | SUM(), COUNT(), AVG() | Hàm tổng hợp |
| VLOOKUP / INDEX-MATCH | JOIN | Nối hai bảng theo khóa chung |
| Lấy 100 dòng đầu | LIMIT 100 | Giới hạn số dòng trả về |
| Remove Duplicates | DISTINCT | Loại bản ghi trùng |
| IF lồng nhau | CASE WHEN | Logic điều kiện |
Giải phẫu một câu SELECT
Câu lệnh SQL phổ biến nhất, chiếm 95% công việc của một BA, là SELECT. Cấu trúc của nó luôn theo một thứ tự cố định:
SELECT cot_can_lay -- Bạn muốn xem cột nào? (giống chọn cột hiển thị)
FROM ten_bang -- Lấy từ sheet/bảng nào?
WHERE dieu_kien_loc -- Lọc dòng theo điều kiện gì? (giống Filter)
GROUP BY cot_gom_nhom -- Gom nhóm theo cột nào? (giống Pivot Rows)
HAVING dieu_kien_sau_gom -- Lọc tiếp sau khi đã gom nhóm
ORDER BY cot_sap_xep -- Sắp xếp theo cột nào? (giống Sort)
LIMIT so_dong; -- Lấy bao nhiêu dòng?
Một mẹo tư duy quan trọng: máy tính đọc câu SQL không theo thứ tự bạn viết. Bạn viết SELECT trước, nhưng máy thực thi FROM trước (mở bảng ra), rồi WHERE (lọc dòng), rồi GROUP BY (gom nhóm), rồi mới đến SELECT (chọn cột hiển thị), cuối cùng là ORDER BY (sắp xếp). Hiểu thứ tự thực thi này giúp bạn debug query khi nó ra kết quả sai.
Sự khác biệt tư duy then chốt
Trong Excel, bạn thao tác trên dữ liệu nhìn thấy được — bạn cuộn chuột, bạn thấy từng ô. Trong SQL, bạn làm việc với tập hợp (set). Bạn không nói "lấy ô C5", bạn nói "lấy tất cả những dòng thỏa điều kiện X". Đây là bước nhảy tư duy quan trọng nhất, và may mắn là PivotTable đã rèn cho bạn tư duy này rồi: khi bạn dựng Pivot, bạn cũng không quan tâm từng dòng, bạn quan tâm tổng theo nhóm.
Tình huống thực tế
Tình huống 1: Chị Hương và báo cáo công nợ tại một công ty phân phối
Chị Hương làm kế toán công nợ 6 năm tại một công ty phân phối hàng tiêu dùng ở TP.HCM, có khoảng 1.200 khách hàng đại lý. Mỗi cuối tháng, chị xuất file Excel 40.000 dòng hóa đơn, dùng AutoFilter lọc ra những hóa đơn quá hạn trên 30 ngày, rồi dựng PivotTable tính tổng công nợ quá hạn theo từng đại lý. Quy trình này tốn của chị khoảng 2 tiếng mỗi lần, và file Excel nặng đến mức máy hay treo.
Khi chuyển sang vị trí BA tại công ty, chị được giao phân tích "vì sao tỷ lệ nợ xấu tăng". Thay vì xuất Excel, chị học viết:
SELECT ten_dai_ly,
SUM(so_tien) AS tong_no_qua_han
FROM hoa_don
WHERE trang_thai = 'chua_thanh_toan'
AND ngay_den_han < CURRENT_DATE - INTERVAL '30 days'
GROUP BY ten_dai_ly
ORDER BY tong_no_qua_han DESC;
Diễn giải: Câu này làm đúng cái mà PivotTable của chị làm — nhưng chạy trong 2 giây thay vì 2 tiếng, và không treo máy. WHERE chính là cái Filter của chị. GROUP BY ten_dai_ly chính là việc kéo trường "Đại lý" vào Rows của Pivot. SUM(so_tien) chính là Values trong Pivot. ORDER BY ... DESC chính là Sort giảm dần để xem ai nợ nhiều nhất lên đầu.
Bài học rút ra: Chị Hương không học một kỹ năng mới — chị học một cách diễn đạt nhanh hơn cho thứ chị đã biết. Và quan trọng hơn, vì query chạy trực tiếp trên database sống, chị không còn phụ thuộc vào file xuất ra hôm qua đã cũ.
Tình huống 2: Anh Tâm tại một fintech cho vay tiêu dùng
Anh Tâm từng là chuyên viên phân tích tài chính, chuyển sang làm BA tại một công ty fintech cho vay tiêu dùng ở Hà Nội. Đội sản phẩm hỏi anh: "Trong tháng vừa rồi, có bao nhiêu khoản vay được giải ngân nhưng khách chưa từng trả góp kỳ nào?" Đây là câu hỏi cần nối hai bảng: bảng khoan_vay và bảng lich_su_tra_gop.
Trong Excel, anh sẽ dùng VLOOKUP hoặc COUNTIF chéo giữa hai sheet. Trong SQL, anh dùng JOIN:
SELECT kv.ma_khoan_vay,
kv.so_tien_giai_ngan
FROM khoan_vay kv
LEFT JOIN lich_su_tra_gop tg
ON kv.ma_khoan_vay = tg.ma_khoan_vay
WHERE kv.ngay_giai_ngan >= '2026-05-01'
AND tg.ma_khoan_vay IS NULL;
Diễn giải: LEFT JOIN nghĩa là "giữ tất cả khoản vay, kể cả những khoản không tìm thấy bản ghi trả góp tương ứng". Điều kiện tg.ma_khoan_vay IS NULL lọc ra đúng những khoản vay chưa có dòng trả góp nào — tức khách chưa trả kỳ nào. Đây là một mẫu (pattern) cực kỳ phổ biến gọi là "anti-join", dùng để tìm những bản ghi bên này mà không có ở bên kia. Trong Excel, mẫu này tương đương với việc VLOOKUP trả về #N/A.
Bài học rút ra: JOIN chính là VLOOKUP được nâng cấp. Khi đã hiểu VLOOKUP nối hai sheet qua một cột chung (ví dụ mã khách hàng), bạn hiểu JOIN. Khác biệt là JOIN mạnh hơn nhiều: nối được nhiều bảng, không giới hạn dòng, và không bị lỗi khi dữ liệu lớn. Câu hỏi của đội sản phẩm tưởng phức tạp, nhưng với SQL chỉ là 7 dòng — và con số trả về giúp họ phát hiện một lỗ hổng trong quy trình nhắc nợ.
Tình huống 3: Phân khúc khách hàng bằng CASE WHEN
Một BA tại một sàn thương mại điện tử cần phân nhóm khách theo tổng chi tiêu để đội marketing chạy chương trình. Trong Excel, đây là một rừng hàm IF lồng nhau. Trong SQL, đó là CASE WHEN:
SELECT ma_khach_hang,
SUM(gia_tri_don) AS tong_chi_tieu,
CASE
WHEN SUM(gia_tri_don) >= 50000000 THEN 'VIP'
WHEN SUM(gia_tri_don) >= 10000000 THEN 'Thân thiết'
ELSE 'Thường'
END AS phan_khuc
FROM don_hang
WHERE trang_thai = 'hoan_thanh'
GROUP BY ma_khach_hang;
Diễn giải: CASE WHEN đọc từ trên xuống, gặp điều kiện đúng đầu tiên thì dừng — y hệt cách IF lồng nhau hoạt động. Khách chi từ 50 triệu trở lên là VIP, từ 10 đến dưới 50 triệu là Thân thiết, còn lại là Thường.
Bài học rút ra: Logic phân loại nghiệp vụ mà bạn từng viết bằng IF trong Excel chuyển thẳng sang CASE WHEN. Đây cũng là cầu nối tự nhiên tới việc viết business rules — kỹ năng bạn sẽ dùng nhiều khi làm BA.
Hướng dẫn từng bước
Đây là lộ trình tự học SQL trong 2 tuần dành cho người đã giỏi Excel:
- Cài môi trường thực hành. Dùng [SQLite Online](https://sqliteonline.com) hoặc [DB Fiddle](https://db-fiddle.com) — chạy thẳng trên trình duyệt, không cần cài gì. Nếu muốn nghiêm túc, cài PostgreSQL kèm DBeaver (công cụ giao diện miễn phí, giống Excel của thế giới database).
- Tự tạo dữ liệu quen thuộc. Đừng học bằng bảng dữ liệu lạ. Lấy chính một file Excel công việc cũ của bạn — bảng hóa đơn, bảng công nợ — import vào, rồi tập query trên đó. Học trên dữ liệu mình hiểu nghiệp vụ thì nhanh gấp ba.
- Bắt đầu từ SELECT ... FROM ... WHERE. Tuần đầu chỉ làm chủ ba mệnh đề này. Hãy đặt mục tiêu: dịch mọi thao tác Filter bạn từng làm trong Excel thành câu
WHERE. Lọc đơn theo ngày, theo trạng thái, theo khoảng giá trị.
- Sang GROUP BY và hàm tổng hợp. Mỗi PivotTable bạn từng dựng, hãy viết lại bằng
GROUP BY. Đây là phần người Finance học nhanh nhất vì tư duy Pivot đã có.
- Học JOIN qua lăng kính VLOOKUP. Lấy hai sheet bạn từng VLOOKUP chéo nhau, viết lại bằng
INNER JOINrồiLEFT JOIN. Hiểu khác biệt giữa hai loại join này là bước ngoặt.
- Thêm CASE WHEN, DISTINCT, LIMIT. Những công cụ này hoàn thiện bộ kỹ năng cốt lõi.
- Thực chiến. Xin quyền truy cập read-only vào database staging của công ty (chỉ đọc, không sửa), rồi tự trả lời những câu hỏi nghiệp vụ thật bằng SQL. Đây là lúc kỹ năng đóng đinh.
Lỗi thường gặp & mẹo
Quên rằng GROUP BY đòi mọi cột không tổng hợp phải nằm trong nó. Lỗi kinh điển: bạn viết SELECT ten_dai_ly, ma_don, SUM(so_tien) ... GROUP BY ten_dai_ly. Database báo lỗi vì ma_don không nằm trong GROUP BY và cũng không được tổng hợp. Quy tắc: trong câu có GROUP BY, mỗi cột ở SELECT hoặc là cột gom nhóm, hoặc nằm trong hàm tổng hợp như SUM/COUNT.
Nhầm WHERE với HAVING. WHERE lọc trước khi gom nhóm (lọc từng dòng), HAVING lọc sau khi gom nhóm (lọc từng nhóm). Muốn lọc "đại lý có tổng nợ trên 100 triệu" thì phải dùng HAVING SUM(so_tien) > 100000000, không phải WHERE.
Dùng INNER JOIN khi cần LEFT JOIN và mất dữ liệu mà không biết. INNER JOIN chỉ giữ những dòng khớp ở cả hai bảng. Nếu bạn muốn "tất cả khách hàng, kể cả người chưa có đơn nào", phải dùng LEFT JOIN. Đây là nguồn gốc của vô số con số sai trong báo cáo. Mẹo: luôn tự hỏi "câu hỏi của mình có cần giữ cả những dòng không khớp không?"
Bẫy NULL. Trong SQL, NULL không bằng bất cứ thứ gì, kể cả chính nó. Viết WHERE cot = NULL luôn ra rỗng. Phải dùng WHERE cot IS NULL. Người Finance hay vấp vì trong Excel ô trống xử lý khác.
Mẹo vàng: Luôn chạy thử với LIMIT 10 trước khi chạy câu nặng trên bảng triệu dòng. Và khi query ra kết quả lạ, hãy bỏ dần từng mệnh đề (xóa GROUP BY, xóa JOIN) để khoanh vùng lỗi — giống cách bạn debug một công thức Excel dài bằng cách tách từng phần.
Bài tập thực hành
Giả sử bạn có hai bảng: don_hang (cột: ma_don, ma_khach, ngay_dat, gia_tri, trang_thai) và khach_hang (cột: ma_khach, ten, thanh_pho).
- Dịch Filter: Viết câu lấy tất cả đơn hàng có giá trị trên 5 triệu, đặt trong tháng 5/2026, trạng thái
hoan_thanh. - Dịch Pivot: Viết câu tính tổng giá trị đơn hoàn thành theo từng thành phố, sắp xếp giảm dần. (Gợi ý: cần JOIN hai bảng rồi GROUP BY.)
- Dịch VLOOKUP nâng cao: Tìm những khách hàng chưa từng đặt đơn nào (anti-join với LEFT JOIN + IS NULL).
- Dịch IF lồng nhau: Phân loại mỗi đơn thành 'Lớn' (≥10 triệu), 'Vừa' (3–10 triệu), 'Nhỏ' (dưới 3 triệu) bằng CASE WHEN.
- Thử thách: Viết câu trả lời "thành phố nào có giá trị đơn trung bình cao nhất, chỉ tính những thành phố có từ 20 đơn trở lên" (cần GROUP BY + HAVING + ORDER BY + LIMIT).
Tóm tắt
SQL không phải một ngôn ngữ lập trình đáng sợ — với người từ Finance, nó là Excel được viết ra bằng chữ thay vì bằng chuột. Filter là WHERE, Sort là ORDER BY, Pivot là GROUP BY cộng hàm tổng hợp, VLOOKUP là JOIN, IF lồng nhau là CASE WHEN. Mọi tư duy dữ liệu dạng bảng bạn rèn suốt nhiều năm đều chuyển thẳng sang được.
Điều khiến SQL đáng giá với một BA không phải vì nó "ngầu", mà vì nó cho bạn sự độc lập: tự tay kiểm chứng dữ liệu, tự trả lời câu hỏi nghiệp vụ, không phải chờ developer. Trong các bài sau, bạn sẽ thấy kỹ năng này nối thẳng vào việc viết business rules, dựng data model và phân tích yêu cầu. Hãy bắt đầu ngay hôm nay: mở một file Excel công việc cũ, import vào SQLite Online, và viết câu SELECT đầu tiên. Bạn sẽ ngạc nhiên vì mình đã biết nhiều đến thế nào.