Mở đầu — vì sao bài này quan trọng
Bốn bài đầu của khóa học, bạn đã viết SELECT, WHERE, JOIN, GROUP BY, subquery — nhưng có lẽ phần lớn bạn gõ trên một sandbox online nào đó, hoặc đọc rồi gật gù trong đầu. Đến lúc bạn phải có một môi trường SQL "của riêng mình" — cài trên máy, chạy được, có dữ liệu để nghịch, và quan trọng nhất: bạn kiểm soát hoàn toàn. Đây chính là ranh giới giữa một người "biết cú pháp SQL" và một BA thực sự dùng SQL trong công việc hằng ngày.
Tại sao điều này lại quan trọng đến vậy với một Business Analyst? Bởi vì công việc của BA không phải là chạy query trên hệ thống production của công ty. Bạn không được — và không nên — đụng vào cơ sở dữ liệu thật đang phục vụ khách hàng. Một câu SELECT * vô tình trên bảng giao dịch 200 triệu dòng vào giờ cao điểm có thể làm chậm cả hệ thống thanh toán. Thay vào đó, BA cần một sandbox — một sân chơi an toàn, độc lập — để luyện query, kiểm chứng yêu cầu nghiệp vụ (validate requirements), thử nghiệm logic báo cáo trước khi đưa cho đội Data Engineer hiện thực hóa.
Bài này sẽ không dạy bạn cú pháp mới. Thay vào đó, bạn sẽ học cách dựng được hai hệ quản trị cơ sở dữ liệu phổ biến nhất với BA tại Việt Nam — MySQL và PostgreSQL — hiểu khi nào dùng cái nào, và trang bị một bộ công cụ làm việc để từ giờ trở đi mọi bài sau bạn đều có chỗ thực hành thật. Hãy coi đây là buổi "dọn xưởng" trước khi bắt tay vào nghề.
Khái niệm cốt lõi
Database server, client và GUI tool — ba thứ khác nhau
Người mới rất hay nhầm ba khái niệm này thành một. Tách bạch chúng ra là việc đầu tiên bạn cần làm.
- Database server (máy chủ CSDL): là phần mềm thực sự lưu trữ và xử lý dữ liệu — chính là MySQL Server hay PostgreSQL Server. Nó chạy ngầm như một dịch vụ (service), lắng nghe ở một cổng (port): MySQL mặc định cổng 3306, PostgreSQL mặc định cổng 5432.
- Client: là chương trình kết nối tới server để gửi câu lệnh SQL và nhận kết quả. Có client dòng lệnh (
mysql,psql) và client đồ họa. - GUI tool: là công cụ giao diện đồ họa giúp bạn viết query, xem bảng, vẽ sơ đồ quan hệ mà không cần gõ lệnh thô — ví dụ DBeaver, MySQL Workbench, pgAdmin, TablePlus.
MySQL hay PostgreSQL — BA nên chọn cái nào?
Câu trả lời thật lòng: học cả hai, ưu tiên cái mà công ty bạn đang dùng. Nhưng để bạn hình dung sự khác biệt:
MySQL phổ biến cực mạnh trong các sản phẩm web, e-commerce, startup giai đoạn đầu. Phần lớn các sàn thương mại điện tử và ứng dụng PHP/WordPress tại Việt Nam có gốc rễ MySQL. Ưu điểm: nhẹ, nhanh với các tác vụ đọc đơn giản, tài liệu tiếng Việt nhiều, dễ tìm người hỗ trợ.
PostgreSQL (thường gọi tắt "Postgres") mạnh hơn về phân tích dữ liệu nâng cao. Nó hỗ trợ window function, CTE, kiểu dữ liệu JSON, mảng (array), và các hàm thống kê phong phú hơn — những thứ bạn sẽ dùng nhiều ở các bài sau (RFM, cohort, percentile...). Nhiều công ty data-driven, fintech, và các nền tảng dữ liệu hiện đại chọn Postgres làm chuẩn.
Một điểm thực tế quan trọng cho BA: cú pháp SQL giữa hai hệ không hoàn toàn giống nhau. Ví dụ nối chuỗi: MySQL dùng CONCAT(a, b), còn Postgres dùng cả CONCAT(a, b) lẫn toán tử a || b. Lấy giới hạn dòng: cả hai đều có LIMIT, nhưng Postgres thêm LIMIT ... OFFSET linh hoạt. Hàm ngày tháng khác nhau khá nhiều. Vì vậy khi viết yêu cầu báo cáo, bạn phải biết hệ đích là gì.
Schema mẫu — linh hồn của sandbox
Một sandbox rỗng thì vô dụng. Bạn cần dữ liệu mẫu để luyện. Hai bộ dữ liệu kinh điển nên cài:
- Sakila (cho MySQL) — mô phỏng một chuỗi cho thuê phim, có khách hàng, đơn thuê, thanh toán, diễn viên... rất giàu quan hệ bảng.
- Pagila (cho PostgreSQL) — bản chuyển thể của Sakila sang Postgres.
- DVD Rental — bộ dữ liệu Postgres phổ biến tương đương.
Tình huống thực tế
Tình huống 1 — BA mới ở một sàn TMĐT và bài học "đừng đụng production"
Lan vừa vào làm BA tại một sàn thương mại điện tử quy mô vừa ở TP.HCM, cơ sở dữ liệu chạy MySQL. Tuần đầu, để "tự tìm hiểu dữ liệu", Lan xin được cấp tài khoản truy cập và chạy thử SELECT * FROM orders trên cơ sở dữ liệu chính. Bảng orders có hơn 80 triệu dòng. Câu query kéo dài hơn 40 giây, làm chậm dashboard vận hành mà đội Operations đang theo dõi đơn hàng theo thời gian thực. Trưởng nhóm Data phải nhắc nhở.
Bài học: BA không bao giờ học việc trên production. Đúng quy trình là Lan nên có một bản sao dữ liệu (hoặc dữ liệu mẫu) trên máy cá nhân. Sau sự cố, đội Data dựng cho Lan một read-replica chỉ-đọc và khuyến khích cô cài MySQL local để thử nghiệm trước. Từ đó, mọi query nặng Lan đều chạy thử trên sandbox, ước lượng độ phức tạp, rồi mới đề xuất chạy trên môi trường phân tích chính thức. Một môi trường riêng đã cứu cô khỏi nhiều lần "đứng tim".
Tình huống 2 — Khác biệt cú pháp khiến report sai cả tuần
Minh, BA tại một công ty logistics, được giao viết đặc tả cho báo cáo "số ngày trung bình từ lúc đặt đến lúc giao". Minh test logic trên MySQL local của mình bằng hàm DATEDIFF(delivered_at, ordered_at) — chạy ngon. Nhưng hệ thống Data Warehouse của công ty lại là PostgreSQL, nơi DATEDIFF không tồn tại; phải dùng phép trừ trực tiếp delivered_at - ordered_at hoặc EXTRACT(DAY FROM ...). Đội Data Engineer hiện thực theo đặc tả của Minh thì query lỗi, mất gần một tuần qua lại làm rõ.
Bài học: cài đúng hệ mà công ty dùng, hoặc tối thiểu phải biết hệ đích là gì khi viết đặc tả. Sau lần đó Minh cài thêm PostgreSQL song song với MySQL trên cùng một con DBeaver, và luôn ghi chú rõ "hệ đích: PostgreSQL 14" ở đầu mỗi tài liệu yêu cầu báo cáo. Một dòng ghi chú nhỏ tiết kiệm hàng giờ tranh luận.
Tình huống 3 — Dùng Docker để cả team chung một môi trường
Một nhóm BA và Data Analyst tại một startup fintech ở Hà Nội liên tục gặp cảnh "máy tôi chạy được mà máy bạn lỗi". Người cài PostgreSQL 13, người 15; người trên macOS, người Windows. Encoding tiếng Việt mỗi máy một kiểu, dữ liệu mẫu mỗi người một bản. Trưởng nhóm quyết định chuẩn hóa bằng Docker: viết một file cấu hình duy nhất khai báo PostgreSQL 15 kèm dữ liệu mẫu, ai cũng chạy một lệnh là có môi trường y hệt nhau.
Bài học: với BA làm việc nhóm, Docker giúp loại bỏ hoàn toàn vấn đề "khác máy khác kết quả". Bạn không cần thành chuyên gia Docker — chỉ cần biết chạy một container database là đủ để có sandbox sạch trong vài phút, và xóa đi làm lại bất cứ lúc nào mà không sợ làm bẩn máy.
Hướng dẫn từng bước
Dưới đây là lộ trình dựng sandbox. Bạn có thể chọn Cách A (cài trực tiếp) nếu mới bắt đầu, hoặc Cách B (Docker) nếu muốn môi trường sạch, dễ làm lại.
Bước 1 — Chọn hệ và cách cài
Nếu chưa biết công ty dùng gì, hãy cài PostgreSQL trước (định hướng phân tích tốt hơn cho BA), rồi cài thêm MySQL sau cũng được.
Bước 2A — Cài trực tiếp (Cách A)
PostgreSQL:
- Windows/macOS: tải bộ cài từ trang chính thức (EnterpriseDB installer cho Windows; hoặc dùng
brew install postgresql@16trên macOS). - Trong lúc cài, nhớ mật khẩu cho user
postgres— đây là tài khoản quản trị mặc định. Ghi lại cẩn thận. - Cổng mặc định 5432, cứ để nguyên nếu không xung đột.
- Windows: tải MySQL Installer, chọn gói "Server + Workbench".
- macOS:
brew install mysqlrồibrew services start mysql. - Đặt mật khẩu cho user
root. Cổng mặc định 3306.
Bước 2B — Dùng Docker (Cách B)
Nếu đã có Docker Desktop, chỉ cần một lệnh cho mỗi hệ:
PostgreSQL
docker run --name ba-postgres -e POSTGRES_PASSWORD=secret -p 5432:5432 -d postgres:16MySQL
docker run --name ba-mysql -e MYSQL_ROOT_PASSWORD=secret -p 3306:3306 -d mysql:8
Sau lệnh này, server đã chạy ngầm. Muốn xóa sạch làm lại: docker rm -f ba-postgres rồi chạy lại lệnh trên. Đây chính là sự "sạch sẽ" mà nhóm fintech ở tình huống 3 tận dụng.
Bước 3 — Cài một GUI tool
Khuyến nghị mạnh DBeaver (miễn phí, kết nối được cả MySQL lẫn PostgreSQL trong cùng một cửa sổ). Lựa chọn khác: TablePlus (đẹp, nhẹ, bản miễn phí giới hạn), pgAdmin (chuyên Postgres), MySQL Workbench (chuyên MySQL).
Mở DBeaver → New Connection → chọn loại CSDL → nhập:
- Host:
localhost - Port:
5432(Postgres) hoặc3306(MySQL) - Username/Password: như đã đặt ở Bước 2
- Database:
postgres(Postgres) hoặc để trống/mysql(MySQL)
Bước 4 — Nạp dữ liệu mẫu
- Postgres: tải bộ Pagila hoặc DVD Rental, dùng menu Restore trong DBeaver/pgAdmin, hoặc chạy file
.sqlbằng cách mở SQL Editor và Execute Script. - MySQL: tải Sakila, chạy hai file
sakila-schema.sqlrồisakila-data.sql.
customer, film, payment... Chạy thử SELECT COUNT(*) FROM customer; — ra con số là bạn đã sẵn sàng.Bước 5 — Kiểm tra "sức khỏe" sandbox
Chạy một query có JOIN nhỏ (ví dụ nối customer với payment) để chắc chắn dữ liệu và quan hệ bảng đều ổn. Lưu lại file kết nối. Từ giờ, mọi bài tập trong khóa bạn đều có chỗ để thực hành thật.
Lỗi thường gặp & mẹo
Quên mật khẩu user quản trị (root/postgres). Đây là lỗi số một. Hãy lưu mật khẩu vào trình quản lý mật khẩu ngay khi cài. Với Docker thì khỏi lo — mật khẩu nằm trong lệnh run, xóa container chạy lại là xong.
"Connection refused" khi Test Connection. Nguyên nhân thường gặp: server chưa chạy (kiểm tra service đã start chưa), sai cổng, hoặc gõ nhầm host. Nhớ quy tắc: server phải đang chạy thì client mới kết nối được.
Xung đột cổng. Nếu máy đã có sẵn một MySQL khác chiếm cổng 3306, bản mới sẽ không khởi động được. Khi đó đổi cổng (ví dụ map Docker thành -p 3307:3306) và nhớ nhập đúng cổng mới trong GUI.
Lỗi font/encoding tiếng Việt. Luôn dùng bảng mã UTF-8 (utf8mb4 cho MySQL). Nếu thấy tên khách hàng tiếng Việt hiển thị thành "Nguyß╗àn", gần như chắc chắn là sai encoding khi tạo database hoặc khi import dữ liệu.
Nhầm sandbox với production. Mẹo vàng: đặt tên kết nối thật rõ — ví dụ "LOCAL-SANDBOX (an toàn)" — và không bao giờ lưu kết nối tới CSDL production trong cùng công cụ với màu sắc giống nhau. DBeaver cho phép tô màu kết nối: hãy tô đỏ mọi thứ liên quan production để mắt bạn luôn cảnh giác.
Đừng cố nhớ mọi khác biệt cú pháp MySQL vs Postgres. Mẹo thực dụng: ghi chú một bảng đối chiếu nhỏ những hàm bạn hay dùng (nối chuỗi, ngày tháng, giới hạn dòng) và dán cạnh màn hình. Quan trọng nhất là luôn biết hệ đích khi viết đặc tả.
Mẹo cho làm việc nhóm: nếu cả team cùng học, hãy thống nhất một phiên bản (ví dụ PostgreSQL 16) và một bộ dữ liệu mẫu duy nhất qua Docker. Tránh được vô số rắc rối "máy tôi chạy được".
Bài tập thực hành
- Dựng một sandbox PostgreSQL bằng một trong hai cách (cài trực tiếp hoặc Docker). Kết nối thành công bằng DBeaver. Chụp lại màn hình "Test Connection → Connected".
- Nạp bộ dữ liệu mẫu Pagila/DVD Rental. Chạy
SELECT COUNT(*) FROM customer;và ghi lại con số. Sau đó liệt kê tên 5 bảng bất kỳ trong schema.
- (Nâng cao) Dựng song song một MySQL với bộ Sakila. Cùng một yêu cầu "đếm số khách hàng", hãy viết câu query cho cả hai hệ và quan sát: cú pháp giống nhau ở mức
SELECT COUNT(*)này không?
- Bài tập tư duy BA: Viết một đoạn ghi chú ngắn (3–5 dòng) cho một đặc tả báo cáo giả định, trong đó nêu rõ: hệ đích là gì, phiên bản nào, và một hàm bạn lưu ý có thể khác biệt giữa hai hệ. Đây chính là thói quen đã cứu bạn Minh ở tình huống 2.
- Tô màu cảnh báo: Trong DBeaver, tạo một kết nối giả đặt tên "PRODUCTION (KHÔNG ĐỤNG)" và tô màu đỏ. Tập thói quen phân biệt sandbox với production bằng thị giác.
Tóm tắt
- BA cần sandbox riêng, không học việc trên production — một câu query nặng có thể làm chậm cả hệ thống thật.
- Tách bạch ba lớp: server (MySQL/Postgres chạy ngầm), client, và GUI tool (DBeaver, TablePlus...).
- MySQL mạnh ở web/e-commerce; PostgreSQL mạnh ở phân tích nâng cao. Học cả hai, ưu tiên hệ công ty dùng. Cú pháp giữa hai hệ có khác biệt — luôn biết hệ đích khi viết đặc tả.
- Hai cách dựng môi trường: cài trực tiếp (đơn giản để bắt đầu) hoặc Docker (sạch, dễ làm lại, lý tưởng cho làm việc nhóm).
- Sandbox rỗng thì vô dụng — nạp dữ liệu mẫu (Sakila cho MySQL, Pagila/DVD Rental cho Postgres) để có cái mà luyện.
- Cảnh giác các lỗi kinh điển: quên mật khẩu, connection refused, xung đột cổng, sai encoding UTF-8 tiếng Việt, và nguy hiểm nhất là nhầm sandbox với production.