SQL Flashcards

(28 cards)

1
Q

🔥 Truncate vs Delete trong SQL

A

🚀 Truncate:

  • ❌ Không hỗ trợ WHERE
  • ⚡ Xoá toàn bộ bảng, cực nhanh
  • 🔒 Không rollback nếu không nằm trong transaction
  • 🔁 Reset AUTO_INCREMENT
  • 💤 Không gọi trigger, không log chi tiết

🛠️ Delete:

  • ✅ Có WHERE, xoá có điều kiện
  • 🐌 Chậm hơn vì log đầy đủ
  • ♻️ Rollback được trong transaction
  • 🔢 Không reset AUTO_INCREMENT
  • 📣 Gọi trigger và cập nhật chỉ mục

💡 Mẹo nhớ:
👉 Dọn sạch bảng → dùng TRUNCATE
👉 Xoá có điều kiện → dùng DELETE

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

🔑 Primary Key vs 🔗 Foreign Key

A

🔑 Primary Key:

  • 🧍 Định danh duy nhất bản ghi
  • 🚫 Không được NULL
  • 1 bảng chỉ có 1 PK
  • 📌 Dùng để JOIN nhanh, ổn định

🔗 Foreign Key:

  • 🔁 Tham chiếu tới PK của bảng khác
  • ✅ Có thể NULL (tuỳ logic)
  • ✅ Có thể có nhiều FK trong 1 bảng
  • 🔄 Giữ mối quan hệ giữa bảng

📘 Ví dụ:

  • students(id) → 🔑
  • grades(student_id) → 🔗 tham chiếu students.id
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

🔗 Các loại JOIN – Mối quan hệ êm đẹp giữa các bảng

A
  1. Các loại JOIN – Mối quan hệ êm đẹp giữa các bảng🤝 INNER JOIN: Chỉ lấy bản ghi khớp ở cả hai bảng👈 LEFT JOIN: Giữ tất cả dòng bên trái, bên phải có thể NULL👉 RIGHT JOIN: Giữ tất cả dòng bên phải, bên trái có thể NULL🌐 FULL OUTER JOIN: Lấy tất cả bản ghi, khớp thì nối, không khớp thì NULL
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

📌 WHERE vs HAVING – Đừng nhầm nhé!

A

🔍 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;```

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

⚙️ 🔍 Index – Tăng tốc truy vấn như tên lửa

A

✅ Ưu điểm:

  • 🚀 SELECT nhanh hơn rõ rệt
  • 📊 Hỗ trợ tốt WHERE, JOIN, ORDER BY

⚠️ Nhược điểm:

  • 🐌 Chậm INSERT, UPDATE, DELETE
  • 📦 Tốn không gian lưu trữ

🧠 Kinh nghiệm:

  • Chỉ index cột thường truy vấn hoặc join
  • Tránh index cột ít giá trị phân biệt (low cardinality)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

🔄 🔐 Transaction – Giao dịch không bao giờ sai nếu hiểu ACID

A

🔷 ACID là gì?

  • ⚛️ Atomicity:
    Tất cả hoặc không có gì.
    Một giao dịch phải được thực hiện trọn vẹn hoặc không thực hiện gì cả – nếu lỗi, phải rollback toàn bộ.
  • 🧮 Consistency:
    Dữ liệu luôn hợp lệ.
    Trước và sau giao dịch, dữ liệu luôn tuân theo các ràng buộc đã định nghĩa trong schema.
  • 🚪 Isolation:
    Không ảnh hưởng các giao dịch khác.
    Các transaction chạy song song sẽ không can thiệp vào nhau.
  • 💾 Durability:
    Không mất dữ liệu sau khi commit.
    Dữ liệu đã commit sẽ được lưu vĩnh viễn, kể cả khi hệ thống gặp sự cố.

🧱 DDL là gì? (Data Definition Language)

  • Là các lệnh thay đổi cấu trúc cơ sở dữ liệu:
    Ví dụ: CREATE, ALTER, DROP, TRUNCATE, v.v.
  • Thường auto-commit:
    Không nằm trong giao dịch, không thể rollback → nếu lỗi xảy ra sau đó, DDL vẫn được thực hiện.
  • Trộn DDL vào giao dịch dễ phá vỡ tính Atomicity của ACID.

📊 DML là gì? (Data Manipulation Language)

  • Là các lệnh thao tác dữ liệu:
    Ví dụ: INSERT, UPDATE, DELETE, SELECT.
  • Hỗ trợ transaction đầy đủ:
    Có thể rollback nếu có lỗi xảy ra.

🧨 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ớ |

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

📥 📦 Tạo bảng không cần CREATE TABLE

A

👉 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';
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

** Làm thế nào để thay đổi kiểu dữ liệu của cột trong PostgreSQL ? **

A

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;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

13. Làm thế nào để tạo cơ sở dữ liệu trong PostgreSQL ?

A

Dùng lệnh CREATE DATABASE.

🔹 Ví dụ:

CREATE DATABASE quan_ly_sinh_vien;
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

** Có những kiểu bảng phân vùng nào trong PostgreSQL?**

A

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);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

** Sequence trong PostgreSQL là gì?**

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

** WAL (Write-Ahead Logging) là gì?**

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Các cấp độ Isolation trong Transaction (PostgreSQL)

A

1️⃣ Read UncommittedMứ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 CommittedMặ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 ReadPhantom 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 ReadNon-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️⃣ SerializableChặ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:

  • Dirty Read
  • Non-repeatable Read
  • Phantom Read

⛔ Đổ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

  • Read Uncommitted:
    Chấp nhận mọi rủi ro → dễ sai → thường không dùng
  • Read Committed (Default):
    An toàn vừa đủ cho CRUD phổ thông
  • Repeatable Read:
    Ổn định kết quả đã đọc, nhưng bị Phantom Read
  • Serializable:
    An toàn tuyệt đối, giả lập chạy tuần tự, nhưng chậm hơn
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

🔄 Phi chuẩn hóa dữ liệu (Data Denormalization) là gì?

A

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 để:

  • Giảm số lần JOIN khi truy vấn
  • Tăng tốc độ đọc dữ liệu

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

  • Data Warehouse
  • OLAP (phân tích dữ liệu)
  • Dashboard thời gian thực

✅ Ưu điểm của phi chuẩn hóa

  • Truy vấn nhanh hơn do ít hoặc không cần JOIN
  • Dễ viết truy vấn, dữ liệu cần thiết có thể nằm gọn trong một bảng
  • Thích hợp cho báo cáo tài chính, phân tích, hoặc dashboard phản hồi nhanh

❌ Nhược điểm

  • Dữ liệu trùng lặp, dễ gây không nhất quán nếu cập nhật sai
  • Tốn nhiều dung lượng lưu trữ hơn
  • Khó bảo trì và cập nhật hơn nếu dữ liệu được ghi hoặc sửa đổi thường xuyên

🧪 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?

  • Khi hệ thống cần truy vấn rất nhanh, ưu tiên tốc độ đọc hơn tính gọn gàng dữ liệu
  • Khi hệ thống có lượng đọc lớn, nhưng ghi/cập nhật ít
  • Khi JOIN phức tạp gây chậm hệ thống, và truy vấn hay bị “nghẽn” do nhiều bảng

Một số ví dụ cụ thể:

  • Kho dữ liệu (Data Warehouse)
  • Hệ thống phân tích OLAP
  • Dashboard tài chính thời gian thực

🔍 So sánh Chuẩn hóa và Phi chuẩn hóa

Chuẩn hóa (Normalization):

  • Mục tiêu: loại bỏ trùng lặp, đảm bảo tính nhất quán dữ liệu
  • Truy vấn cần JOIN → tốc độ đọc chậm hơn
  • Tối ưu khi ghi/cập nhật nhiều
  • Phù hợp với hệ thống OLTP (Online Transaction Processing), ví dụ như CRM, ngân hàng, thương mại điện tử

Phi chuẩn hóa (Denormalization):

  • Mục tiêu: tăng hiệu suất truy vấn, giảm JOIN
  • Chấp nhận một mức dữ liệu dư thừa có kiểm soát
  • Phù hợp khi đọc nhiều – ghi ít, ví dụ hệ thống phân tích, báo cáo, Data Lake

💡 Kinh nghiệm thực tế

  • Giai đoạn đầu hệ thống nên thiết kế chuẩn hóa để dữ liệu sạch, dễ kiểm soát, tránh lỗi logic
  • Khi hệ thống lớn lên và phát sinh vấn đề truy vấn chậm do JOIN nhiều, có thể phi chuẩn hóa chọn lọc
  • Phi chuẩn hóa không nên lạm dụng – chỉ áp dụng với những trường/truy vấn “nóng” thường xuyên
  • Nếu phi chuẩn hóa, cần có cơ chế đồng bộ dữ liệu rõ ràng để tránh mâu thuẫn
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Khoá trong SQL ?

A

🔑 1. Primary Key – Khóa chính

  • Là cột (hoặc nhiều cột) dùng để xác định duy nhất mỗi dòng.
  • Không được trùng ❌, không được null 🚫.
  • Ví dụ: State_Code trong bảng US_States là Primary Key (e.g. TX, GA).

🎯 2. Candidate Key – Khóa ứng viên

  • Là những cột có thể dùng làm Primary Key.
  • Một bảng có thể có nhiều Candidate Key.
  • Ví dụ: Cả State_CodeState_Name đều là Candidate Key trong US_States.

🧩 3. Superkey – Khóa siêu cấp

  • Là bất kỳ tập cột nào giúp xác định duy nhất hàng 🧠.
  • Có thể chứa thêm cột không cần thiết.
  • Ví dụ: {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ế

  • Là Candidate Key không được chọn làm Primary Key.
  • Dùng như backup hoặc bảo vệ dữ liệu.
  • Ví dụ: Nếu State_Code là Primary Key thì State_Name là Alternate Key.

🌉 5. Foreign Key – Khóa ngoại

  • Là cột tham chiếu đến Primary Key của bảng khác.
  • Tạo liên kết giữa các bảng & đảm bảo dữ liệu hợp lệ.
  • Ví dụ: State_Code trong bảng Voters là Foreign Key → tham chiếu tới US_States.

🌍 6. Natural Key – Khóa tự nhiên

  • Có ý nghĩa thực tế ngoài đời 🌐.
  • Dễ hiểu, dễ nhớ.
  • Ví dụ: State_Code (TX, GA), Customer_Email, ISBN.

🔐 7. Surrogate Key – Khóa thay thế hệ thống

  • Không có ý nghĩa thực tế ❎.
  • Được hệ thống tạo tự động (ID tăng dần, UUID…).
  • Ví dụ: State_ID, Book_ID trong bảng có thể là surrogate key.

🎯 Khi nào dùng?

  • Natural Key: Dữ liệu thực tế ổn định → dùng được luôn.
  • Surrogate Key: Khi không có key tự nhiên ổn định, hoặc cần đơn giản hóa quan hệ.

🧱 8. Simple Key – Khóa đơn

  • Là khóa (thường Primary/Candidate) chỉ gồm 1 cột duy nhất.
  • Ví dụ: Customer_Email dùng để xác định duy nhất → là Simple Key.

🧱🧱 9. Composite Key – Khóa phức hợp

  • Là khóa gồm nhiều cột kết hợp lại để xác định duy nhất hàng.
  • Ví dụ: {Coffee_Type, Cup_Size} trong bảng Coffee_Options.

🧱🌉 10. Compound Key – Khóa ghép có khóa ngoại

  • Là Composite Key mà ít nhất 1 cột là Foreign Key.
  • Xuất hiện trong bảng trung gian (many-to-many).
  • Ví dụ:
    • {Student_ID, Course_ID} trong bảng Student_Course.
    • {Customer_ID, Account_ID} trong Customer_Account.

🧠 11. Intelligent Key – Khóa thông minh

  • Là Natural Key có cấu trúc gồm nhiều phần có ý nghĩa.
  • Người dùng có thể “đọc key là hiểu”.
  • Ví dụ:
    • Mã sản phẩm: CLS-JIG-001 → Classic Jigsaw #001.
    • Mã khách hàng: 19900325-001 → sinh ngày 25/03/1990, người thứ 1.

📝 Ghi nhớ nhanh:

  • Primary Key → Duy nhất, không null 🛡️
  • Candidate Key → Ứng viên sáng giá cho PK 🏆
  • Superkey → Rộng hơn Candidate Key 🧃
  • Alternate Key → Không được chọn nhưng vẫn xịn 😎
  • Foreign Key → Cầu nối giữa bảng 🌉
  • Natural Key → Ý nghĩa thực tế 🌍
  • Surrogate Key → Do hệ thống sinh ra 🎲
  • Simple Key → 1 cột là đủ 🔹
  • Composite Key → Nhiều cột kết hợp 🔷
  • Compound Key → Composite có Foreign Key 🧷
  • Intelligent Key → Mã có logic dễ hiểu 🧠
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Common Table Expressions (CTE)

A

```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.
  • Truy vấn cuối cùng lọc khách hàng có tổng chi tiêu vượt 1 triệu.
  • Ưu điểm:
    • Tách biệt logic từng bước → dễ đọc, dễ bảo trì.
    • Hỗ trợ đệ quy (với RECURSIVE).
    • Hiệu năng tốt hơn subquery trong nhiều tầng lồng.
17
Q

Subquery (Truy vấn lồng nhau)

A

```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

  • Phần SELECT ... FROM (...) là một truy vấn con được dùng làm bảng tạm.
  • Ngắn gọn, dễ viết với truy vấn đơn.
  • Nhược điểm:
    • Dễ rối và khó bảo trì nếu có nhiều lớp subquery.
    • Có thể hiệu năng thấp với dữ liệu lớn.
18
Q

View (Bảng ảo)

A

```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

  • View là bảng ảo chứa sẵn logic truy vấn, giúp tái sử dụng nhiều nơi.
  • Không lưu dữ liệu → mỗi truy vấn đều tính lại từ đầu.
  • Ưu điểm:
    • Quản lý logic nghiệp vụ tập trung.
    • Dễ chia sẻ giữa các báo cáo.
  • Nhược điểm: Dễ lỗi nếu schema gốc thay đổi.
19
Q

Temporary Table (Bảng tạm)

A

```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

  • Bảng tạm chỉ tồn tại trong phiên làm việc hiện tại.
  • Phù hợp xử lý dữ liệu trung gian hoặc ETL.
  • Ưu điểm:
    • Tăng hiệu năng khi cần lưu kết quả trung gian.
  • Nhược điểm:
    • Tự động xóa khi phiên kết thúc.
    • Khó debug nếu chưa kết thúc phiên.
20
Q

Materialized View (View vật lý hóa)

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

  • Khác với View, Materialized View lưu kết quả ra đĩa.
  • Truy vấn rất nhanh vì không tính lại mỗi lần.
  • Ưu điểm:
    • Tối ưu với hệ thống báo cáo, dashboard.
  • Nhược điểm:
    • Cần refresh thủ công hoặc theo lịch.
    • Tốn dung lượng lưu trữ.
21
Q

Window Function là gì ?

A

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

  • Giữ nguyên từng dòng dữ liệu.
  • Cho phép các phép toán như: tổng, trung bình, đếm, xếp hạng, v.v.
  • Dễ xử lý các bài toán như cộng dồn, xếp hạng, so sánh giữa các dòng liên tiếp…

🔧 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()
    → Đánh số thứ tự dòng trong từng nhóm
    → Không quan tâm giá trị trùng, luôn tăng đều (1, 2, 3,…)
  • RANK()
    → Xếp hạng theo thứ tự, cho phép trùng hạng, nhưng nhảy số
    → Ví dụ: hạng 1, 2, 2, 4 (bỏ hạng 3)
  • DENSE_RANK()
    → Xếp hạng không nhảy số khi trùng hạng
    → Ví dụ: hạng 1, 2, 2, 3 (không bỏ hạng)
  • LAG(column, offset)
    → Truy xuất giá trị ở dòng trước
    → Dùng để tính biến động, so sánh với dòng trước đó (default offset = 1)
  • LEAD(column, offset)
    → Truy xuất giá trị ở dòng sau
    → Dùng để dự báo, so sánh xu hướng, hoặc đối chiếu với dòng tiếp theo
22
Q

Mô hình dữ liệu (Data Modeling)

A

📘 Mô Hình Dữ Liệu Khái Niệm (Conceptual Data Model)

  • 💡 Là mô hình trừu tượng và tổng quan về dữ liệu trong hệ thống.
  • 🎯 Tập trung vào các thực thể chính và mối quan hệ cơ bản.
  • ❌ Không đi sâu vào chi tiết kỹ thuật.
  • 💬 Trong Entity Framework: là một phần của EDM – mô tả các đối tượng và quan hệ cần tương tác.
  • 📦 Gồm:
    • Các loại thực thể (entity types).
    • Các mối quan hệ (associations).
    • Mỗi thực thể có tên, khóa định danh và thuộc tính.
  • 🛍️ Ví dụ:
    • “Khách hàng” (Customers)
    • “Sản phẩm” (Products)
    • “Đơn hàng” (Orders)
    • Mối quan hệ: “Khách hàng có nhiều đơn hàng”, “Đơn hàng có nhiều sản phẩm”
  • 🔄 Là cầu nối giữa yêu cầu nghiệp vụ và thiết kế kỹ thuật.

🧮 Mô Hình Dữ Liệu Logic và Vật Lý

Mô Hình Logic (Logical Data Model)

  • 🧱 Phát triển từ mô hình khái niệm.
  • 🔍 Bổ sung chi tiết kỹ thuật: kiểu dữ liệu, ràng buộc, quy tắc nghiệp vụ.
  • 🧑‍💻 Vẫn giữ độc lập với nền tảng CSDL cụ thể.
  • 🔄 Tổ chức dữ liệu logic, tối ưu chuẩn hóa và truy vấn.

Mô Hình Vật Lý (Physical Data Model)

  • 🔧 Chi tiết nhất để triển khai cơ sở dữ liệu trên hệ QTCSDL cụ thể.
  • 📋 Gồm: bảng, cột, chỉ mục, khóa ngoại, trigger, partition…
  • 📊 Quyết định hiệu suất vận hành: lưu trữ, phân vùng, tối ưu truy vấn.
  • 🔄 Duy trì tính nhất quán từ thiết kế ban đầu đến triển khai thực tế.

🗺️ Mô Hình ERD và Ứng Dụng Trong Thiết Kế Cơ Sở Dữ Liệu

  • 🧾 ERD (Entity-Relationship Diagram) là sơ đồ trực quan hóa mô hình ER.
  • 👓 Trực quan hóa thực thể, thuộc tính và mối quan hệ giữa chúng.
  • 🔄 Mối quan hệ giữa ER và ERD:
    • ER: mô hình hóa dữ liệu.
    • ERD: công cụ biểu diễn và truyền đạt mô hình ER.

🧱 Thành Phần ERD:

  • 🧍‍♂️ Thực thể (Entities): các đối tượng trong hệ thống cần lưu thông tin.
  • 🧾 Thuộc tính (Attributes): đặc điểm của thực thể.
  • 🔗 Mối quan hệ (Relationships): liên kết và tương tác giữa các thực thể (1-1, 1-N, N-N).

⚙️ Ứng Dụng:

  • 🔍 Phân tích yêu cầu nghiệp vụ.
  • 🧑‍💻 Thiết kế cơ sở dữ liệu.
  • 📡 Giao tiếp giữa BA – Dev – DB Designer.
  • 🛠️ Hướng dẫn tạo bảng và kết nối trong DBMS.
23
Q

RDBMS là gì?

A

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.

24
Q

Data Mart là gì?

A

Là phần nhỏ của kho dữ liệu (Data Warehouse), tập trung cho 1 phòng ban cụ thể.

25
Dimensional Model là gì ?
📌 Khái niệm * **Fact Table (Bảng sự kiện):** Chứa dữ liệu cần phân tích như doanh thu, số lượng bán. Mỗi dòng đại diện cho một sự kiện kinh doanh cụ thể. * **Dimension Table (Bảng chiếu):** Chứa thông tin bổ sung cho fact table, mô tả ngữ cảnh như thời gian, sản phẩm, khách hàng, địa điểm... --- 🧭 Phân loại Schema 🌟 Star Schema * Fact table ở trung tâm, các dimension table xung quanh → tạo hình ngôi sao. * Mô hình đơn giản, dễ hiểu. * Truy vấn nhanh, tối ưu cho hệ thống phân tích (OLAP). --- ❄️ Snowflake Schema * Là biến thể của Star Schema. * Các dimension table được chuẩn hóa thêm, chia nhỏ và liên kết qua nhiều bảng phụ. **Ưu điểm:** * Giúp giảm dư thừa dữ liệu. * Phù hợp với hệ thống cần chuẩn hóa cao và quản lý dữ liệu phức tạp. **Nhược điểm:** * Làm truy vấn trở nên phức tạp hơn. * Có thể gây khó khăn khi xây dựng dashboard hoặc cho người không chuyên. --- ⚙️ Ưu điểm của Dimensional Model * Thiết kế đơn giản, dễ hiểu. * Tối ưu hóa hiệu suất truy vấn và phân tích. * Phù hợp với người dùng không chuyên kỹ thuật (analyst, marketing...). --- 🧠 So sánh với Entity-Relationship Model * **Dimensional Model:** Dùng trong các hệ thống phân tích dữ liệu. Biểu diễn dữ liệu dưới dạng fact và dimension, rất thân thiện với người dùng phân tích. * **ER Model:** Biểu diễn dữ liệu dưới dạng thực thể (entities), thuộc tính (attributes) và mối quan hệ (relationships). Thường dùng trong hệ thống giao dịch (OLTP), yêu cầu logic nghiệp vụ phức tạp. --- 📌 Ghi nhớ nhanh * **Star Schema:** Truy vấn nhanh, dễ hiểu, không chuẩn hóa, dùng tốt cho dashboard và báo cáo. * **Snowflake Schema:** Chuẩn hóa hơn, ít dư thừa, nhưng truy vấn chậm hơn, phức tạp hơn.
26
Slow Changing Dimension ?
**Slow Changing Dimension (SCD)** là kỹ thuật lưu trữ dữ liệu cho các thuộc tính (dimension) trong kho dữ liệu (Data Warehouse) mà giá trị có thể thay đổi từ từ theo thời gian (ví dụ: địa chỉ khách hàng, chức vụ nhân viên…). * 🧠 Mục tiêu chính: Giữ lại lịch sử thay đổi để phục vụ phân tích dữ liệu theo từng thời điểm khác nhau. --- 🎯 2. Mục đích của SCD * 📜 **Lưu giữ lịch sử thay đổi:** Biết được một thuộc tính đã thay đổi ra sao qua các thời kỳ. * ⏳ **Phân tích dữ liệu theo thời điểm:** Trả lời câu hỏi như "Khách hàng này vào năm 2020 ở đâu?" * 🛡️ **Đảm bảo tính toàn vẹn dữ liệu:** Tránh mất mát dữ liệu cũ khi có cập nhật mới. --- 🧩 3. Các loại SCD phổ biến 🔁 SCD Type 1 – Ghi đè dữ liệu cũ * 🛠️ **Cách hoạt động:** Ghi đè dữ liệu mới lên dữ liệu cũ. Không lưu lịch sử. * ✅ **Ưu điểm:** Đơn giản, tiết kiệm không gian lưu trữ. * ⚠️ **Nhược điểm:** Mất toàn bộ lịch sử thay đổi. * 📌 **Ví dụ:** Cập nhật số điện thoại khách hàng – chỉ cần lưu thông tin mới nhất. 🧾 SCD Type 2 – Lưu chi tiết lịch sử * 🛠️ **Cách hoạt động:** Mỗi lần thay đổi, tạo một bản ghi mới. Lưu thời gian hiệu lực (start\_date, end\_date). * ✅ **Ưu điểm:** Lưu trữ đầy đủ lịch sử, hỗ trợ phân tích theo thời gian. * ⚠️ **Nhược điểm:** Bảng dữ liệu lớn, truy vấn phức tạp hơn. * 📌 **Ví dụ:** Theo dõi lịch sử địa chỉ khách hàng. 🧭 SCD Type 3 – Lưu một phần lịch sử * 🛠️ **Cách hoạt động:** Lưu giá trị hiện tại và giá trị trước đó trong 2 cột riêng biệt. * ✅ **Ưu điểm:** Đơn giản, dễ truy vấn. * ⚠️ **Nhược điểm:** Chỉ lưu được 1–2 lần thay đổi gần nhất. * 📌 **Ví dụ:** Lưu địa chỉ hiện tại và địa chỉ trước đó của khách hàng. --- 🧪 4. Ứng dụng thực tế và lưu ý khi triển khai 🚀 Ứng dụng thực tế: * 📊 Báo cáo lịch sử: Xem lại thông tin khách hàng, nhân viên theo thời điểm. * 📈 Phân tích hành vi: Theo dõi xu hướng thay đổi của người dùng hoặc thị trường. * 📝 Hỗ trợ kiểm toán: Lưu vết thay đổi dữ liệu phục vụ compliance. ⚙️ Lưu ý triển khai: * 🎯 Chọn đúng loại SCD theo yêu cầu nghiệp vụ. * 🔐 Thiết kế khóa chính/phụ rõ ràng (sử dụng surrogate key cho SCD2). * ⏱️ Quản lý thời gian hiệu lực bằng start\_date, end\_date hoặc flag `is_current`. * 📉 Tối ưu truy vấn dữ liệu lịch sử để tránh giảm hiệu năng. --- 🧰 5. Công cụ và kỹ thuật hỗ trợ * 🧑‍💻 **SQL (MERGE, UPSERT):** Hỗ trợ cập nhật/chèn dữ liệu theo logic SCD. * 🔄 **ETL Tools:** Informatica, Talend, SSIS, Apache NiFi – tự động hóa cập nhật SCD. * 🏗️ **Data Modeling Tools:** PowerDesigner, ER/Studio – thiết kế bảng dimension theo chuẩn SCD.
27
Lock
🔒 **Exclusive Lock (Khóa độc quyền)** * ✅ **Dùng khi:** Cần **ghi dữ liệu** (WRITE). * ⛔ **Chặn hết** transaction khác: Không ai được đọc hay ghi. * 📌 **Chỉ 1 transaction** được phép giữ khóa tại một thời điểm. * 🧠 **Ứng dụng:** Cập nhật số dư tài khoản, thay đổi thông tin người dùng… 🔍 **Ví dụ:** Transaction T1 đặt `exclusive lock` để cập nhật dòng `user_id=42` → T2 muốn đọc dòng đó sẽ **bị chặn** đến khi T1 commit hoặc rollback. --- 👥 **Shared Lock (Khóa chia sẻ)** * ✅ **Dùng khi:** Chỉ cần **đọc dữ liệu** (READ). * 🤝 **Cho phép nhiều** transaction cùng đọc một lúc. * ⛔ **Chặn ghi**, không ai được update/insert/delete trong thời gian khóa tồn tại. * 🧠 **Ứng dụng:** Truy vấn báo cáo, kiểm tra thông tin sản phẩm… 🔍 **Ví dụ:** T1 và T2 cùng đọc dòng `product_id=7` → OK. Nhưng nếu T3 muốn cập nhật giá sản phẩm → **bị chặn** đến khi các shared lock được giải phóng. --- ⚔️ **Deadlock (Khóa chết)** * ❗ **Hiện tượng:** 2 (hoặc nhiều) transaction **giữ khóa nhau và chờ nhau mãi mãi** → không ai nhúc nhích được. * 🔄 **Mô hình:** Gọi là vòng chờ tài nguyên (wait-for cycle). * 🧨 **Hậu quả:** Hệ thống **treo cứng**, phải có cơ chế **phát hiện và huỷ bỏ** 1 bên để phá deadlock. 🔍 **Ví dụ kinh điển:** * T1: giữ khóa bảng A → đòi thêm B * T2: giữ khóa bảng B → đòi thêm A → **Deadlock xảy ra** vì ai cũng chờ ai. --- 🛡️ Mẹo tránh Deadlock * 🔁 **Truy cập tài nguyên theo thứ tự cố định** (A rồi B, không đảo lộn). * 🧺 **Gộp truy vấn batch** để giảm số lần lock. * ⏱️ **Giữ khóa trong thời gian ngắn nhất có thể**. * 🚫 **Tránh vòng chờ**, ví dụ: không cập nhật nhiều bảng trong 1 transaction khi không cần thiết. --- Nếu muốn học thuộc nhanh, hãy nhớ 3 câu chốt: > 🔒 **Exclusive lock** là “một mình tao làm, cấm đứa nào chạm”. > 👥 **Shared lock** là “tụi mình cùng đọc, nhưng đừng ai sửa”. > ⚔️ **Deadlock** là “tao chờ mày – mày chờ tao – cùng chết”.
28
Level locking ?
Giải thích dễ hiểu – dễ nhớ – vẫn technical nhé: --- 🔐 **Row-level Lock vs Table-level Lock** Đây là **cách mà hệ quản trị CSDL khóa dữ liệu khi một transaction đang chạy**. Khóa có thể áp dụng ở **mức dòng (row)** hoặc **mức bảng (table)**. --- 🧩 **Row-level Lock (Khóa mức dòng)** * 🔹 **Khóa từng dòng** dữ liệu cụ thể. * 🔹 Cho phép nhiều transaction cùng **truy cập vào bảng**, **chỉ cần khác dòng**. * ✅ **Ưu điểm:** **Concurrency cao**, phù hợp với hệ thống có nhiều người dùng cùng lúc (OLTP). * ❌ **Nhược điểm:** Cần quản lý nhiều khóa → tốn RAM và phức tạp hơn. 🔍 **Ví dụ:** ```sql UPDATE customers SET status = 'VIP' WHERE id = 123; ``` → Chỉ **dòng có id=123** bị khóa → transaction khác vẫn có thể truy cập các dòng khác. --- 📄 **Table-level Lock (Khóa mức bảng)** * 🔸 **Khóa toàn bộ bảng**, dù chỉ đọc/ghi một dòng. * ⛔ Các transaction khác **không thể đọc/ghi** bất kỳ dòng nào trong bảng đó. * ✅ **Ưu điểm:** **Quản lý đơn giản**, ít tốn tài nguyên. * ❌ **Nhược điểm:** **Concurrency thấp**, dễ gây nghẽn nếu có nhiều transaction. 🔍 **Ví dụ:** ```sql LOCK TABLE customers IN EXCLUSIVE MODE; ``` → **Toàn bộ bảng `customers` bị khóa** → không ai khác được đọc hay ghi. --- 🧠 Mẹo học thuộc: > 🔹 **Row-level lock** = khóa "có chọn lọc", nhiều người làm việc song song. > 🔸 **Table-level lock** = khóa "cả phòng", ai cũng phải chờ. --- Nếu đang xây hệ thống **hiệu năng cao** (như ngân hàng, e-commerce), dùng **row-level**. Nếu xử lý **batch, báo cáo lớn**, không cần concurrency → **table-level** đơn giản hơn.