Bài 4: Thêm, Sửa, Xoá Dữ Liệu (INSERT, UPDATE, DELETE)
Giai đoạn 1 – Nhập Môn · Mục tiêu: Thành thạo thao tác thêm dữ liệu mới, cập nhật dữ liệu đã có và xoá dữ liệu khỏi bảng.
1. Thêm dữ liệu – INSERT INTO
Cú pháp 1: Chỉ định cột
INSERT INTO ten_bang (cot1, cot2, cot3)
VALUES (gia_tri_1, gia_tri_2, gia_tri_3);
Cú pháp 2: Không chỉ định cột (phải đủ tất cả cột theo thứ tự)
INSERT INTO ten_bang
VALUES (gia_tri_1, gia_tri_2, gia_tri_3, ...);
Ví dụ
-- Cách 1: Chỉ định cột (khuyến nghị)
INSERT INTO KhachHang (HoTen, DienThoai, Email, DiaChi)
VALUES ('Nguyễn Văn An', '0901234567', 'an@gmail.com', '123 Nguyễn Huệ, TP.HCM');
-- Cách 2: Không chỉ định cột (MaKH tự tăng → ghi NULL)
INSERT INTO KhachHang
VALUES (NULL, 'Trần Thị Bình', '0912345678', 'binh@gmail.com', '456 Lê Lợi', CURDATE());
:::tip Luôn chỉ định tên cột Cách 1 an toàn hơn vì:
- Không phụ thuộc thứ tự cột trong bảng.
- Tự động bỏ qua cột có
DEFAULThoặcAUTO_INCREMENT. - Code dễ đọc, dễ bảo trì hơn. :::
Thêm nhiều dòng cùng lúc
INSERT INTO SanPham (TenSP, DanhMuc, Gia, SoLuongTon) VALUES
('iPhone 15 Pro', 'Điện thoại', 28990000, 50),
('Samsung Galaxy S24', 'Điện thoại', 22990000, 45),
('MacBook Air M3', 'Laptop', 27490000, 30),
('iPad Air', 'Máy tính bảng', 16990000, 25),
('AirPods Pro 2', 'Phụ kiện', 5990000, 100);
2. Cập nhật dữ liệu – UPDATE
Cú pháp
UPDATE ten_bang
SET cot1 = gia_tri_moi, cot2 = gia_tri_moi
WHERE dieu_kien;
Ví dụ
-- Cập nhật 1 cột cho 1 bản ghi
UPDATE KhachHang
SET DienThoai = '0987654321'
WHERE MaKH = 1;
-- Cập nhật nhiều cột cùng lúc
UPDATE SanPham
SET Gia = 25990000, SoLuongTon = 60
WHERE MaSP = 1;
-- Giảm giá 10% cho tất cả điện thoại
UPDATE SanPham
SET Gia = Gia * 0.9
WHERE DanhMuc = 'Điện thoại';
-- Tăng số lượng tồn thêm 20 cho sản phẩm có tồn kho < 30
UPDATE SanPham
SET SoLuongTon = SoLuongTon + 20
WHERE SoLuongTon < 30;
:::danger LUÔN có WHERE trong UPDATE
-- NGUY HIỂM: Sẽ cập nhật TẤT CẢ dòng trong bảng!
UPDATE SanPham SET Gia = 0;
-- AN TOÀN: Chỉ cập nhật sản phẩm cụ thể
UPDATE SanPham SET Gia = 0 WHERE MaSP = 99;
Quên WHERE sẽ cập nhật toàn bộ bảng → thảm hoạ!
:::
3. Xoá dữ liệu – DELETE
Cú pháp
DELETE FROM ten_bang
WHERE dieu_kien;
Ví dụ
-- Xoá 1 khách hàng cụ thể
DELETE FROM KhachHang WHERE MaKH = 5;
-- Xoá tất cả đơn hàng đã huỷ
DELETE FROM DonHang WHERE TrangThai = 'Đã huỷ';
-- Xoá sản phẩm hết hàng
DELETE FROM SanPham WHERE SoLuongTon = 0;
:::danger LUÔN có WHERE trong DELETE
-- NGUY HIỂM: Xoá TẤT CẢ dữ liệu!
DELETE FROM KhachHang;
-- AN TOÀN: Chỉ xoá dòng cụ thể
DELETE FROM KhachHang WHERE MaKH = 5;
:::
4. So sánh DELETE, TRUNCATE và DROP
DELETE FROM | TRUNCATE TABLE | DROP TABLE | |
|---|---|---|---|
| Xoá dữ liệu | (có thể chọn lọc) | (toàn bộ) | (toàn bộ) |
| Xoá cấu trúc bảng | |||
| Dùng WHERE | |||
| Reset AUTO_INCREMENT | — | ||
| Có thể ROLLBACK | |||
| Tốc độ (dữ liệu lớn) | Chậm | Nhanh | Nhanh |
5. Ví dụ tổng hợp: Quản lý Cửa hàng
-- === BƯỚC 1: Tạo CSDL và bảng ===
CREATE DATABASE IF NOT EXISTS CuaHangVi;
USE CuaHangVi;
CREATE TABLE NhanVien (
MaNV INT AUTO_INCREMENT PRIMARY KEY,
HoTen VARCHAR(100) NOT NULL,
ChucVu ENUM('Nhân viên', 'Trưởng nhóm', 'Quản lý') DEFAULT 'Nhân viên',
Luong DECIMAL(12, 2) NOT NULL CHECK (Luong > 0),
NgayVaoLam DATE DEFAULT (CURRENT_DATE)
);
-- === BƯỚC 2: Thêm dữ liệu ===
INSERT INTO NhanVien (HoTen, ChucVu, Luong, NgayVaoLam) VALUES
('Nguyễn Văn An', 'Quản lý', 25000000, '2020-01-15'),
('Trần Thị Bình', 'Trưởng nhóm', 18000000, '2021-06-01'),
('Lê Minh Châu', 'Nhân viên', 12000000, '2022-03-10'),
('Phạm Đức Dũng', 'Nhân viên', 11000000, '2023-01-20'),
('Hoàng Thị Em', 'Nhân viên', 10500000, '2023-09-01');
-- === BƯỚC 3: Cập nhật dữ liệu ===
-- Tăng lương 10% cho tất cả nhân viên
UPDATE NhanVien SET Luong = Luong * 1.1;
-- Thăng chức cho Lê Minh Châu
UPDATE NhanVien SET ChucVu = 'Trưởng nhóm' WHERE MaNV = 3;
-- === BƯỚC 4: Xoá dữ liệu ===
-- Xoá nhân viên đã nghỉ (giả sử MaNV = 5)
DELETE FROM NhanVien WHERE MaNV = 5;
6. Mẹo thực tế
Kiểm tra trước khi UPDATE/DELETE
Luôn chạy SELECT trước để xem sẽ ảnh hưởng đến bao nhiêu dòng:
-- Bước 1: Kiểm tra xem có bao nhiêu dòng sẽ bị ảnh hưởng
SELECT * FROM SanPham WHERE SoLuongTon = 0;
-- Bước 2: Nếu đúng, mới thực hiện DELETE
DELETE FROM SanPham WHERE SoLuongTon = 0;
INSERT với SELECT (Sao chép dữ liệu)
-- Sao chép sản phẩm có giá > 20 triệu sang bảng SanPhamCao
INSERT INTO SanPhamCao (TenSP, Gia)
SELECT TenSP, Gia FROM SanPham WHERE Gia > 20000000;
REPLACE – Thêm hoặc cập nhật
-- Nếu MaSP đã tồn tại → cập nhật, chưa có → thêm mới
REPLACE INTO SanPham (MaSP, TenSP, Gia, SoLuongTon)
VALUES (1, 'iPhone 15 Pro Max', 33990000, 40);
Bài tập thực hành
Bài 1: Thêm dữ liệu
Sử dụng CSDL QuanLyThuVien đã tạo ở Bài 3:
- Thêm 5 độc giả vào bảng DocGia.
- Thêm 8 cuốn sách vào bảng Sach (đa dạng thể loại).
- Thêm 3 phiếu mượn sách vào bảng MuonSach.
Bài 2: Cập nhật dữ liệu
- Cập nhật số lượng sách (tăng thêm 5) cho tất cả sách thể loại "Văn học".
- Cập nhật trạng thái "Đã trả" cho phiếu mượn có MaMuon = 1, đồng thời cập nhật NgayTra = ngày hiện tại.
- Sửa số điện thoại của độc giả có MaDG = 2.
Bài 3: Xoá dữ liệu
- Xoá tất cả phiếu mượn đã trả.
- Xoá sách có số lượng = 0.
- Thử chạy
DELETE FROM DocGia WHERE MaDG = 1;khi độc giả này còn phiếu mượn → Quan sát lỗi FOREIGN KEY.
Bài 4: Bài toán tổng hợp
Cho bảng NhanVien với các cột: MaNV, HoTen, PhongBan, Luong, NgayVaoLam:
- Thêm 10 nhân viên thuộc 3 phòng ban khác nhau.
- Tăng lương 15% cho nhân viên phòng "Kinh doanh".
- Xoá nhân viên có lương < 5,000,000.
- Cập nhật phòng ban từ "Hành chính" thành "Nhân sự" cho tất cả nhân viên liên quan.
Quay lại: Roadmap · Bài tiếp: Bài 5 – Truy Vấn Cơ Bản