Bài 2 — Sinh SQL từ ngôn ngữ tự nhiên: viết prompt để AI ra query đúng
Vấn đề
BA thường biết muốn gì nhưng không viết được SQL, đặc biệt khi phải JOIN nhiều bảng, lọc điều kiện phức tạp, hay gom nhóm theo thời gian. Câu hỏi "khách hàng mua lần đầu trong quý 2 và có giá trị đơn > 1 triệu" nghe đơn giản nhưng dịch sang SQL là cả một bài toán. AI làm được — nếu bạn cung cấp đủ ngữ cảnh và mô tả tiêu chí rõ ràng.
Công thức prompt sinh SQL: SCHEMA + Ý ĐỊNH + RÀNG BUỘC
Một prompt tốt luôn có ba phần:
- SCHEMA: cấu trúc bảng và quan hệ (dùng Hồ sơ ngữ cảnh từ Bài 1).
- Ý ĐỊNH: câu hỏi nghiệp vụ, tiêu chí lọc, cách tính.
- RÀNG BUỘC: loại CSDL (MySQL/PostgreSQL/BigQuery), định dạng ngày, muốn giải thích không.
Ví dụ prompt hoàn chỉnh
Bạn là chuyên gia SQL. Chỉ dùng đúng các bảng/cột tôi cung cấp, KHÔNG bịa thêm cột.[SCHEMA]
customers(customer_id PK, name, city, created_at DATE)
orders(order_id PK, customer_id FK, order_date DATE, amount DECIMAL, status)
-- status nhận: 'paid', 'cancelled', 'refunded'
[Ý ĐỊNH]
Tìm khách hàng ở TP.HCM có đơn 'paid' đầu tiên rơi vào Quý 2/2026,
và tổng chi tiêu cả quý 2 > 1.000.000. Trả về: name, ngày đơn đầu, tổng chi.
[RÀNG BUỘC]
- CSDL: MySQL 8
- Sắp xếp theo tổng chi giảm dần
- Sau query, giải thích từng mệnh đề bằng tiếng Việt và nêu 1 giả định bạn đã đặt.
Yêu cầu "nêu giả định" cực kỳ giá trị: nó buộc AI bộc lộ những chỗ nó tự suy diễn (ví dụ: "đơn đầu tiên" tính theo MIN(order_date)), giúp bạn phát hiện hiểu nhầm.
Các bước làm chuẩn
- Dán SCHEMA đầy đủ (copy từ tài liệu CSDL hoặc chạy
DESCRIBE bảng). - Viết ý định bằng tiếng Việt, nêu rõ tiêu chí và cách tính từng chỉ số.
- Chốt ràng buộc kỹ thuật (loại CSDL rất quan trọng vì cú pháp ngày khác nhau).
- Nhận query + đọc phần giải thích, đối chiếu giả định.
- Chạy trên môi trường đọc-only hoặc thêm
LIMIT 100khi test. - Kiểm chứng bằng một cách tính khác (xem Bài 6).
Xử lý query phức tạp: chia nhỏ
Nếu câu hỏi có nhiều tầng, đừng bắt AI làm một phát. Yêu cầu:
Hãy giải bài này theo 2 bước, dùng CTE (WITH):
Bước 1: tạo bảng tạm 'first_order' lấy đơn paid đầu tiên mỗi khách.
Bước 2: JOIN với orders để tính tổng chi Q2 và lọc điều kiện.
Giải thích mỗi CTE làm gì.
CTE giúp query dễ đọc, dễ kiểm tra từng phần — rất hợp với BA không chuyên code.
Template prompt sinh SQL (dán và điền)
Bạn là chuyên gia SQL, chỉ dùng đúng bảng/cột được cấp, không bịa.
[SCHEMA]: <dán schema + quan hệ + giá trị hợp lệ>
[Ý ĐỊNH]: <câu hỏi nghiệp vụ + tiêu chí + cách tính>
[RÀNG BUỘC]: CSDL=<...>; định dạng ngày=<...>; LIMIT khi test
[YÊU CẦU PHỤ]: giải thích tiếng Việt + liệt kê giả định + cảnh báo nếu thiếu dữ liệu
Sai lầm thường gặp
- Ảo giác tên cột/hàm: AI hay dùng hàm không có trong CSDL của bạn (ví dụ
DATE_TRUNCcủa PostgreSQL khi bạn dùng MySQL). Luôn khai báo loại CSDL và test trước. - Mập mờ định nghĩa nghiệp vụ: "khách hàng active" nghĩa là gì? Nếu bạn không định nghĩa, AI tự đặt một định nghĩa khác — con số sai mà không báo lỗi.
- Không dùng LIMIT khi test: query sai chạy trên bảng chục triệu dòng có thể treo hệ thống. Test nhỏ trước.
- Chạy query ghi/xóa do AI viết mà không đọc: AI có thể vô tình sinh
DELETE/UPDATE. Chỉ chạy ở tài khoản read-only; đọc kỹ động từ SQL trước khi chạy. - Rò rỉ schema nhạy cảm: một số schema tiết lộ cấu trúc kinh doanh mật. Cân nhắc dùng công cụ nội bộ được duyệt.
Checklist kết bài
- [ ] Prompt có đủ SCHEMA + Ý ĐỊNH + RÀNG BUỘC.
- [ ] Đã yêu cầu AI liệt kê giả định.
- [ ] Đã test với LIMIT trên tài khoản read-only.
- [ ] Đã đối chiếu ít nhất 1 con số với nguồn đã biết.