Khái niệm CRUD trong quản lý cơ sở dữ liệu
CRUD là tập hợp bốn thao tác cốt lõi trong hệ thống quản lý cơ sở dữ liệu, đại diện cho các hành động chính khi làm việc với dữ liệu:
- C (Create) – Tạo mới dữ liệu: thêm bản ghi vào bảng.
- R (Read) – Đọc dữ liệu: truy xuất thông tin từ bảng.
- U (Update) – Cập nhật dữ liệu: chỉnh sửa giá trị của bản ghi đã tồn tại.
- D (Delete) – Xóa dữ liệu: loại bỏ bản ghi không còn cần thiết.
Mỗi thao tác đều có quy tắc kỹ thuật riêng, đặc biệt là ở mức độ an toàn và hiệu suất. Bài viết này đi sâu vào từng phần, kèm theo ví dụ thực tế trên MySQL, sử dụng hai bảng mẫu: department (phòng ban) và employee (nhân viên), giúp người học nắm vững từ lý thuyết đến ứng dụng thực tiễn.
Chuẩn bị môi trường thử nghiệm
Trước khi bắt đầu, hãy tạo hai bảng và nhập dữ liệu mẫu như sau:
-- Tạo bảng phòng ban
CREATE TABLE department (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Mã phòng ban',
name VARCHAR(50) NOT NULL COMMENT 'Tên phòng ban',
location VARCHAR(100) COMMENT 'Địa điểm'
) COMMENT 'Bảng lưu thông tin phòng ban';
-- Tạo bảng nhân viên
CREATE TABLE employee (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT 'Mã nhân viên',
full_name VARCHAR(50) NOT NULL COMMENT 'Họ tên',
gender CHAR(1) DEFAULT 'M' COMMENT 'Giới tính (M/N)',
salary DECIMAL(10,2) NOT NULL COMMENT 'Lương',
hire_date DATE NOT NULL COMMENT 'Ngày vào làm',
dept_id INT COMMENT 'Mã phòng ban liên kết',
FOREIGN KEY (dept_id) REFERENCES department(id) ON DELETE SET NULL
) COMMENT 'Bảng nhân viên';
Chèn dữ liệu mẫu:
INSERT INTO department (name, location) VALUES
('Phát triển', 'Hà Nội'),
('Marketing', 'TP.HCM'),
('Nhân sự', 'Đà Nẵng');
INSERT INTO employee (full_name, gender, salary, hire_date, dept_id) VALUES
('Trần Văn A', 'M', 8500.00, '2023-01-10', 1),
('Lê Thị B', 'F', 6800.00, '2023-02-15', 1),
('Phạm Văn C', 'M', 7200.00, '2023-03-20', 2),
('Ngô Thị D', 'F', 9100.00, '2022-12-05', 2),
('Vũ Văn E', 'M', 5400.00, '2023-06-01', 3),
('Hoàng Thị F', 'F', 11000.00, '2021-08-20', NULL);
- Thêm dữ liệu: INSERT
Sử dụng để chèn một hoặc nhiều bản ghi mới vào bảng.
Cú pháp cơ bản:
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...);
Ví dụ: Chèn một nhân viên mới
INSERT INTO employee (full_name, gender, salary, hire_date, dept_id)
VALUES ('Đặng Văn G', 'M', 7600.00, '2023-07-05', 1);
Chèn nhiều bản ghi cùng lúc:
INSERT INTO employee (full_name, gender, salary, hire_date, dept_id)
VALUES
('Nguyễn Thị H', 'F', 6900.00, '2023-08-10', 2),
('Bùi Văn I', 'M', 8300.00, '2023-09-01', 1);
⚠️ Lưu ý: Nếu cột có
AUTO_INCREMENT, không cần khai báo giá trị thủ công. Nếu cóDEFAULT, có thể bỏ qua.
- Truy vấn dữ liệu: SELECT
Là thao tác phổ biến nhất, dùng để lấy ra dữ liệu theo yêu cầu.
Cấu trúc đầy đủ:
SELECT [DISTINCT] col1 AS alias1, col2 ...
FROM table1 t1
[JOIN table2 t2 ON condition]
[WHERE filter]
[GROUP BY group_col]
[HAVING group_filter]
[ORDER BY sort_col ASC/DESC]
[LIMIT offset, count];
Thứ tự thực thi quan trọng: FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
Ví dụ: Lấy danh sách nhân viên có lương > 7000
SELECT full_name AS 'Tên', salary AS 'Lương'
FROM employee
WHERE salary > 7000
ORDER BY salary DESC;
Ví dụ: Nhóm theo phòng ban và đếm số lượng
SELECT d.name AS 'Phòng ban', COUNT(e.id) AS 'Số nhân viên'
FROM department d
LEFT JOIN employee e ON d.id = e.dept_id
GROUP BY d.id
HAVING COUNT(e.id) >= 2
ORDER BY 'Số nhân viên' DESC;
- Cập nhật dữ liệu: UPDATE
Chỉnh sửa dữ liệu hiện có. Không được bỏ qua điều kiện WHERE vì nếu không sẽ cập nhật tất cả bản ghi!
Ví dụ: Tăng lương 10% cho nhóm phát triển
UPDATE employee
SET salary = salary * 1.1
WHERE dept_id = 1;
Ví dụ: Cập nhật nhiều trường cùng lúc
UPDATE employee
SET salary = 8000, dept_id = 2
WHERE full_name = 'Trần Văn A';
✅ Mẹo: Trước khi chạy
UPDATE, hãy thử dùngSELECTđể kiểm tra điều kiện.
- Xóa dữ liệu: DELETE
Xóa bản ghi khỏi bảng. Có hai cách: DELETE và TRUNCATE.
| Đặc điểm | DELETE | TRUNCATE |
|---|---|---|
| Loại lệnh | DML | DDL |
| Có thể rollback? | Có (nếu dùng transaction) | Không |
| Reset ID tự tăng? | Không | Có |
| Gọi trigger? | Có | Không |
| Dùng khi nào? | Xóa một vài bản ghi | Xóa toàn bộ bảng |
Ví dụ: Xóa nhân viên chưa phân phòng
DELETE FROM employee
WHERE dept_id IS NULL;
Ví dụ: Xóa toàn bộ bảng (cẩn trọng!)
TRUNCATE TABLE employee;
- Trường hợp thực tế: Quản lý nhân sự
Giả sử cần xử lý các thao tác sau:
- Thêm phòng ban mới: "Hỗ trợ kỹ thuật" tại "Hải Phòng"
- Chèn 3 nhân viên mới vào phòng này
- Tìm phòng ban có ít nhân viên nhất, tăng lương cho họ lên 5%
- Xóa những nhân viên có lương dưới 5000 và thuộc phòng nhân sự
- Hiển thị danh sách cuối cùng theo tên phòng ban
SQL thực thi:
-- 1. Thêm phòng ban
INSERT INTO department (name, location) VALUES ('Hỗ trợ kỹ thuật', 'Hải Phòng');
-- 2. Chèn nhân viên mới
INSERT INTO employee (full_name, gender, salary, hire_date, dept_id)
VALUES
('Đỗ Văn K', 'M', 6500.00, '2023-10-01', 4),
('Tô Thị L', 'F', 6200.00, '2023-10-05', 4),
('Phan Văn M', 'M', 7000.00, '2023-10-10', 4);
-- 3. Tăng lương cho phòng có ít nhân viên nhất
UPDATE employee e
JOIN (
SELECT dept_id FROM employee
GROUP BY dept_id
ORDER BY COUNT(*) ASC
LIMIT 1
) low_dept ON e.dept_id = low_dept.dept_id
SET e.salary = e.salary * 1.05;
-- 4. Xóa nhân viên nhân sự lương thấp
DELETE FROM employee
WHERE dept_id = 3 AND salary < 5000;
-- 5. Truy vấn cuối cùng
SELECT e.full_name AS 'Họ tên', e.salary AS 'Lương', d.name AS 'Phòng ban'
FROM employee e
LEFT JOIN department d ON e.dept_id = d.id
ORDER BY d.name ASC;
Tóm tắt nhanh
| Thao tác | Từ khóa | Lưu ý quan trọng |
|---|---|---|
| Thêm | INSERT |
Kiểm tra ràng buộc không rỗng, kiểu dữ liệu |
| Truy vấn | SELECT |
Thứ tự thực thi, phân biệt WHERE & HAVING |
| Cập nhật | UPDATE |
Luôn dùng WHERE, kiểm tra trước khi thay đổi |
| Xóa | DELETE / TRUNCATE |
DELETE có thể hoàn tác, TRUNCATE xóa sạch |