Thao tác cơ bản với CSDL: Tạo, Đọc, Sửa, Xóa

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);

  1. 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.


  1. 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;

  1. 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ùng SELECT để kiểm tra điều kiện.


  1. Xóa dữ liệu: DELETE

Xóa bản ghi khỏi bảng. Có hai cách: DELETETRUNCATE.

Đặ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
Gọi trigger? 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;

  1. 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:

  1. Thêm phòng ban mới: "Hỗ trợ kỹ thuật" tại "Hải Phòng"
  2. Chèn 3 nhân viên mới vào phòng này
  3. Tìm phòng ban có ít nhân viên nhất, tăng lương cho họ lên 5%
  4. Xóa những nhân viên có lương dưới 5000 và thuộc phòng nhân sự
  5. 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

Thẻ: mysql sql Database INSERT SELECT

Đăng vào ngày 25 tháng 8 lúc 16:34