
Tại Sao Phải Học SQL?
SQL (Structured Query Language) là ngôn ngữ chuẩn để truy vấn và quản lý cơ sở dữ liệu quan hệ. Dù bạn làm backend developer, data analyst, hay marketer — SQL là kỹ năng cơ bản không thể thiếu. Hầu hết mọi ứng dụng web, mobile, và enterprise đều dùng database relational như PostgreSQL, MySQL hoặc SQLite.
Học SQL không khó. Bạn có thể viết query đầu tiên trong vòng 5 phút. Bài viết này sẽ đưa bạn từ zero đến đủ SQL cho công việc thực tế.
Cài Đặt Môi Trường
Bạn không cần cài gì cả để bắt đầu. Hai cách nhanh nhất:
- SQLiteOnline — chạy SQL trực tiếp trên trình duyệt, không cần đăng ký
- DB Fiddle — hỗ trợ MySQL, PostgreSQL, SQLite với sample data sẵn có
Nếu muốn cài local, macOS/Linux dùng brew install sqlite3 hoặc Ubuntu dùng sudo apt install sqlite3. Windows tải SQLite binary từ trang chính thức.
Các Cú Pháp SQL Cơ Bản
SELECT — Đọc Dữ Liệu
SELECT là lệnh dùng nhiều nhất trong SQL. Cú pháp cơ bản:
SELECT ten_cot, gia_tri FROM bang_du_lieu;
Ví dụ với bảng users có cột name, email, age:
-- Lấy tất cả
SELECT * FROM users;
-- Lấy cột cụ thể
SELECT name, email FROM users;
-- Lấy với điều kiện
SELECT name, email FROM users WHERE age > 25;
-- Sắp xếp
SELECT name, age FROM users ORDER BY age DESC;
-- Giới hạn kết quả
SELECT name FROM users LIMIT 10;
INSERT — Thêm Dữ Liệu
INSERT INTO users (name, email, age) VALUES ('Nguyễn Văn A', '[email protected]', 28);
-- Thêm nhiều dòng
INSERT INTO users (name, email, age) VALUES
('Trần B', '[email protected]', 32),
('Lê C', '[email protected]', 24);
UPDATE — Sửa Dữ Liệu
UPDATE users SET age = 29 WHERE name = 'Nguyễn Văn A';
Cảnh báo: Luôn dùng WHERE khi UPDATE. Nếu thiếu WHERE, toàn bộ bảng sẽ bị update.
XÓA Dữ Liệu
DELETE FROM users WHERE id = 5;
Tương tự UPDATE — thiếu WHERE sẽ xóa toàn bộ dữ liệu.
Tạo Bảng và Cấu Trúc Dữ Liệu
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
age INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Các kiểu dữ liệu thường dùng:
INTEGER— số nguyên (ID, tuổi, số lượng)VARCHAR(n)— chuỗi độ dài tối đa n (tên, email)TEXT— chuỗi dài không giới hạn (nội dung bài viết)FLOAT/DECIMAL— số thực (giá tiền, tỷ lệ)BOOLEAN— true/false (trạng thái)TIMESTAMP— ngày giờ
JOIN — Nối Bảng
JOIN là tính năng mạnh nhất của SQL. Khi dữ liệu phân tán nhiều bảng, JOIN giúp bạn truy vấn kết hợp.
-- INNER JOIN: chỉ lấy dòng có match cả 2 bảng
SELECT users.name, orders.total
FROM users
INNER JOIN orders ON users.id = orders.user_id;
-- LEFT JOIN: lấy tất cả dòng bảng trái, match bảng phải nếu có
SELECT users.name, orders.total
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
--RIGHT JOIN: lấy tất cả dòng bảng phải
SELECT users.name, orders.total
FROM users
RIGHT JOIN orders ON users.id = orders.user_id;
Ví dụ thực tế: bảng users có 100 người dùng, bảng orders có 500 đơn hàng. LEFT JOIN sẽ trả về 100 dòng (mỗi user kèm đơn hàng nếu có, nếu chưa có đơn thì orders.total = NULL).
Aggregate Functions
Hàm tổng hợp để phân tích dữ liệu:
-- Đếm số user
SELECT COUNT(*) FROM users;
-- Tổng doanh thu
SELECT SUM(total) FROM orders;
-- Trung bình đơn hàng
SELECT AVG(total) FROM orders;
-- Min/Max
SELECT MIN(age), MAX(age) FROM users;
GROUP BY — Phân Nhóm
-- Số đơn hàng theo user
SELECT user_id, COUNT(*) as order_count, SUM(total) as total_spent
FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5; -- chỉ lấy user có hơn 5 đơn
WHERE filter trước khi group, HAVING filter sau khi group.
Subquery và CTE
Subquery
-- User có đơn hàng lớn nhất
SELECT name FROM users WHERE id = (
SELECT user_id FROM orders ORDER BY total DESC LIMIT 1
);
CTE (Common Table Expression)
WITH top_spenders AS (
SELECT user_id, SUM(total) as total_spent
FROM orders
GROUP BY user_id
HAVING SUM(total) > 10000
)
SELECT users.name, top_spenders.total_spent
FROM users INNER JOIN top_spenders ON users.id = top_spenders.user_id;
CTE giúp code SQL dễ đọc hơn nhiều so với subquery lồng nhau.
Index — Tăng Tốc Query
Khi bảng có hàng triệu dòng, query sẽ chậm nếu không có index.
-- Tạo index trên cột frequently queried
CREATE INDEX idx_users_email ON users(email);
-- Composite index (nhiều cột)
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
Rule of thumb: tạo index cho cột dùng trong WHERE, JOIN, ORDER BY. Không tạo index quá nhiều vì index làm chậm INSERT/UPDATE.
Lộ Trình Học SQL
| Giai Đoạn | Nội Dung | Thời Gian |
|---|---|---|
| Cơ bản | SELECT, INSERT, UPDATE, DELETE, WHERE | 1-2 tuần |
| Trung bình | JOIN, Aggregate, GROUP BY, Subquery | 2-4 tuần |
| Nâng cao | CTE, Window Function, Index optimization | 1-2 tháng |
| Chuyên gia | Query tuning, Partitioning, Replication | 3-6 tháng |
Tài Nguyên Học SQL Miễn Phí
- SQLZoo — tutorial interactive từ cơ bản đến nâng cao
- W3Schools SQL — tham khảo cú pháp từng lệnh
- LeetCode Database — bài tập thực tế để luyện tay
- Khan Academy — khóa SQL miễn phí có bài kiểm tra
- Mode SQL Tutorial — hướng dẫn từ data analyst perspective
SQL là kỹ năng đầu tư lớn nhất cho bất kỳ ai làm việc với dữ liệu. Bắt đầu với SQLiteOnline, viết 5 câu query mỗi ngày trong 2 tuần — bạn sẽ bất ngờ mình tiến bộ nhanh thế nào.
