SELECT — Truy vấn dữ liệu
-- Lấy tất cả columns
SELECT * FROM users;
-- Chỉ lấy columns cần thiết (best practice)
SELECT id, name, email FROM users;
-- Alias
SELECT
first_name AS "Họ",
last_name AS "Tên",
salary * 12 AS annual_salary
FROM employees;
WHERE — Lọc dữ liệu
SELECT * FROM users
WHERE age >= 18
AND status = 'active'
AND email LIKE '%@gmail.com'
AND city IN ('HCM', 'Hanoi', 'Danang');
JOIN — Kết hợp bảng
-- INNER JOIN: chỉ lấy records match cả 2 bảng
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- LEFT JOIN: lấy tất cả users, kể cả chưa có order
SELECT u.name, COALESCE(o.total, 0) as total
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
INNER JOIN LEFT JOIN RIGHT JOIN FULL OUTER JOIN
┌───┐ ┌───┐ ┌───┐ ┌───┐
│ ██│ │███│ │ ██│ │███│
│███│ │███│ │███│ │███│
│██ │ │██ │ │███│ │███│
└───┘ └───┘ └───┘ └───┘
Key insight: Luôn dùng explicit JOIN syntax (
JOIN ... ON) thay vì implicit (WHERE a.id = b.id). Dễ đọc hơn và tránh accidental cross join.