SQL
SQL là gì
(Structured Query Language - Ngôn ngữ Truy vấn Có cấu trúc) là ngôn ngữ tiêu chuẩn để truy vấn và thao tác với các cơ sở dữ liệu quan hệ như PostgreSQL, MySQL, SQLite và SQL Server. Hãy tưởng tượng bạn gọi món ở nhà hàng: bạn nói bạn muốn gì trên đĩa, chứ không nói cách nấu nó. SQL hoạt động theo cách tương tự. Bạn mô tả kết quả bạn muốn, và cỗ máy cơ sở dữ liệu sẽ tự tìm cách lấy nó một cách hiệu quả. Đây gọi là khai báo (declarative).
Điểm mạnh
- Khai báo: nói rõ bạn muốn gì, chứ không phải cách lặp qua từng dòng dữ liệu.
- Đã được chứng minh qua hàng chục năm, với các engine trưởng thành và đảm bảo tính nhất quán mạnh mẽ.
- Các thao tác dựa trên tập hợp (joins, aggregates, window functions) ngắn gọn và nhanh.
- Có thể chuyển đổi được — SQL cốt lõi hoạt động trên hầu hết các cơ sở dữ liệu quan hệ.
Đánh đổi
- Các phương ngữ khác nhau (Postgres so với MySQL so với SQLite), nên khả năng di chuyển không hoàn toàn.
- Dễ viết ra các truy vấn chậm; hiệu năng phụ thuộc vào chỉ mục (index) và kế hoạch truy vấn (query plan).
- Không phải là ngôn ngữ đa dụng — luồng điều khiển và logic khá gượng gạo.
- Thay đổi schema (migrations) cần cẩn thận khi ở môi trường production.
Khi nào nên dùng
Hãy dùng SQL bất cứ khi nào dữ liệu của bạn mang tính quan hệ và được truy vấn theo cấu trúc: báo cáo, phân tích dữ liệu, ứng dụng, và bất kỳ hệ thống nào mà tính toàn vẹn dữ liệu và các phép nối (joins) quan trọng. Đây là công cụ phù hợp cho việc tổng hợp (aggregations) và các câu hỏi tùy biến (ad-hoc) trên dữ liệu có cấu trúc, và nó phối hợp tốt với gần như mọi ngôn ngữ backend.
Phù hợp với vibe coding ra sao
Các trợ lý AI rất giỏi về SQL và có thể chuyển các câu hỏi bằng tiếng Anh đơn giản thành truy vấn một cách đáng ngạc nhiên, nhưng chúng có thể đoán mò về schema của bạn. Hãy hướng dẫn AI bằng cách dán vào các định nghĩa bảng thực tế (câu lệnh CREATE TABLE) và nêu rõ cơ sở dữ liệu cụ thể bạn dùng (Postgres, SQLite, v.v.) để nó sử dụng đúng phương ngữ và hàm. Hãy yêu cầu nó giải thích truy vấn và đề xuất chỉ mục (index) cho các truy vấn chậm. Luôn yêu cầu nó tham số hóa (parameterize) dữ liệu người dùng nhập vào thay vì ghép trực tiếp giá trị vào nội dung truy vấn. Hãy tưởng tượng một ô nhập liệu trên form, nơi ai đó gõ vào không phải một cái tên mà là một câu lệnh; nếu bạn dán thẳng đoạn văn bản đó vào truy vấn của mình, cơ sở dữ liệu có thể sẽ chạy nó. Việc giữ dữ liệu người dùng tách biệt sẽ ngăn chặn điều đó — một kiểu tấn công gọi là SQL injection. Hãy kiểm tra các truy vấn được tạo ra trên một mẫu dữ liệu nhỏ trước khi chạy trên production.
SELECT u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.active = true
GROUP BY u.name
HAVING COUNT(o.id) > 5
ORDER BY order_count DESC;