SELECT
SELECT * FROM users; SELECT name, email FROM users; SELECT DISTINCT city FROM users; SELECT name AS full_name FROM users;
WHERE
Toán Tử So Sánh
= <> (!=)Bằng / không bằng
< > <= >=Toán tử so sánh
AND OR NOTToán tử logic
IS NULL / IS NOT NULLKiểm tra null
Khớp Pattern
SELECT * FROM users WHERE name LIKE 'A%'; -- % = any chars, _ = single char SELECT * FROM users WHERE age IN (20, 25, 30); SELECT * FROM users WHERE age BETWEEN 18 AND 30;
JOIN
Các Loại Join
INNER JOINHàng khớp trong cả hai bảng
LEFT JOINTất cả hàng bên trái + khớp bên phải
RIGHT JOINTất cả hàng bên phải + khớp bên trái
FULL OUTER JOINTất cả hàng từ cả hai bảng
CROSS JOINTích Descartes của hai bảng
Cú Pháp Join
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id; SELECT u.name, o.total FROM users u LEFT JOIN orders o ON u.id = o.user_id;
INSERT / UPDATE / DELETE
Insert
INSERT INTO users (name, email) VALUES ('Alice', '[email protected]'); INSERT INTO users (name, email) VALUES ('Bob', '[email protected]'), ('Carol', '[email protected]');
Update
UPDATE users SET email = '[email protected]' WHERE id = 1;
Delete
DELETE FROM users WHERE id = 1; DELETE FROM users; -- delete all rows
CREATE TABLE
Cú Pháp
CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, age INTEGER DEFAULT 0, score REAL );
Kiểu Dữ Liệu Phổ Biến
INTEGERSố nguyên
REALSố thực dấu phẩy động
TEXTChuỗi / dữ liệu văn bản
BLOBDữ liệu nhị phân
BOOLEANTRUE / FALSE (lưu dưới dạng 0/1)
DATE / DATETIMEGiá trị ngày và timestamp
Ràng Buộc
PRIMARY KEYĐịnh danh hàng duy nhất
NOT NULLBắt buộc phải có giá trị
UNIQUEKhông có giá trị trùng lặp
DEFAULT valGiá trị mặc định nếu bỏ qua
CHECK (expr)Quy tắc xác thực tùy chỉnh
FOREIGN KEYTham chiếu đến bảng khác
Hàm Tổng Hợp
COUNT(*)Số hàng
COUNT(col)Giá trị không null trong cột
SUM(col)Tổng cột số
AVG(col)Trung bình cột số
MIN(col)Giá trị nhỏ nhất
MAX(col)Giá trị lớn nhất
Ví Dụ
SELECT COUNT(*) AS total, AVG(age) AS avg_age, MAX(score) AS top_score FROM users;
GROUP BY / HAVING
SELECT city, COUNT(*) AS num_users FROM users GROUP BY city; SELECT city, AVG(age) AS avg_age FROM users GROUP BY city HAVING AVG(age) > 25;

WHERE lọc hàng trước khi nhóm; HAVING lọc nhóm sau khi tổng hợp

ORDER BY / LIMIT
SELECT * FROM users ORDER BY name ASC; SELECT * FROM users ORDER BY age DESC; SELECT * FROM users ORDER BY city, name LIMIT 10 OFFSET 20; -- skip 20, take 10
Subquery
Trong Mệnh Đề WHERE
SELECT name FROM users WHERE id IN ( SELECT user_id FROM orders WHERE total > 100 );
Bảng Dẫn Xuất
SELECT city, avg_age FROM ( SELECT city, AVG(age) AS avg_age FROM users GROUP BY city ) WHERE avg_age > 30;
Index
CREATE INDEX idx_name ON users(name); CREATE UNIQUE INDEX idx_email ON users(email); DROP INDEX idx_name;
Khi Nào Dùng Index
Cột trong WHERETăng tốc lọc
Cột trong JOIN ONTăng tốc tra cứu join
Cột trong ORDER BYTăng tốc sắp xếp
Cột có cardinality caoNhiều giá trị duy nhất sẽ lợi nhất