“Em muốn trở thành backend dev!”
“Đã join table bao giờ chưa?”
“Dạ… em chỉ mới join nhóm học.”
🫠
📚 Mục tiêu
Sau bài này, bạn sẽ biết:
- SQL là cái quái gì và tại sao ai cũng dùng
- Cách setup PostgreSQL trên local
- Viết được từ
SELECT
cơ bản đếnJOIN
,GROUP BY
,CTE
,WINDOW FUNCTION
- Có khả năng tự tin fix bug query của đồng đội và gây war trong team (đùa)
🤔 SQL là gì?
- SQL = Structured Query Language
- Dùng để giao tiếp với database
- Cụ thể: PostgreSQL, MySQL, SQL Server, Oracle… đều dùng SQL (nhưng đôi khi cú pháp hơi khác)
PostgreSQL thì như ông chú xăm trổ trầm tính, cực kỳ mạnh, chơi được JSON, CTE, Window đủ trò.
🧑💻 Cài PostgreSQL
🐧 Trên Ubuntu
sudo apt update
sudo apt install postgresql postgresql-contrib -y
🍎 Trên macOS (dùng Homebrew)
brew install postgresql
brew services start postgresql
🐳 Dùng Docker (cách mình recommend)
docker run --name pg-dev -e POSTGRES_PASSWORD=123456 -p 5432:5432 -d postgres
Cổng 5432 là default của PostgreSQL
🛠️ Kết nối
Dùng terminal:
psql -h localhost -U postgres
Hoặc dùng app GUI:
- DBeaver
- TablePlus
- PgAdmin
- hoặc VSCode Extension: "PostgreSQL"
🧪 Câu lệnh SQL Cơ Bản
Tạo database
CREATE DATABASE j4fun;
Tạo bảng
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT,
email TEXT UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Thêm dữ liệu
INSERT INTO users (name, email, age) VALUES
('Long Béo', 'longbeo@example.com', 30),
('Trà Sữa', 'trasua@bubbletea.vn', 21);
Truy vấn dữ liệu
SELECT * FROM users;
WHERE
SELECT * FROM users WHERE age >= 25;
🤝 JOIN – Tình bạn đẹp giữa các bảng
Giả sử có bảng orders
:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id),
amount NUMERIC,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Lấy danh sách đơn hàng và tên người đặt:
SELECT users.name, orders.amount
FROM orders
JOIN users ON orders.user_id = users.id;
📊 GROUP BY – Tổng hợp dữ liệu
SELECT age, COUNT(*) AS total
FROM users
GROUP BY age
ORDER BY total DESC;
🪜 CTE – Common Table Expressions
Cho bạn tách query phức tạp thành nhiều bước (cực hợp Dev có OCD):
WITH adult_users AS (
SELECT * FROM users WHERE age >= 18
)
SELECT COUNT(*) FROM adult_users;
📈 WINDOW FUNCTION – Level max của SQL
SELECT
name,
age,
RANK() OVER (ORDER BY age DESC) AS age_rank
FROM users;
Không gom nhóm như GROUP BY
, nhưng vẫn cho bạn thứ hạng, tổng, trung bình theo từng dòng!
🧹 Một số tips sống còn
- Đừng
SELECT *
nếu không cần, chọn trường cụ thể sẽ nhanh hơn - Luôn
LIMIT
khi test query để khỏi đốt RAM EXPLAIN ANALYZE
để xem query chạy có tối ưu khôngVACUUM
định kỳ nếu dùng local lâu ngày
🤓 Tài liệu học chất lượng
- https://www.postgresql.org/docs/
- https://www.sqltutorial.org/
- https://pg-exercises.com/
- https://mode.com/sql-tutorial/ (visual + thực hành)
🧠 Roadmap học PostgreSQL Từ A-Z
- Hiểu được RDBMS là gì
- Biết tạo bảng, thêm/sửa/xoá dữ liệu (CRUD)
- Thành thạo SELECT + JOIN + WHERE
- Nắm GROUP BY + HAVING + Aggregate function
- Học CTE, Subquery, UNION
- Level max: Window Functions, Index, Partitioning
- Bonus: Viết query phân tích dữ liệu như dân BI
🐒 Tấu hài cuối bài
Interviewer: “Em có biết SQL không?”
Ứng viên: “Dạ em biếtSELECT * FROM life WHERE happy = true
mà chạy mãi không ra kết quả...”
PostgreSQL: “Syntax đúng, nhưng bảnglife
chưa có dữ liệu!”
✅ Tổng kết
- PostgreSQL là hệ quản trị cơ sở dữ liệu mạnh mẽ, đáng học
- SQL là ngôn ngữ bạn bắt buộc phải biết nếu muốn làm backend nghiêm túc
- Tập viết query mỗi ngày là kỹ năng không thể thiếu của developer từ junior tới senior
🧃 Mỗi ngày một chút, một tháng sau bạn sẽ query mượt như trà đào mix thạch nha đam.
-- thử viết query demo để kết thúc đẹp
SELECT 'Học xong bài này là pro SQL rồi!' AS motivation;
🫶