DHDataHọc
TheoryLesson 6/85 min read+10 XP

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:

ExcelDatabase
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ấtKhóa chính bắt buộc duy nhất
Công thức tính lại trong fileGiá trị lưu tĩnh, tính khi truy vấn
Nhiều bản sao fileMộ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á:

code
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 ExcelKiểu SQLGhi chú
Số nguyênintegerSố lượng, mã
Tiền, số thựcnumeric(12,2)Tránh float cho tiền
NgàydateKhông lưu ngày dạng chuỗi
Thời điểmtimestamptzKèm múi giờ
Chuỗi ngắntext hoặc varchar(n)text linh hoạt hơn
Đúng/SaibooleanKhông dùng "Có"/"Không"
Danh mục cố địnhtext + CHECK hoặc bảng tra cứuTrá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:

code
INSERT INTO customers (id, name, city)
VALUES (13, 'Phúc Trần', 'Huế');

Nhiều dòng:

code
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:

code
INSERT INTO customers_archive (id, name, city)
SELECT id, name, city FROM customers WHERE city = 'Huế';

Sửa dữ liệu

code
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:

code
UPDATE orders
SET status = 'cancelled'
WHERE status = 'pending'
  AND order_date < DATE '2025-01-01';

Xoá dữ liệu

code
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:

  1. Xuất CSV thay vì dán trực tiếp; giữ nguyên header.
  2. Kiểm tra kiểu: ngày có đúng YYYY-MM-DD? số có dấu phẩy hàng nghìn?
  3. Kiểm tra khóa: mã đơn có trùng không?
  4. Nhập vào bảng tạm (staging), chưa vào bảng chính.
  5. Kiểm tra và chuyển bằng INSERT ... SELECT vớ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:

code
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

  1. Thiết kế ba bảng từ một sheet đơn hàng phẳng.
  2. Chọn kiểu dữ liệu cho tiền, ngày, trạng thái.
  3. INSERT hai khách mới, thử trùng khóa chính để thấy lỗi.
  4. UPDATE thành phố của một khách, chạy SELECT kiểm tra trước.
  5. DELETE một dòng hàng, kiểm tra khóa ngoại.
  6. Viết truy vấn đếm dòng lỗi trong bảng tạm.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Sửa nhầm cả bảngUPDATE/DELETE thiếu WHERELuôn SELECT cùng điều kiện trước
Ngày sai thứ tựLưu ngày dạng chuỗiDùng date, nhập YYYY-MM-DD
Tiền lệch vài đồngDùng floatDùng numeric
Không thêm được dòngTrùng khóa chínhKiểm tra mã trước khi nhập
Xoá lỗi khóa ngoạiDòng con còn tham chiếuXoá con trước hoặc dùng cascade có chủ đích
Báo cáo lệch sau khi nhập lạiNhập trùng fileDùng khóa duy nhất, ON CONFLICT
Trạng thái gõ saiKhô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ùng date, không lưu chuỗi.
  • UPDATE/DELETE phải có WHERE và kiểm tra trước.
  • Nhập Excel qua bảng tạm, kiểm tra lỗi rồi mới chuyển.

Use ← → to move between lessons