Dành cho bạn mới bắt đầu học SQL hoặc đang luyện tập thao tác với cơ sở dữ liệu, bài viết này sẽ giúp bạn hệ thống lại kiến thức với các ví dụ cụ thể và dễ hiểu.

1. Tạo Database (CREATE DATABASE)

Tạo database quan_ly_nhan_su

CREATE DATABASE quan_ly_nhan_su;
use quan_ly_nhan_su

2. Tạo Bảng (CREATE TABLE)

Tạo bảng nhan_vien

CREATE TABLE nhan_vien (
  ma INT AUTO_INCREMENT,
  ten VARCHAR(50),
  PRIMARY KEY(ma)
);

3. Thêm Dữ Liệu (INSERT INTO)

TH1: Ghi đầy đủ cả tên cột (bao gồm cả AUTO_INCREMENT)

INSERT INTO nhan_vien (ma, ten) VALUES (1, 'abc');

TH2: Chỉ truyền cột không tự tăng (phổ biến nhất)

INSERT INTO nhan_vien (ten) VALUES ('abc');

TH3: Không ghi tên cột, truyền đầy đủ giá trị

INSERT INTO nhan_vien VALUES (2, 'abc');

4. Truy Vấn Dữ Liệu (SELECT)

Lấy toàn bộ dữ liệu:

SELECT * FROM nhan_vien;

Lấy riêng cột ten:

SELECT ten FROM nhan_vien;

5. Cập Nhật Dữ Liệu (UPDATE)

UPDATE nhan_vien
SET ten = 'xyz'
WHERE ma = 1;

6. ❌ Xoá Dữ Liệu (DELETE)

DELETE FROM nhan_vien
WHERE ma = 2;

7. Thay Đổi Cấu Trúc Bảng (ALTER TABLE)

Đổi kiểu dữ liệu của cột ten từ varchar sang int:

ALTER TABLE nhan_vien
MODIFY COLUMN ten INT;

Xoá cột ten:

ALTER TABLE nhan_vien
DROP COLUMN ten;

Thêm cột tuoi:

ALTER TABLE nhan_vien
ADD COLUMN tuoi INT;

8. Khoá Chính & Khoá Ngoại

Tạo bảng lop:

CREATE TABLE `lop` (
  ma INT AUTO_INCREMENT,
  ten VARCHAR(50),
  PRIMARY KEY (ma)
);

Tạo bảng sinh_vien có khoá ngoại tới lop:

CREATE TABLE sinh_vien (
  ma INT AUTO_INCREMENT,
  ten VARCHAR(50),
  ma_lop INT,
  FOREIGN KEY (ma_lop) REFERENCES lop(ma),
  PRIMARY KEY (ma)
);

Tạo bảng diem với khoá chính gồm 2 cột:

CREATE TABLE diem (
  ma_sinh_vien INT,
  ma_mon_hoc INT,
  diem FLOAT,
  FOREIGN KEY (ma_sinh_vien) REFERENCES sinh_vien(ma),
  FOREIGN KEY (ma_mon_hoc) REFERENCES mon_hoc(ma),
  PRIMARY KEY (ma_sinh_vien, ma_mon_hoc)
);

9. JOIN – Nối Bảng

Lấy tất cả điểm của sinh viên:

SELECT sinh_vien.ten, mon_hoc.ten, diem
FROM diem
INNER JOIN sinh_vien ON diem.ma_sinh_vien = sinh_vien.ma
INNER JOIN mon_hoc ON diem.ma_mon_hoc = mon_hoc.ma;

Lấy điểm của tất cả sinh viên (kể cả chưa có điểm):

SELECT sinh_vien.ten, mon_hoc.ten, diem
FROM sinh_vien
LEFT JOIN diem ON sinh_vien.ma = diem.ma_sinh_vien
LEFT JOIN mon_hoc ON diem.ma_mon_hoc = mon_hoc.ma;

Lấy điểm của tất cả môn (kể cả môn chưa có sinh viên học):

SELECT mon_hoc.ten, sinh_vien.ten, diem
FROM mon_hoc
LEFT JOIN diem ON mon_hoc.ma = diem.ma_mon_hoc
LEFT JOIN sinh_vien ON sinh_vien.ma = diem.ma_sinh_vien;

10. Sắp Xếp Dữ Liệu (ORDER BY)

Tăng dần theo tên sinh viên:

SELECT ma, ten
FROM sinh_vien
ORDER BY ten ASC;

Giảm dần theo tên sinh viên:

SELECT ma, ten
FROM sinh_vien
ORDER BY ten DESC;

11. Lọc Dữ Liệu (WHERE)

Mã sinh viên > 1:

SELECT ma, ten
FROM sinh_vien
WHERE ma > 1;

Mã sinh viên trong khoảng 5 đến 10:

SELECT ma, ten
FROM sinh_vien
WHERE ma BETWEEN 5 AND 10;

Mã sinh viên thuộc danh sách cụ thể:

SELECT ma, ten
FROM sinh_vien
WHERE ma IN (1, 2, 3, 4);

12. Giới Hạn Bản Ghi (LIMIT, OFFSET)

Lấy 5 bản ghi đầu tiên:

SELECT * FROM sinh_vien
LIMIT 5;

Bỏ qua 5 bản ghi đầu:

SELECT * FROM sinh_vien
OFFSET 5;

Kết hợp LIMIT + OFFSET (bắt đầu từ bản ghi thứ 3, lấy 2 bản ghi):

SELECT * FROM sinh_vien
LIMIT 2 OFFSET 2;

Hoặc viết tắt:

SELECT * FROM sinh_vien
LIMIT 2, 2;  -- Lấy 2 bản ghi sau khi bỏ qua 2 dòng đầu

13. Thống Kê & Nhóm Dữ Liệu (GROUP BY)

Đếm số sinh viên theo lớp:

SELECT ma_lop, lop.ten, COUNT(*) AS 'số sinh viên'
FROM sinh_vien
JOIN lop ON sinh_vien.ma_lop = lop.ma
GROUP BY ma_lop, lop.ten;

🧠 Lưu ý: Nếu SELECT có cột không nằm trong hàm tổng hợp (như COUNT) thì phải GROUP BY theo cột đó.

🎯 Tổng Kết

Bạn vừa đi qua gần như tất cả các câu lệnh SQL cơ bản và thường dùng nhất, từ tạo bảng, thêm dữ liệu, truy vấn, đến xử lý dữ liệu nâng cao như JOIN, GROUP BY,…

Đừng chỉ đọc! Hãy mở thử một trình quản lý CSDL (như MySQL, PostgreSQL, SQLite, hoặc dùng** https://sqlfiddle.com **) và bắt tay thực hành để nhớ lâu nhé! 💪