🔥 Truncate vs Delete trong SQL
🚀 Truncate:
WHERE🛠️ Delete:
WHERE, xoá có điều kiện💡 Mẹo nhớ:
👉 Dọn sạch bảng → dùng TRUNCATE
👉 Xoá có điều kiện → dùng DELETE
🔑 Primary Key vs 🔗 Foreign Key
🔑 Primary Key:
🔗 Foreign Key:
📘 Ví dụ:
students(id) → 🔑grades(student_id) → 🔗 tham chiếu students.id🔗 Các loại JOIN – Mối quan hệ êm đẹp giữa các bảng
📌 WHERE vs HAVING – Đừng nhầm nhé!
🔍 WHERE: Lọc từng dòng trước khi GROUP BY
🎯 HAVING: Lọc theo nhóm dữ liệu đã tổng hợp
🧪 Ví dụ:
```– WHERE: lọc trước
SELECT * FROM orders WHERE price > 100;
– HAVING: lọc nhóm
SELECT customer_id, COUNT()
FROM orders
GROUP BY customer_id
HAVING COUNT() > 5;```
⚙️ 🔍 Index – Tăng tốc truy vấn như tên lửa
✅ Ưu điểm:
WHERE, JOIN, ORDER BY⚠️ Nhược điểm:
🧠 Kinh nghiệm:
🔄 🔐 Transaction – Giao dịch không bao giờ sai nếu hiểu ACID
🔷 ACID là gì?
🧱 DDL là gì? (Data Definition Language)
CREATE, ALTER, DROP, TRUNCATE, v.v.📊 DML là gì? (Data Manipulation Language)
INSERT, UPDATE, DELETE, SELECT.🧨 Ví dụ lỗi khi trộn DDL + DML trong MySQL
START TRANSACTION; CREATE TABLE orders (id INT); -- ⚠️ Auto-commit ngay tại đây INSERT INTO orders VALUES (1); -- Giao dịch mới bắt đầu lại ROLLBACK;
Giải thích:
Lệnh CREATE TABLE đã được commit ngay khi chạy.
Nếu INSERT sau đó bị lỗi và bị rollback, thì bảng orders vẫn tồn tại → phá vỡ tính nguyên tử của giao dịch.
🧪 Thành phần | Giải thích dễ nhớ |
📥 📦 Tạo bảng không cần CREATE TABLE
👉 Cách 1: CREATE TABLE AS
CREATE TABLE active_users AS SELECT * FROM users WHERE status = 'active';
👉 Cách 2: VIEW
CREATE VIEW active_users AS SELECT * FROM users WHERE status = 'active';
** Làm thế nào để thay đổi kiểu dữ liệu của cột trong PostgreSQL ? **
Dùng lệnh ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE.
🔹 Ví dụ:
Giả sử bảng sinh_vien có cột tuoi kiểu VARCHAR, cần đổi sang INTEGER:
ALTER TABLE sinh_vien ALTER COLUMN tuoi SET DATA TYPE INTEGER;
13. Làm thế nào để tạo cơ sở dữ liệu trong PostgreSQL ?
Dùng lệnh CREATE DATABASE.
🔹 Ví dụ:
CREATE DATABASE quan_ly_sinh_vien;
** Có những kiểu bảng phân vùng nào trong PostgreSQL?**
PostgreSQL hỗ trợ 2 kiểu chính:
1️⃣ Phân vùng theo dải (Range Partitioning):
→ Dữ liệu chia theo khoảng giá trị.
🔹 Ví dụ:
sql
CREATE TABLE don_hang (
id SERIAL,
ngay DATE,
so_luong INT
) PARTITION BY RANGE (ngay);2️⃣ Phân vùng theo danh sách (List Partitioning):
→ Dữ liệu chia theo danh sách giá trị cụ thể.
🔹 Ví dụ:
CREATE TABLE khach_hang (
id SERIAL,
ten VARCHAR(100),
quoc_gia VARCHAR(50)
) PARTITION BY LIST (quoc_gia);** Sequence trong PostgreSQL là gì?**
🔄 Sequence là đối tượng tạo số tự động – thường dùng để sinh PRIMARY KEY.
🔹 Ví dụ:
```sql
CREATE SEQUENCE san_pham_seq START 1;
CREATE TABLE san_pham (
id INT DEFAULT nextval(‘san_pham_seq’),
ten VARCHAR(100)
);```
** WAL (Write-Ahead Logging) là gì?**
🧠 WAL là cơ chế ghi log trước khi ghi vào DB.
→ Dùng để phục hồi dữ liệu khi xảy ra sự cố.
🔹 Ví dụ:
Khi bạn INSERT dữ liệu vào khach_hang, PostgreSQL ghi vào WAL trước, rồi mới ghi xuống đĩa.
Các cấp độ Isolation trong Transaction (PostgreSQL)
1️⃣ Read Uncommitted – Mức thấp nhất
📌 Lý thuyết:
Transaction có thể đọc dữ liệu chưa được commit từ transaction khác → gây ra Dirty Read.
Không đảm bảo độ tin cậy. Hầu hết hệ quản trị không hỗ trợ mức này.
🧪 Ví dụ: Dirty Read
-- Transaction 1: Cập nhật dữ liệu nhưng chưa commit BEGIN; UPDATE khach_hang SET so_du = 10000 WHERE id = 1; -- Chưa COMMIT hoặc ROLLBACK -- Transaction 2: Đang ở mức READ UNCOMMITTED SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; BEGIN; SELECT so_du FROM khach_hang WHERE id = 1; -- Kết quả: 10000, dù T1 chưa commit COMMIT; -- Transaction 1 rollback ROLLBACK;
🔍 Giải thích:
T2 đọc dữ liệu T1 chưa commit. Sau đó T1 rollback → dữ liệu T2 vừa đọc bị mất → sai lệch
2️⃣ Read Committed – Mặc định của PostgreSQL
📌 Lý thuyết:
Chỉ cho phép đọc dữ liệu đã commit.
Tránh được Dirty Read, nhưng vẫn gặp Non-repeatable Read và Phantom Read.
🧪 Ví dụ: Non-repeatable Read
-- Transaction 1: Bắt đầu transaction BEGIN; SELECT so_du FROM khach_hang WHERE id = 1; -- Kết quả: 5000 -- Transaction 2: Update rồi commit BEGIN; UPDATE khach_hang SET so_du = 8000 WHERE id = 1; COMMIT; -- Transaction 1: Đọc lại SELECT so_du FROM khach_hang WHERE id = 1; -- Kết quả: 8000 COMMIT;
🔍 Giải thích:
T1 đọc cùng 1 bản ghi 2 lần → kết quả khác nhau → Non-repeatable Read
3️⃣ Repeatable Read – Ổn định giá trị đã đọc
📌 Lý thuyết:
Cùng 1 bản ghi đã đọc sẽ luôn trả về cùng 1 giá trị trong suốt transaction.
Tránh được Dirty Read và Non-repeatable Read, nhưng không tránh được Phantom Read.
🧪 Ví dụ A: Tránh Non-repeatable Read
-- Transaction 1: Cô lập lặp lại (Repeatable Read) BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; SELECT so_du FROM khach_hang WHERE id = 1; -- Kết quả: 5000 -- Transaction 2: Update rồi commit BEGIN; UPDATE khach_hang SET so_du = 7000 WHERE id = 1; COMMIT; -- Transaction 1: Đọc lại SELECT so_du FROM khach_hang WHERE id = 1; -- Kết quả: vẫn là 5000 (giá trị snapshot lúc bắt đầu transaction) COMMIT;
🔍 Giải thích:
T2 cập nhật nhưng T1 vẫn thấy dữ liệu cũ → ✅ ổn định đọc → tránh được Non-repeatable Read
🧪 Ví dụ B: Phantom Read
-- Transaction 1: Bắt đầu
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT * FROM khach_hang WHERE so_du > 4000;
-- Kết quả: 2 dòng
-- Transaction 2: Thêm bản ghi phù hợp điều kiện
BEGIN;
INSERT INTO khach_hang (ten, so_du) VALUES ('Phong', 6000);
COMMIT;
-- Transaction 1: Đọc lại
SELECT * FROM khach_hang WHERE so_du > 4000;
-- Kết quả: 3 dòng → có thêm khách hàng 'Phong'
COMMIT;🔍 Giải thích:
T2 thêm dòng mới thỏa điều kiện truy vấn → T1 truy vấn lại thấy dòng “ma” → Phantom Read
4️⃣ Serializable – Chặt chẽ nhất
📌 Lý thuyết:
Mô phỏng như các transaction chạy tuần tự, đảm bảo tránh hoàn toàn:
⛔ Đổi lại, cần nhiều khóa hơn, dễ bị chặn → hiệu suất chậm.
🧪 Ví dụ: Ngăn Phantom Read
-- Transaction 1
BEGIN ISOLATION LEVEL SERIALIZABLE;
SELECT * FROM khach_hang WHERE so_du > 5000;
-- Transaction 2
BEGIN;
INSERT INTO khach_hang (ten, so_du) VALUES ('Phong', 6000);
-- Gây lỗi hoặc bị chặn do xung đột phạm vi
COMMIT;
-- Transaction 1
SELECT * FROM khach_hang WHERE so_du > 5000;
-- Trả về: Không có dòng mới
COMMIT;🔍 Giải thích:
T2 bị chặn hoặc thất bại vì T1 đã “khóa phạm vi truy vấn” → ✅ không xảy ra Phantom Read
🎯 Ghi nhớ nhanh 4 mức Isolation
🔄 Phi chuẩn hóa dữ liệu (Data Denormalization) là gì?
Phi chuẩn hóa là quá trình gộp dữ liệu từ nhiều bảng chuẩn hóa thành một bảng duy nhất, hoặc thêm các trường dữ liệu cần thiết vào bảng đã chuẩn hóa để:
Hiểu đơn giản, ta chấp nhận lưu trữ dư thừa một phần để đổi lấy hiệu suất truy vấn nhanh hơn.
Phù hợp cho hệ thống thiên về đọc dữ liệu nhiều (read-heavy) như:
✅ Ưu điểm của phi chuẩn hóa
❌ Nhược điểm
🧪 Ví dụ minh họa
Thay vì chia dữ liệu thành 3 bảng riêng biệt: khach_hang, san_pham, don_hang, ta có một bảng phi chuẩn hóa như sau:
| id | ten_khach | dia_chi | san_pham | so_luong | |----|-----------|---------|-------------|----------| | 1 | Nam | Hà Nội | Laptop | 1 | | 2 | Huy | HCM | Điện thoại | 2 | | 3 | Nam | Hà Nội | Bàn phím | 1 |
Dễ thấy khách hàng “Nam” bị lặp lại → nhưng đổi lại, khi cần thống kê theo khách hàng, địa chỉ và sản phẩm, không cần JOIN thêm bảng nào.
📌 Khi nào nên dùng phi chuẩn hóa?
Một số ví dụ cụ thể:
🔍 So sánh Chuẩn hóa và Phi chuẩn hóa
Chuẩn hóa (Normalization):
Phi chuẩn hóa (Denormalization):
💡 Kinh nghiệm thực tế
Khoá trong SQL ?
🔑 1. Primary Key – Khóa chính
State_Code trong bảng US_States là Primary Key (e.g. TX, GA).🎯 2. Candidate Key – Khóa ứng viên
State_Code và State_Name đều là Candidate Key trong US_States.🧩 3. Superkey – Khóa siêu cấp
{State_Code, Region} vẫn xác định duy nhất → là Superkey (nhưng không tối giản nên không phải Candidate Key).🔄 4. Alternate Key – Khóa thay thế
State_Code là Primary Key thì State_Name là Alternate Key.🌉 5. Foreign Key – Khóa ngoại
State_Code trong bảng Voters là Foreign Key → tham chiếu tới US_States.🌍 6. Natural Key – Khóa tự nhiên
State_Code (TX, GA), Customer_Email, ISBN.🔐 7. Surrogate Key – Khóa thay thế hệ thống
State_ID, Book_ID trong bảng có thể là surrogate key.🎯 Khi nào dùng?
🧱 8. Simple Key – Khóa đơn
Customer_Email dùng để xác định duy nhất → là Simple Key.🧱🧱 9. Composite Key – Khóa phức hợp
{Coffee_Type, Cup_Size} trong bảng Coffee_Options.🧱🌉 10. Compound Key – Khóa ghép có khóa ngoại
{Student_ID, Course_ID} trong bảng Student_Course.{Customer_ID, Account_ID} trong Customer_Account.🧠 11. Intelligent Key – Khóa thông minh
CLS-JIG-001 → Classic Jigsaw #001.19900325-001 → sinh ngày 25/03/1990, người thứ 1.📝 Ghi nhớ nhanh:
Common Table Expressions (CTE)
```WITH TopCustomers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
)
SELECT customer_id, total_spent
FROM TopCustomers
WHERE total_spent > 1000000;
~~~
📘 Giải thích
WITH TopCustomers AS (...): định nghĩa một bảng tạm logic trong phiên truy vấn.RECURSIVE).Subquery (Truy vấn lồng nhau)
```SELECT customer_id, total_spent
FROM (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
) AS Sub
WHERE total_spent > 1000000;
~~~
📘 Giải thích
SELECT ... FROM (...) là một truy vấn con được dùng làm bảng tạm.View (Bảng ảo)
```CREATE VIEW CustomerOrders AS
SELECT c.name, o.order_date, o.total_amount
FROM customers c
JOIN orders o ON c.id = o.customer_id;
Sau đó:
SELECT * FROM CustomerOrders WHERE total_amount > 1000000;
~~~
📘 Giải thích
Temporary Table (Bảng tạm)
```CREATE TEMPORARY TABLE TempSales AS
SELECT product_id, SUM(quantity) AS total_sold
FROM order_details
GROUP BY product_id;
Sau đó:
SELECT * FROM TempSales WHERE total_sold > 100;
~~~
📘 Giải thích
Materialized View (View vật lý hóa)
```CREATE MATERIALIZED VIEW MonthlySales AS
SELECT DATE_TRUNC(‘month’, order_date) AS month,
SUM(total_amount) AS monthly_total
FROM orders
GROUP BY month;
Cập nhật:
REFRESH MATERIALIZED VIEW CONCURRENTLY MonthlySales;
~~~
📘 Giải thích
Window Function là gì ?
✅ Khái niệm
Window Function là hàm cho phép tính toán tổng hợp theo từng nhóm (partition)
⚠️ Nhưng không làm mất chi tiết từng dòng như GROUP BY.
🧠 Lợi ích chính
🔧 Cấu trúc chung
```<window_function>(...) OVER (
PARTITION BY <column>
ORDER BY <column>
ROWS BETWEEN ... AND ...
)
~~~</column></column></window_function>
🧮 Các Window Function phổ biến trong phân tích dữ liệu
ROW_NUMBER()RANK()DENSE_RANK()LAG(column, offset)LEAD(column, offset)Mô hình dữ liệu (Data Modeling)
📘 Mô Hình Dữ Liệu Khái Niệm (Conceptual Data Model)
🧮 Mô Hình Dữ Liệu Logic và Vật Lý
Mô Hình Logic (Logical Data Model)
Mô Hình Vật Lý (Physical Data Model)
🗺️ Mô Hình ERD và Ứng Dụng Trong Thiết Kế Cơ Sở Dữ Liệu
🧱 Thành Phần ERD:
⚙️ Ứng Dụng:
RDBMS là gì?
Hệ quản trị cơ sở dữ liệu quan hệ – lưu dữ liệu dưới dạng bảng có liên kết qua khóa.
Data Mart là gì?
Là phần nhỏ của kho dữ liệu (Data Warehouse), tập trung cho 1 phòng ban cụ thể.