SQL là ngôn ngữ dùng để hỏi dữ liệu trong cơ sở dữ liệu quan hệ: lấy những cột nào, từ bảng nào, với điều kiện gì, gộp và sắp xếp ra sao. Người làm văn phòng không cần viết SQL thành thạo; với trợ lý AI, việc quan trọng hơn là đọc hiểu được câu truy vấn AI đưa ra và biết cách kiểm kết quả trước khi tin. Bảy mệnh đề cơ bản đủ để đọc phần lớn câu truy vấn thường ngày.
Bài này giải thích bảy mệnh đề đó bằng ví dụ giả định trên bộ bảng khách hàng, đơn hàng của một cửa hàng, hướng dẫn cách mô tả bảng để AI viết đúng ngay lần đầu, chỉ ra năm lỗi kinh điển mà AI và người mới đều hay mắc, rồi đưa một quy trình kiểm để bạn không mang con số sai vào báo cáo. Lập trình ứng dụng với SQL nằm ngoài phạm vi; phần đó thuộc trang AI Lập Trình.
Người làm văn phòng gặp SQL ở đâu
Bạn có thể đã dùng SQL mà không biết. Nhiều phần mềm quản lý bán hàng, kế toán, nhân sự lưu dữ liệu trong cơ sở dữ liệu quan hệ và có chức năng báo cáo tuỳ chỉnh cho phép nhập câu truy vấn. Một số công cụ bảng tính và nền tảng dữ liệu có ô lệnh theo cú pháp gần giống SQL. Khi bạn nhờ người phụ trách kỹ thuật "lấy giúp danh sách khách chưa mua lại trong sáu tháng", thứ người đó viết chính là một câu SQL.
Muốn tập mà không đụng vào hệ thống thật, cách an toàn là dùng SQLite: một cơ sở dữ liệu nằm gọn trong một tệp trên máy, miễn phí, có nhiều phần mềm giao diện cho phép nhập tệp CSV thành bảng và chạy truy vấn. Bạn xuất vài bảng từ bảng tính đã được che dữ liệu cá nhân, nhập vào SQLite và thử mọi câu lệnh mà không sợ làm hỏng gì.
Cần biết một điều trước khi nhờ AI: SQL có chuẩn chung, nhưng mỗi hệ quản trị (SQLite, MySQL, PostgreSQL, SQL Server…) có những khác biệt nhỏ về cách giới hạn số dòng, xử lý ngày tháng, nối chuỗi. Câu đúng trên hệ này có thể báo lỗi trên hệ kia. Vì vậy luôn nói rõ cho AI bạn đang dùng hệ nào, và nếu không biết thì hỏi người quản trị phần mềm.
Bảy mệnh đề đọc được trong một buổi
Các ví dụ dưới đây chạy trên hai bảng giả định: khach_hang (ma_kh, ho_ten, tinh_thanh) và don_hang (ma_don, ma_kh, ngay_dat, kenh_ban, tong_tien, trang_thai). Cú pháp viết theo SQLite.
| Mệnh đề | Làm gì | Ví dụ |
|---|---|---|
| SELECT … FROM | Chọn cột nào, từ bảng nào | SELECT ho_ten, tinh_thanh FROM khach_hang; |
| WHERE | Lọc dòng theo điều kiện | SELECT * FROM don_hang WHERE trang_thai = 'Đã giao' AND ngay_dat >= '2026-01-01'; |
| ORDER BY | Sắp xếp; DESC là giảm dần | SELECT * FROM don_hang ORDER BY ngay_dat DESC; |
| LIMIT | Chỉ lấy vài dòng đầu (SQL Server dùng TOP thay thế) | SELECT * FROM don_hang ORDER BY tong_tien DESC LIMIT 10; |
| GROUP BY | Gộp dòng theo nhóm để đếm, cộng | SELECT kenh_ban, COUNT(*) AS so_don FROM don_hang GROUP BY kenh_ban; |
| HAVING | Lọc sau khi gộp nhóm | SELECT ma_kh, COUNT(*) AS so_don FROM don_hang GROUP BY ma_kh HAVING COUNT(*) >= 5; |
| JOIN … ON | Nối hai bảng qua cột mã | SELECT d.ma_don, k.ho_ten FROM don_hang d JOIN khach_hang k ON d.ma_kh = k.ma_kh; |
Đọc câu truy vấn theo thứ tự máy thực hiện chứ không theo thứ tự viết: FROM và JOIN lấy bảng trước, WHERE lọc dòng, GROUP BY gộp nhóm, HAVING lọc nhóm, SELECT chọn cột, ORDER BY sắp xếp, LIMIT cắt bớt. Hiểu thứ tự này giải thích được vì sao không dùng được tên cột đặt ở SELECT trong WHERE ở nhiều hệ quản trị.
Mô tả bảng cho AI để nhận câu truy vấn đúng
Trợ lý AI viết SQL tốt khi biết chính xác cấu trúc bảng và rất dễ bịa tên cột khi không biết. Phần mô tả nên gồm: tên hệ quản trị, tên từng bảng, danh sách cột kèm kiểu dữ liệu, cột nào là khoá, bảng nào nối với bảng nào qua cột nào, và các quy ước đặc biệt như trạng thái nhận những giá trị gì, ngày lưu kèm giờ hay không, tiền tính trước hay sau giảm giá. Nếu đã có từ điển dữ liệu, chép phần định nghĩa cột là đủ.
Không cần và không nên gửi dữ liệu thật. Tên khách, số điện thoại, địa chỉ, doanh thu thật của cửa hàng không giúp AI viết câu truy vấn tốt hơn. Nếu cần ví dụ để AI hiểu định dạng, dùng hai ba dòng giả định.
Câu lệnh mẫu: "Hệ quản trị: SQLite. Hai bảng: khach_hang(ma_kh chữ, khoá chính; ho_ten chữ; tinh_thanh chữ) và don_hang(ma_don chữ, khoá chính; ma_kh chữ, nối khach_hang.ma_kh; ngay_dat chữ dạng YYYY-MM-DD; tong_tien số nguyên, đơn vị đồng, đã trừ giảm giá; trang_thai chữ, nhận Mới, Đã giao, Huỷ). Viết câu truy vấn liệt kê khách có ít nhất ba đơn Đã giao trong năm 2026, kèm số đơn, sắp xếp giảm dần. Giải thích từng dòng bằng tiếng Việt và nêu giả định nếu có."
Yêu cầu giải thích từng dòng không phải để học thuộc, mà để bạn bắt được chỗ AI hiểu sai đề: nếu phần giải thích nói "tính cả đơn huỷ" trong khi bạn chỉ muốn đơn đã giao, sai lầm lộ ra trước khi bạn chạy câu lệnh.
Đọc một câu truy vấn từ đầu đến cuối
Với câu lệnh mẫu ở trên, một câu trả lời hợp lý của AI có dạng: SELECT k.ma_kh, k.ho_ten, COUNT(*) AS so_don FROM khach_hang k JOIN don_hang d ON d.ma_kh = k.ma_kh WHERE d.trang_thai = 'Đã giao' AND d.ngay_dat BETWEEN '2026-01-01' AND '2026-12-31' GROUP BY k.ma_kh, k.ho_ten HAVING COUNT(*) >= 3 ORDER BY so_don DESC;
Đọc theo thứ tự máy làm. Đầu tiên lấy bảng khách, đặt tên tắt là k, nối với bảng đơn đặt tên tắt là d, mỗi đơn ghép với đúng khách của nó. Tiếp theo giữ lại những đơn đã giao và có ngày đặt trong năm 2026; vì cột ngày lưu dạng chữ năm–tháng–ngày không kèm giờ, phép so sánh BETWEEN như vậy là đúng. Sau đó gộp theo từng khách và đếm số đơn còn lại. HAVING bỏ những khách có dưới ba đơn. Cuối cùng chọn ba cột để hiện và sắp xếp từ khách nhiều đơn nhất.
Khi đọc xong, tự hỏi ba câu. Đơn huỷ có bị loại không — có, nhờ điều kiện trạng thái. Hai khách trùng tên có bị gộp làm một không — không, vì gộp theo cả mã khách. Nếu cột ngày lưu kèm giờ thì sao — khi đó mọi đơn đặt trong ngày 31/12 có giờ lớn hơn 0 giờ 00 sẽ bị bỏ sót, phải sửa mốc cuối. Ba câu hỏi này là cách bạn kiểm AI mà không cần viết lại từ đầu.
Năm lỗi kinh điển trong câu truy vấn
JOIN làm nhân dòng. Nối bảng đơn hàng với bảng chi tiết đơn rồi cộng tổng tiền của đơn: một đơn ba món sẽ bị cộng ba lần. Câu chạy không lỗi, con số to gấp mấy lần thực tế. Khi thấy tổng lớn bất thường, kiểm xem có phép nối một–nhiều nào nằm trước phép cộng không.
JOIN làm mất dòng. Phép nối thường (INNER JOIN) chỉ giữ dòng có ở cả hai bảng. Muốn liệt kê mọi khách kể cả khách chưa có đơn, phải dùng LEFT JOIN từ bảng khách. Đây là lý do danh sách "khách chưa mua lần nào" ra rỗng dù thực tế có rất nhiều.
So sánh với NULL bằng dấu bằng. Ô trống trong cơ sở dữ liệu thường là NULL, và điều kiện cot = NULL không bao giờ đúng. Phải viết cot IS NULL hoặc IS NOT NULL. Ngoài ra COUNT(cot) bỏ qua NULL, còn COUNT(*) đếm mọi dòng; hai con số khác nhau là chuyện bình thường.
Ngày có kèm giờ. Nếu cột lưu cả ngày lẫn giờ, điều kiện "ngày đặt đến hết 31/10" viết bằng một mốc ngày trần có thể bỏ sót gần hết đơn trong chính ngày 31/10, vì mốc ngày trần được hiểu là đúng 0 giờ 00 của ngày đó. Cách an toàn là lọc bằng ngay_dat nhỏ hơn mốc đầu ngày hôm sau.
Tên cột bịa. Khi mô tả bảng thiếu, AI tự nghĩ ra tên cột nghe hợp lý như customer_id hay order_date. Hệ quản trị sẽ báo lỗi không tìm thấy cột; sửa bằng cách đưa lại mô tả bảng, đừng đoán tên.
Tự kiểm một kết quả trước khi dùng
Câu truy vấn chạy không báo lỗi chỉ chứng tỏ cú pháp đúng. Kết quả có đúng với điều bạn muốn hỏi hay không là chuyện khác. Mấy phép kiểm dưới đây mất vài phút và bắt được hầu hết lỗi logic.
- Biết tổng trước: đếm tổng số dòng của bảng gốc bằng COUNT(*). Mọi phép lọc phải cho ra số nhỏ hơn hoặc bằng; nếu lớn hơn, có phép nối đang nhân dòng.
- Chạy từng phần: bỏ GROUP BY, chỉ chạy phần FROM, JOIN, WHERE với LIMIT 20 để xem những dòng thô nào đang đi vào phép gộp.
- So với một con số đã biết: số đơn tháng trước đã có trong báo cáo cũ hay sổ tay. Chạy câu truy vấn cho đúng tháng đó; khớp thì mới tin cho tháng khác.
- Đọc tay vài dòng: chọn hai khách trong kết quả, mở bảng gốc đếm tay số đơn của họ.
- Thử trường hợp biên: khách chưa có đơn, đơn bị huỷ, đơn ngày cuối tháng, ô trống. Mỗi trường hợp đi vào hay bị loại khỏi kết quả có đúng ý không.
Khi đã chắc kết quả đúng, việc đọc xem con số đó nói gì về tình hình kinh doanh thuộc về phân tích, có hướng dẫn riêng ở trang AI Phân Tích.
Câu lệnh làm thay đổi dữ liệu: nguyên tắc an toàn
Mọi ví dụ ở trên chỉ đọc dữ liệu. SQL còn có các lệnh thay đổi dữ liệu: UPDATE sửa, DELETE xoá, INSERT thêm, và DROP xoá hẳn cả bảng. Một câu UPDATE hay DELETE quên mệnh đề WHERE sẽ áp lên toàn bộ bảng, và trong nhiều hệ thống không có nút hoàn tác.
Nguyên tắc cho người không chuyên: tài khoản dùng để tra cứu chỉ nên có quyền đọc. Nếu thật sự phải sửa dữ liệu, sao lưu trước, chạy phần WHERE dưới dạng SELECT để xem chính xác những dòng nào sẽ bị ảnh hưởng và đếm số dòng, rồi mới đổi thành UPDATE hay DELETE. Không chạy câu lệnh thay đổi dữ liệu do AI viết lên hệ thống thật khi chưa hiểu từng dòng và chưa có bản sao lưu.
Cuối cùng, kết quả truy vấn thường chứa dữ liệu cá nhân — tên, số điện thoại, lịch sử mua của khách. Khi kết quả có vấn đề và bạn muốn nhờ AI xem giúp, chỉ gửi câu truy vấn, mô tả bảng và mô tả hiện tượng (ví dụ: tổng lớn gấp ba so với báo cáo), không dán nguyên bảng kết quả.
Câu hỏi thường gặp
Không biết lập trình có học SQL được không?
Được. Phần đọc dữ liệu của SQL gần với câu tiếng Anh đơn giản và không đòi hỏi tư duy lập trình. Phần lớn người làm văn phòng đọc được câu truy vấn cơ bản sau vài buổi thực hành trên dữ liệu mẫu.
Hàm QUERY trong Google Sheets có phải SQL không?
Hàm QUERY dùng một ngôn ngữ truy vấn có cú pháp giống SQL ở nhiều điểm như SELECT, WHERE, GROUP BY, nhưng cách gọi cột và một số chức năng khác. Nắm SQL cơ bản giúp đọc QUERY dễ hơn; chi tiết có ở danh mục Google Sheets của trang.
AI viết câu truy vấn chạy được thì có chắc kết quả đúng không?
Không. Chạy được chỉ nghĩa là cú pháp đúng. Lỗi logic như nối bảng nhân dòng, quên đơn huỷ, sai mốc ngày vẫn cho ra con số trông hợp lý. Luôn kiểm bằng một con số đã biết trước khi dùng.
Tập SQL trên dữ liệu thật của công ty có sao không?
Không nên tập trên hệ thống đang chạy. Xuất một phần dữ liệu, che hoặc thay thông tin cá nhân, nhập vào một tệp SQLite riêng trên máy và tập ở đó. Như vậy không ảnh hưởng hệ thống và không làm lộ dữ liệu.
Vì sao cùng một câu SQL chạy được ở phần mềm này mà lỗi ở phần mềm khác?
Vì mỗi hệ quản trị có phương ngữ riêng: cách giới hạn số dòng, hàm ngày tháng, cách nối chuỗi khác nhau. Khi hỏi AI, luôn ghi rõ tên hệ quản trị; khi chép câu từ nơi khác, kiểm xem nó viết cho hệ nào.
Có nên để AI kết nối thẳng vào cơ sở dữ liệu để tự truy vấn không?
Một số công cụ cho phép làm việc đó. Với doanh nghiệp nhỏ, chỉ nên cân nhắc khi tài khoản kết nối có quyền chỉ đọc, dữ liệu cá nhân đã được hạn chế và có người hiểu kỹ thuật thiết lập; nếu không, cách tự chạy câu truy vấn vẫn an toàn hơn.