Câu lệnh SQL cơ bản là thứ bạn gần như chắc chắn phải dùng nếu học lập trình web. Dù ngôn ngữ phía máy chủ là PHP, Python hay thứ gì khác, phần lõi chỉ gồm vài lệnh. Bài này đi qua từng lệnh với một bảng ví dụ duy nhất để bạn dễ theo dõi.
Bảng ví dụ dùng xuyên suốt

Giả sử bạn có bảng “sinhvien” với các cột: id (số nguyên, khoá chính), ten (chuỗi), lop (chuỗi) và diem (số thập phân). Mỗi hàng là một sinh viên. Bạn có thể tạo bảng này trong phpMyAdmin hoặc dòng lệnh MySQL.
Câu lệnh tạo bảng như sau:
CREATE TABLE sinhvien (id INT AUTO_INCREMENT PRIMARY KEY, ten VARCHAR(100), lop VARCHAR(10), diem DECIMAL(4,2));
Từ khoá AUTO_INCREMENT khiến id tự tăng mỗi khi thêm hàng mới. Bạn không cần tự đặt số.
SELECT: đọc dữ liệu

SELECT là lệnh dùng nhiều nhất. SELECT * FROM sinhvien; lấy mọi cột của mọi hàng.
Dấu sao tiện khi thử nghiệm. Trong mã thật, hãy liệt kê cột cần lấy: SELECT ten, diem FROM sinhvien;. Cách này nhanh hơn và tránh kéo về dữ liệu không dùng đến.
Muốn lọc theo điều kiện, thêm WHERE: SELECT ten FROM sinhvien WHERE lop = ’10A’;. Các toán tử thường dùng là =, <>, >, <, >=, <=. Kết hợp nhiều điều kiện bằng AND và OR.
Ví dụ WHERE lop = ’10A’ AND diem >= 8 lấy sinh viên lớp 10A có điểm từ 8 trở lên.
Từ khoá LIKE tìm theo mẫu chuỗi. WHERE ten LIKE ‘Nguyễn%’ tìm mọi tên bắt đầu bằng “Nguyễn”.
ORDER BY và LIMIT: sắp xếp, giới hạn

Kết quả không tự sắp xếp. ORDER BY diem DESC sắp từ điểm cao xuống thấp. ASC sắp tăng dần. Sắp theo nhiều cột bằng dấu phẩy: ORDER BY lop ASC, diem DESC.
LIMIT giới hạn số hàng trả về. SELECT ten, diem FROM sinhvien ORDER BY diem DESC LIMIT 5; cho ra năm sinh viên điểm cao nhất.
Kết hợp LIMIT với OFFSET để chia trang kết quả. LIMIT 10 OFFSET 20 bỏ qua hai mươi hàng đầu rồi lấy mười hàng kế tiếp. Đây là cơ sở của phân trang trên website.
INSERT: thêm dữ liệu

INSERT INTO sinhvien (ten, lop, diem) VALUES (‘Lan’, ’10A’, 8.5); thêm một hàng. Liệt kê tên cột trước, rồi giá trị theo cùng thứ tự. Không cần nhắc tới id vì nó tự tăng.
Muốn thêm nhiều hàng một lần, ghi nhiều bộ giá trị cách nhau bằng dấu phẩy: VALUES (‘Minh’, ’10B’, 7), (‘Hoa’, ’10A’, 9). Cách này nhanh hơn chạy nhiều lệnh riêng lẻ.
Chuỗi luôn nằm trong dấu nháy đơn. Số thì không cần. Lỗi cú pháp thường do thiếu một dấu nháy hoặc dư một dấu phẩy cuối danh sách.
UPDATE: sửa dữ liệu
UPDATE sinhvien SET diem = 9 WHERE id = 3; đổi điểm của sinh viên có id bằng 3. Sửa nhiều cột cùng lúc bằng cách cách nhau dấu phẩy: SET diem = 9, lop = ’11A’.
Không có WHERE thì mọi hàng đều bị sửa. Các bước an toàn:
- Viết SELECT với cùng điều kiện WHERE.
- Chạy thử và xem đúng các hàng cần sửa chưa.
- Đổi SELECT thành UPDATE rồi chạy.
DELETE: xoá dữ liệu
DELETE FROM sinhvien WHERE id = 3; xoá đúng hàng có id 3. Cũng như UPDATE, thiếu WHERE sẽ xoá sạch bảng.
Dữ liệu bị xoá khỏi cơ sở dữ liệu thường không có thùng rác. Hãy sao lưu trước khi thử các thao tác nguy hiểm.
Với dữ liệu quan trọng, nhiều hệ thống chọn xoá mềm: thêm một cột đánh dấu đã xoá thay vì xoá thật. Cách này cho phép khôi phục khi nhầm.
Hàm tổng hợp và GROUP BY
Khi cần thống kê, dùng các hàm COUNT, SUM, AVG, MIN, MAX. SELECT AVG(diem) FROM sinhvien; trả về điểm trung bình toàn bảng.
GROUP BY tính theo nhóm. SELECT lop, AVG(diem) FROM sinhvien GROUP BY lop; trả về điểm trung bình của từng lớp.
Muốn lọc nhóm sau khi tính, dùng HAVING chứ không phải WHERE. Ví dụ HAVING AVG(diem) > 7. WHERE lọc từng hàng trước khi gom nhóm, còn HAVING lọc các nhóm sau khi đã tính.
JOIN: ghép dữ liệu từ nhiều bảng
Giả sử có thêm bảng “lop” gồm id và ten_lop, còn sinhvien có cột lop_id trỏ tới đó. Muốn hiện tên sinh viên cùng tên lớp, dùng INNER JOIN: SELECT sinhvien.ten, lop.ten_lop FROM sinhvien INNER JOIN lop ON sinhvien.lop_id = lop.id;
INNER JOIN chỉ giữ những hàng có cặp khớp ở cả hai bảng. LEFT JOIN giữ mọi hàng của bảng bên trái, kể cả khi bảng bên phải không có hàng tương ứng. Phần thiếu sẽ là NULL.
Dùng SQL trong ứng dụng thật
Khi đưa các lệnh trên vào mã PHP, đừng nối chuỗi trực tiếp từ dữ liệu người dùng. Hãy dùng câu lệnh chuẩn bị sẵn, như đã trình bày ở bài kết nối PHP với MySQL bằng PDO. Nếu cần bức tranh tổng thể về thứ tự học, đọc lộ trình học PHP và MySQL.
Để luyện thêm với bài tập tương tác ngay trên trình duyệt, thử phần SQL của W3Schools. Tra cứu cú pháp chính xác ở tài liệu MySQL.
Việc nhỏ để bạn tự làm
Hãy tạo bảng sinhvien ở trên, thêm mười hàng với vài lớp khác nhau. Viết lần lượt các truy vấn: lấy ba sinh viên điểm cao nhất, tính điểm trung bình mỗi lớp, rồi sửa điểm một sinh viên và xoá một sinh viên. Với mỗi lệnh sửa hoặc xoá, chạy SELECT cùng điều kiện trước. Thói quen nhỏ này giúp bạn tránh những sai lầm tốn kém sau này.


