Từ sheet sang bảng
Bạn sẽ học được
- Ánh xạ sheet và Table trong Excel sang bảng trong database.
- Vì sao kiểu dữ liệu quan trọng hơn định dạng ô.
- Cách thêm, sửa, xoá dữ liệu bằng
INSERT,UPDATE,DELETE. - Vai trò của khóa chính và khóa ngoại.
- Quy trình nhập dữ liệu an toàn từ file Excel.
Khái niệm cốt lõi
Một sheet Excel giống một bảng: dòng là bản ghi, cột là trường. Nhưng có ba khác biệt quyết định:
| Excel | Database |
|---|---|
| Mỗi ô có thể chứa bất kỳ kiểu gì | Mỗi cột có một kiểu cố định |
| Không bắt buộc khóa duy nhất | Khóa chính bắt buộc duy nhất |
| Công thức tính lại trong file | Giá trị lưu tĩnh, tính khi truy vấn |
| Nhiều bản sao file | Một nguồn dữ liệu dùng chung |
Vì vậy bước đầu tiên khi chuyển Excel sang SQL không phải viết SELECT, mà là thiết kế bảng: cột nào, kiểu gì, khóa nào.
Thiết kế bảng từ một sheet
Sheet DonHang có các cột: Mã đơn, Ngày, Mã khách, Tên khách, Thành phố, Số lượng, Đơn giá, Thành tiền.
Cách chuyển đúng là tách thành các bảng chuẩn hoá:
CREATE TABLE customers (
id integer PRIMARY KEY,
name text NOT NULL,
city text NOT NULL
);
CREATE TABLE orders (
id integer PRIMARY KEY,
customer_id integer NOT NULL REFERENCES customers(id),
order_date date NOT NULL,
status text NOT NULL
);
CREATE TABLE order_items (
id integer PRIMARY KEY,
order_id integer NOT NULL REFERENCES orders(id),
product_id integer NOT NULL REFERENCES products(id),
quantity integer NOT NULL,
unit_price numeric(12, 2) NOT NULL
);Tên khách và thành phố không lặp trong orders; chúng nằm ở customers và được nối bằng customer_id. thanh_tien không lưu vì tính được từ quantity * unit_price — lưu giá trị dẫn xuất dễ lệch khi dữ liệu nguồn đổi.
Trong Excel, việc tách bảng trông như làm phức tạp. Lợi ích xuất hiện khi có 10.000 đơn: sửa tên một khách chỉ cần một dòng, không phải 200 dòng.
Kiểu dữ liệu
| Dữ liệu Excel | Kiểu SQL | Ghi chú |
|---|---|---|
| Số nguyên | integer | Số lượng, mã |
| Tiền, số thực | numeric(12,2) | Tránh float cho tiền |
| Ngày | date | Không lưu ngày dạng chuỗi |
| Thời điểm | timestamptz | Kèm múi giờ |
| Chuỗi ngắn | text hoặc varchar(n) | text linh hoạt hơn |
| Đúng/Sai | boolean | Không dùng "Có"/"Không" |
| Danh mục cố định | text + CHECK hoặc bảng tra cứu | Tránh gõ sai |
Định dạng ô ($, %, màu) không tồn tại trong database. Số tiền lưu numeric, hiển thị định dạng ở tầng báo cáo.
Thêm dữ liệu
Một dòng:
INSERT INTO customers (id, name, city)
VALUES (13, 'Phúc Trần', 'Huế');Nhiều dòng:
INSERT INTO customers (id, name, city) VALUES
(13, 'Phúc Trần', 'Huế'),
(14, 'Quỳnh Mai', 'Hà Nội');Nếu vi phạm khóa chính, cả câu lệnh lỗi và không dòng nào được thêm (trong một transaction). Đây là khác biệt với Excel: database bảo vệ tính duy nhất thay vì âm thầm cho phép trùng.
Thêm từ kết quả truy vấn:
INSERT INTO customers_archive (id, name, city)
SELECT id, name, city FROM customers WHERE city = 'Huế';Sửa dữ liệu
UPDATE customers
SET city = 'Thừa Thiên Huế'
WHERE id = 13;Luôn có WHERE. Thiếu WHERE sẽ sửa toàn bộ bảng. Thói quen an toàn: chạy SELECT với cùng điều kiện trước, đếm số dòng, rồi mới đổi thành UPDATE.
Sửa nhiều cột:
UPDATE orders
SET status = 'cancelled'
WHERE status = 'pending'
AND order_date < DATE '2025-01-01';Xoá dữ liệu
DELETE FROM order_items WHERE order_id = 10;Tương tự, luôn kiểm tra bằng SELECT trước. Nếu bảng có khóa ngoại tham chiếu, xoá cha sẽ lỗi hoặc cascade tuỳ thiết kế — kiểm tra ON DELETE trước khi xoá hàng loạt.
Trong phân tích, hiếm khi cần DELETE; dữ liệu sai thường được đánh dấu (soft delete) thay vì xoá, để giữ lịch sử.
Nhập từ Excel an toàn
Quy trình năm bước:
- Xuất CSV thay vì dán trực tiếp; giữ nguyên header.
- Kiểm tra kiểu: ngày có đúng
YYYY-MM-DD? số có dấu phẩy hàng nghìn? - Kiểm tra khóa: mã đơn có trùng không?
- Nhập vào bảng tạm (
staging), chưa vào bảng chính. - Kiểm tra và chuyển bằng
INSERT ... SELECTvới điều kiện hợp lệ.
Bảng tạm cho phép đếm lỗi trước khi dữ liệu bẩn lan vào báo cáo:
SELECT COUNT(*) AS tong,
COUNT(*) FILTER (WHERE id IS NULL) AS thieu_id,
COUNT(*) FILTER (WHERE order_date IS NULL) AS thieu_ngay
FROM staging_orders;Thực hành
- Thiết kế ba bảng từ một sheet đơn hàng phẳng.
- Chọn kiểu dữ liệu cho tiền, ngày, trạng thái.
INSERThai khách mới, thử trùng khóa chính để thấy lỗi.UPDATEthành phố của một khách, chạySELECTkiểm tra trước.DELETEmột dòng hàng, kiểm tra khóa ngoại.- Viết truy vấn đếm dòng lỗi trong bảng tạm.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Sửa nhầm cả bảng | UPDATE/DELETE thiếu WHERE | Luôn SELECT cùng điều kiện trước |
| Ngày sai thứ tự | Lưu ngày dạng chuỗi | Dùng date, nhập YYYY-MM-DD |
| Tiền lệch vài đồng | Dùng float | Dùng numeric |
| Không thêm được dòng | Trùng khóa chính | Kiểm tra mã trước khi nhập |
| Xoá lỗi khóa ngoại | Dòng con còn tham chiếu | Xoá con trước hoặc dùng cascade có chủ đích |
| Báo cáo lệch sau khi nhập lại | Nhập trùng file | Dùng khóa duy nhất, ON CONFLICT |
| Trạng thái gõ sai | Không ràng buộc giá trị | CHECK hoặc bảng tra cứu |
Tóm tắt
- Sheet → bảng; cột → trường có kiểu cố định.
- Tách bảng theo thực thể, nối bằng khóa ngoại.
- Tiền dùng
numeric, ngày dùngdate, không lưu chuỗi. UPDATE/DELETEphải cóWHEREvà kiểm tra trước.- Nhập Excel qua bảng tạm, kiểm tra lỗi rồi mới chuyển.
Dùng ← → để chuyển bài