Web

SQL & Cơ Sở Dữ Liệu: Từ Lý Thuyết Đến Thực Hành

Hướng dẫn SQL từ cơ bản đến nâng cao - áp dụng kiến thức CSDL lớp 12 vào thực tế

12 phút đọc
NhiTuyen Tech Blog Team
SQL & Cơ Sở Dữ Liệu: Từ Lý Thuyết Đến Thực Hành

SQL & Cơ Sở Dữ Liệu: Từ Lý Thuyết Đến Thực Hành

SQL (Structured Query Language) là ngôn ngữ truy vấn cơ sở dữ liệu bạn đã học trong Tin học 12. Hãy cùng khám phá cách áp dụng kiến thức này vào thực tế với các hệ CSDL phổ biến!

Database

Ôn Tập Kiến Thức Lớp 12

Khái Niệm Cơ Bản

Chú thích: Đây là kiến thức nền tảng từ sách giáo khoa Tin học 12, chương CSDL!

Cơ Sở Dữ Liệu (CSDL):
- Tập hợp dữ liệu có tổ chức, lưu trữ trên máy tính
- Ví dụ: CSDL Học sinh, CSDL Sản phẩm, CSDL Bệnh nhân

Bảng (Table):
- Đơn vị cơ bản của CSDL
- Gồm các hàng (rows/records) và cột (columns/fields)

Khóa Chính (Primary Key):
- Trường xác định duy nhất mỗi bản ghi
- Ví dụ: MaHS, MaSP, SoDT

Khóa Ngoại (Foreign Key):
- Liên kết giữa các bảng
- Tham chiếu đến khóa chính của bảng khác

Mô Hình Dữ Liệu Quen Thuộc

-- Bảng HOCSINH - Ví dụ từ SGK Tin học 12
CREATE TABLE HOCSINH (
    MaHS INT PRIMARY KEY,           -- Khóa chính
    HoTen NVARCHAR(50) NOT NULL,    -- Họ tên
    NgaySinh DATE,                  -- Ngày sinh
    GioiTinh NVARCHAR(3),           -- Nam/Nữ
    Lop NVARCHAR(10),               -- Lớp
    DiaChi NVARCHAR(100)            -- Địa chỉ
);

-- Bảng DIEM
CREATE TABLE DIEM (
    MaHS INT,                       -- Khóa ngoại
    MonHoc NVARCHAR(30),
    HocKy INT,
    Diem FLOAT,
    PRIMARY KEY (MaHS, MonHoc, HocKy),
    FOREIGN KEY (MaHS) REFERENCES HOCSINH(MaHS)
);

-- Quan hệ 1-nhiều: 1 học sinh có nhiều điểm

Database Schema

SQL Cơ Bản

1. SELECT - Truy Vấn Dữ Liệu

Chú thích: SELECT là câu lệnh quan trọng nhất, dùng để lấy dữ liệu từ bảng.

-- Lấy tất cả học sinh
SELECT * FROM HOCSINH;

-- Lấy một số cột
SELECT HoTen, Lop FROM HOCSINH;

-- Lọc với WHERE
SELECT HoTen, Lop 
FROM HOCSINH 
WHERE Lop = '12A1';

-- Sắp xếp với ORDER BY
SELECT HoTen, DiemTB 
FROM HOCSINH 
ORDER BY DiemTB DESC;  -- Giảm dần

-- Giới hạn số bản ghi
SELECT HoTen, DiemTB 
FROM HOCSINH 
ORDER BY DiemTB DESC
LIMIT 10;  -- Top 10 học sinh giỏi nhất

-- Điều kiện phức tạp
SELECT HoTen, Lop, DiemTB
FROM HOCSINH
WHERE (Lop = '12A1' OR Lop = '12A2')
  AND DiemTB >= 8.0;

2. INSERT - Thêm Dữ Liệu

-- Thêm 1 học sinh
INSERT INTO HOCSINH (MaHS, HoTen, NgaySinh, GioiTinh, Lop)
VALUES (1, N'Nguyễn Văn A', '2006-05-15', N'Nam', '12A1');

-- Thêm nhiều học sinh cùng lúc
INSERT INTO HOCSINH VALUES
    (2, N'Trần Thị B', '2006-08-20', N'Nữ', '12A2', N'Hà Nội'),
    (3, N'Lê Văn C', '2006-03-10', N'Nam', '12A1', N'TP.HCM'),
    (4, N'Phạm Thị D', '2006-11-25', N'Nữ', '12A3', N'Đà Nẵng');

3. UPDATE - Cập Nhật Dữ Liệu

-- Cập nhật địa chỉ học sinh
UPDATE HOCSINH
SET DiaChi = N'Hải Phòng'
WHERE MaHS = 1;

-- Cập nhật nhiều trường
UPDATE HOCSINH
SET Lop = '12A2', DiaChi = N'Hà Nội'
WHERE MaHS = 2;

-- Cập nhật với điều kiện
UPDATE HOCSINH
SET DiemTB = DiemTB + 0.5  -- Cộng điểm thưởng
WHERE DiemTB >= 8.0;

4. DELETE - Xóa Dữ Liệu

-- Xóa 1 học sinh
DELETE FROM HOCSINH
WHERE MaHS = 5;

-- Xóa theo điều kiện
DELETE FROM HOCSINH
WHERE Lop = '12A4' AND DiemTB < 5.0;

-- ⚠️ Cẩn thận: Xóa tất cả (không có WHERE)
-- DELETE FROM HOCSINH;  -- Nguy hiểm!

SQL Queries

SQL Nâng Cao

Hàm Tổng Hợp (Aggregate Functions)

Chú thích: Các hàm này tính toán trên nhiều dòng dữ liệu, trả về 1 giá trị.

-- COUNT: Đếm số bản ghi
SELECT COUNT(*) AS TongSoHocSinh
FROM HOCSINH;

-- SUM: Tính tổng
SELECT SUM(SoLuong) AS TongSoLuong
FROM SANPHAM;

-- AVG: Tính trung bình
SELECT AVG(DiemTB) AS DiemTrungBinh
FROM HOCSINH
WHERE Lop = '12A1';

-- MAX, MIN: Giá trị lớn nhất, nhỏ nhất
SELECT 
    MAX(DiemTB) AS DiemCaoNhat,
    MIN(DiemTB) AS DiemThapNhat
FROM HOCSINH;

-- Kết hợp nhiều hàm
SELECT 
    COUNT(*) AS SoLuong,
    AVG(DiemTB) AS DiemTB,
    MAX(DiemTB) AS DiemMax,
    MIN(DiemTB) AS DiemMin
FROM HOCSINH
WHERE Lop = '12A1';

GROUP BY - Nhóm Dữ Liệu

Chú thích: GROUP BY nhóm các bản ghi có cùng giá trị, thường dùng với hàm tổng hợp.

-- Đếm số học sinh mỗi lớp
SELECT Lop, COUNT(*) AS SoHocSinh
FROM HOCSINH
GROUP BY Lop
ORDER BY Lop;

-- Điểm TB mỗi lớp
SELECT 
    Lop,
    COUNT(*) AS SiSo,
    AVG(DiemTB) AS DiemTrungBinh,
    MAX(DiemTB) AS DiemCaoNhat
FROM HOCSINH
GROUP BY Lop
ORDER BY AVG(DiemTB) DESC;

-- HAVING: Lọc sau khi GROUP BY
SELECT Lop, AVG(DiemTB) AS DiemTB
FROM HOCSINH
GROUP BY Lop
HAVING AVG(DiemTB) >= 7.0;  -- Chỉ lấy lớp có DTB >= 7.0

-- Thống kê theo xếp loại
SELECT 
    XepLoai,
    COUNT(*) AS SoLuong,
    ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM HOCSINH), 2) AS TyLe
FROM HOCSINH
GROUP BY XepLoai
ORDER BY 
    CASE XepLoai
        WHEN 'Giỏi' THEN 1
        WHEN 'Khá' THEN 2
        WHEN 'Trung bình' THEN 3
        ELSE 4
    END;

JOIN - Kết Nối Bảng

Chú thích: JOIN kết nối dữ liệu từ nhiều bảng dựa trên điều kiện.

-- INNER JOIN: Chỉ lấy bản ghi khớp ở cả 2 bảng
SELECT 
    HS.HoTen,
    HS.Lop,
    D.MonHoc,
    D.Diem
FROM HOCSINH HS
INNER JOIN DIEM D ON HS.MaHS = D.MaHS
WHERE D.HocKy = 1;

-- LEFT JOIN: Lấy tất cả từ bảng trái
SELECT 
    HS.HoTen,
    HS.Lop,
    D.MonHoc,
    D.Diem
FROM HOCSINH HS
LEFT JOIN DIEM D ON HS.MaHS = D.MaHS AND D.MonHoc = N'Toán';

-- Nhiều JOIN
SELECT 
    HS.HoTen,
    L.TenLop,
    GV.HoTen AS GiaoVien
FROM HOCSINH HS
INNER JOIN LOP L ON HS.Lop = L.MaLop
INNER JOIN GIAOVIEN GV ON L.MaGVCN = GV.MaGV;

-- Self JOIN: Tự join với chính nó
SELECT 
    HS1.HoTen AS HocSinh1,
    HS2.HoTen AS HocSinh2
FROM HOCSINH HS1
INNER JOIN HOCSINH HS2 ON HS1.Lop = HS2.Lop
WHERE HS1.MaHS < HS2.MaHS;  -- Cặp bạn cùng lớp

SQL Joins

Subquery - Truy Vấn Con

-- Truy vấn con trong WHERE
SELECT HoTen, DiemTB
FROM HOCSINH
WHERE DiemTB > (
    SELECT AVG(DiemTB) 
    FROM HOCSINH
);  -- Học sinh có điểm trên TB chung

-- Truy vấn con trong FROM
SELECT Lop, DiemTB
FROM (
    SELECT Lop, AVG(DiemTB) AS DiemTB
    FROM HOCSINH
    GROUP BY Lop
) AS LopStats
WHERE DiemTB >= 8.0;

-- IN với subquery
SELECT HoTen, Lop
FROM HOCSINH
WHERE MaHS IN (
    SELECT MaHS
    FROM DIEM
    WHERE MonHoc = N'Toán' AND Diem = 10
);  -- Học sinh có điểm 10 môn Toán

-- EXISTS
SELECT HoTen
FROM HOCSINH HS
WHERE EXISTS (
    SELECT 1
    FROM DIEM D
    WHERE D.MaHS = HS.MaHS 
      AND D.Diem >= 9.0
);  -- Học sinh có ít nhất 1 môn >= 9.0

Thực Hành Với MySQL

Cài Đặt MySQL

# Windows: Download MySQL Installer
# https://dev.mysql.com/downloads/installer/

# macOS
brew install mysql

# Linux (Ubuntu)
sudo apt update
sudo apt install mysql-server

# Khởi động MySQL
mysql -u root -p

Tạo Database Quản Lý Trường Học

-- Tạo database
CREATE DATABASE TRUONG_HOC;
USE TRUONG_HOC;

-- Bảng HOCSINH
CREATE TABLE HOCSINH (
    MaHS INT AUTO_INCREMENT PRIMARY KEY,
    HoTen VARCHAR(50) NOT NULL,
    NgaySinh DATE NOT NULL,
    GioiTinh ENUM('Nam', 'Nữ') NOT NULL,
    MaLop INT,
    DiaChi VARCHAR(100),
    SoDT VARCHAR(15),
    Email VARCHAR(50)
);

-- Bảng LOP
CREATE TABLE LOP (
    MaLop INT AUTO_INCREMENT PRIMARY KEY,
    TenLop VARCHAR(10) NOT NULL UNIQUE,
    Khoi INT NOT NULL,
    SiSo INT DEFAULT 0,
    MaGVCN INT
);

-- Bảng GIAOVIEN
CREATE TABLE GIAOVIEN (
    MaGV INT AUTO_INCREMENT PRIMARY KEY,
    HoTen VARCHAR(50) NOT NULL,
    MonDay VARCHAR(30),
    NgaySinh DATE,
    SoDT VARCHAR(15),
    Email VARCHAR(50)
);

-- Bảng DIEM
CREATE TABLE DIEM (
    MaDiem INT AUTO_INCREMENT PRIMARY KEY,
    MaHS INT NOT NULL,
    MonHoc VARCHAR(30) NOT NULL,
    HocKy INT NOT NULL,
    DiemMieng FLOAT,
    Diem15Phut FLOAT,
    Diem1Tiet FLOAT,
    DiemThi FLOAT,
    DiemTB FLOAT GENERATED ALWAYS AS (
        (DiemMieng + Diem15Phut + Diem1Tiet * 2 + DiemThi * 3) / 7
    ) STORED,
    FOREIGN KEY (MaHS) REFERENCES HOCSINH(MaHS) ON DELETE CASCADE
);

-- Thêm ràng buộc
ALTER TABLE HOCSINH 
ADD FOREIGN KEY (MaLop) REFERENCES LOP(MaLop);

ALTER TABLE LOP
ADD FOREIGN KEY (MaGVCN) REFERENCES GIAOVIEN(MaGV);

MySQL Database

Insert Dữ Liệu Mẫu

-- Thêm giáo viên
INSERT INTO GIAOVIEN (HoTen, MonDay, NgaySinh, SoDT) VALUES
('Nguyễn Văn Nam', 'Toán', '1980-05-15', '0912345678'),
('Trần Thị Lan', 'Văn', '1985-08-20', '0987654321'),
('Lê Minh Tuấn', 'Anh', '1982-03-10', '0923456789');

-- Thêm lớp
INSERT INTO LOP (TenLop, Khoi, MaGVCN) VALUES
('12A1', 12, 1),
('12A2', 12, 2),
('12A3', 12, 3);

-- Thêm học sinh
INSERT INTO HOCSINH (HoTen, NgaySinh, GioiTinh, MaLop, DiaChi) VALUES
('Phạm Minh An', '2006-01-15', 'Nam', 1, 'Hà Nội'),
('Nguyễn Thị Bình', '2006-03-20', 'Nữ', 1, 'Hà Nội'),
('Trần Văn Cường', '2006-05-10', 'Nam', 2, 'Hà Nội'),
('Lê Thị Dung', '2006-07-25', 'Nữ', 2, 'Hà Nội'),
('Hoàng Văn Em', '2006-09-30', 'Nam', 3, 'Hà Nội');

-- Thêm điểm
INSERT INTO DIEM (MaHS, MonHoc, HocKy, DiemMieng, Diem15Phut, Diem1Tiet, DiemThi) VALUES
(1, 'Toán', 1, 8, 8.5, 9, 8.5),
(1, 'Văn', 1, 7, 7.5, 8, 7.5),
(2, 'Toán', 1, 9, 9.5, 9, 9.5),
(2, 'Văn', 1, 8, 8.5, 8.5, 8.5);

Truy Vấn Phức Tạp

-- Danh sách học sinh và lớp
SELECT 
    HS.HoTen,
    HS.GioiTinh,
    L.TenLop,
    GV.HoTen AS GVCN
FROM HOCSINH HS
JOIN LOP L ON HS.MaLop = L.MaLop
JOIN GIAOVIEN GV ON L.MaGVCN = GV.MaGV
ORDER BY L.TenLop, HS.HoTen;

-- Bảng điểm chi tiết
SELECT 
    HS.HoTen,
    L.TenLop,
    D.MonHoc,
    D.DiemMieng,
    D.Diem15Phut,
    D.Diem1Tiet,
    D.DiemThi,
    ROUND(D.DiemTB, 2) AS DiemTB,
    CASE 
        WHEN D.DiemTB >= 8.0 THEN 'Giỏi'
        WHEN D.DiemTB >= 6.5 THEN 'Khá'
        WHEN D.DiemTB >= 5.0 THEN 'TB'
        ELSE 'Yếu'
    END AS XepLoai
FROM HOCSINH HS
JOIN LOP L ON HS.MaLop = L.MaLop
JOIN DIEM D ON HS.MaHS = D.MaHS
WHERE D.HocKy = 1
ORDER BY L.TenLop, HS.HoTen, D.MonHoc;

-- Thống kê theo lớp
SELECT 
    L.TenLop,
    COUNT(DISTINCT HS.MaHS) AS SiSo,
    COUNT(D.MaDiem) AS TongSoDiem,
    ROUND(AVG(D.DiemTB), 2) AS DiemTBChung,
    COUNT(CASE WHEN D.DiemTB >= 8.0 THEN 1 END) AS SoLuongGioi,
    COUNT(CASE WHEN D.DiemTB >= 6.5 AND D.DiemTB < 8.0 THEN 1 END) AS SoLuongKha
FROM LOP L
LEFT JOIN HOCSINH HS ON L.MaLop = HS.MaLop
LEFT JOIN DIEM D ON HS.MaHS = D.MaHS
GROUP BY L.MaLop, L.TenLop
ORDER BY L.TenLop;

-- Top 10 học sinh giỏi
SELECT 
    HS.HoTen,
    L.TenLop,
    ROUND(AVG(D.DiemTB), 2) AS DiemTB
FROM HOCSINH HS
JOIN LOP L ON HS.MaLop = L.MaLop
JOIN DIEM D ON HS.MaHS = D.MaHS
GROUP BY HS.MaHS, HS.HoTen, L.TenLop
ORDER BY AVG(D.DiemTB) DESC
LIMIT 10;

Query Results

Index & Performance

Chú thích: Index giúp tăng tốc độ truy vấn, giống như mục lục sách!

-- Tạo index cho cột thường tìm kiếm
CREATE INDEX idx_hoten ON HOCSINH(HoTen);
CREATE INDEX idx_lop ON HOCSINH(MaLop);

-- Composite index (nhiều cột)
CREATE INDEX idx_diem ON DIEM(MaHS, MonHoc, HocKy);

-- Unique index
CREATE UNIQUE INDEX idx_email ON HOCSINH(Email);

-- Xem execution plan
EXPLAIN SELECT * FROM HOCSINH WHERE HoTen LIKE 'Nguyễn%';

-- Drop index
DROP INDEX idx_hoten ON HOCSINH;

View - Khung Nhìn

-- Tạo view: Danh sách học sinh giỏi
CREATE VIEW V_HOCSINH_GIOI AS
SELECT 
    HS.MaHS,
    HS.HoTen,
    L.TenLop,
    ROUND(AVG(D.DiemTB), 2) AS DiemTB
FROM HOCSINH HS
JOIN LOP L ON HS.MaLop = L.MaLop
JOIN DIEM D ON HS.MaHS = D.MaHS
GROUP BY HS.MaHS, HS.HoTen, L.TenLop
HAVING AVG(D.DiemTB) >= 8.0;

-- Sử dụng view như bảng thường
SELECT * FROM V_HOCSINH_GIOI
ORDER BY DiemTB DESC;

-- View phức tạp
CREATE VIEW V_BANG_DIEM AS
SELECT 
    HS.HoTen,
    L.TenLop,
    D.MonHoc,
    D.DiemTB,
    CASE 
        WHEN D.DiemTB >= 8.0 THEN 'Giỏi'
        WHEN D.DiemTB >= 6.5 THEN 'Khá'
        WHEN D.DiemTB >= 5.0 THEN 'TB'
        ELSE 'Yếu'
    END AS XepLoai
FROM HOCSINH HS
JOIN LOP L ON HS.MaLop = L.MaLop
JOIN DIEM D ON HS.MaHS = D.MaHS;

Stored Procedure

Chú thích: Stored Procedure là chương trình con lưu trong database, có thể gọi lại nhiều lần.

-- Procedure tính điểm TB học sinh
DELIMITER //

CREATE PROCEDURE TinhDiemTB(IN p_MaHS INT)
BEGIN
    SELECT 
        HS.HoTen,
        D.MonHoc,
        ROUND(D.DiemTB, 2) AS DiemTB
    FROM HOCSINH HS
    JOIN DIEM D ON HS.MaHS = D.MaHS
    WHERE HS.MaHS = p_MaHS;
    
    SELECT 
        ROUND(AVG(D.DiemTB), 2) AS DiemTBChung
    FROM DIEM D
    WHERE D.MaHS = p_MaHS;
END //

DELIMITER ;

-- Gọi procedure
CALL TinhDiemTB(1);

-- Procedure với OUTPUT parameter
DELIMITER //

CREATE PROCEDURE DemHocSinh(
    IN p_MaLop INT,
    OUT p_SiSo INT
)
BEGIN
    SELECT COUNT(*) INTO p_SiSo
    FROM HOCSINH
    WHERE MaLop = p_MaLop;
END //

DELIMITER ;

-- Gọi với OUT parameter
CALL DemHocSinh(1, @siso);
SELECT @siso AS SiSo;

Stored Procedures

Transaction - Giao Dịch

Chú thích: Transaction đảm bảo tính toàn vẹn dữ liệu - hoặc tất cả thành công, hoặc tất cả thất bại.

-- Ví dụ: Chuyển học sinh sang lớp khác
START TRANSACTION;

-- Giảm sĩ số lớp cũ
UPDATE LOP
SET SiSo = SiSo - 1
WHERE MaLop = 1;

-- Tăng sĩ số lớp mới
UPDATE LOP
SET SiSo = SiSo + 1
WHERE MaLop = 2;

-- Cập nhật học sinh
UPDATE HOCSINH
SET MaLop = 2
WHERE MaHS = 1;

-- Kiểm tra và commit
COMMIT;

-- Nếu có lỗi, rollback
-- ROLLBACK;

Backup & Restore

# Backup database
mysqldump -u root -p TRUONG_HOC > backup.sql

# Backup specific tables
mysqldump -u root -p TRUONG_HOC HOCSINH DIEM > backup_partial.sql

# Restore
mysql -u root -p TRUONG_HOC < backup.sql

# Backup tất cả databases
mysqldump -u root -p --all-databases > all_backup.sql

Bài Tập Thực Hành

Bài 1: Quản Lý Thư Viện

-- Yêu cầu:
-- 1. Thiết kế CSDL: SACH, DOCGIA, MUON_TRA
-- 2. Các truy vấn:
--    - Sách đang được mượn
--    - Độc giả mượn nhiều nhất
--    - Sách quá hạn
--    - Thống kê theo thể loại

Bài 2: Quản Lý Bán Hàng

-- Yêu cầu:
-- 1. Thiết kế: SANPHAM, KHACHHANG, HOADON, CHITIETHD
-- 2. Truy vấn:
--    - Doanh thu theo tháng
--    - Top sản phẩm bán chạy
--    - Khách hàng VIP
--    - Báo cáo tồn kho

Bài 3: Hệ Thống Bệnh Viện

-- Yêu cầu:
-- 1. Thiết kế: BENHNHAN, BACSI, KHAMBENH, THUOC
-- 2. Truy vấn:
--    - Lịch khám bệnh
--    - Bác sĩ khám nhiều nhất
--    - Thống kê bệnh
--    - Quản lý thuốc

Practice Exercises

PostgreSQL vs MySQL

FeatureMySQLPostgreSQL
PerformanceNhanh với read-heavyTốt với complex queries
Data TypesCơ bảnPhong phú (JSON, Array…)
StandardsMột số extensionTuân thủ SQL standard
ReplicationMaster-slaveAdvanced replication
Use CasesWeb apps, E-commerceData warehousing, GIS
Learning CurveDễ họcHơi phức tạp

NoSQL vs SQL

SQL (Relational):
✅ Cấu trúc rõ ràng (tables, rows, columns)
✅ ACID transactions
✅ Relationships (JOIN)
✅ Phù hợp: Banking, ERP, E-commerce

NoSQL (Non-relational):
✅ Flexible schema
✅ Horizontal scaling
✅ High performance
✅ Phù hợp: Social media, Real-time, Big Data

Ví dụ NoSQL: MongoDB, Redis, Cassandra

Tools Hữu Ích

GUI Tools

MySQL Workbench (Free):
- Visual database design
- Query editor
- Administration

DBeaver (Free):
- Multi-database support
- ER diagrams
- Data export/import

phpMyAdmin (Web-based):
- Quản lý qua browser
- Dễ sử dụng
- Phổ biến với hosting

Database Tools

Kết Luận

SQL là kỹ năng quan trọng cho:

  • ✅ Backend Developer
  • ✅ Data Analyst
  • ✅ Database Administrator
  • ✅ Full-stack Developer
-- Hành trình học SQL của bạn
SELECT 
    'Tin học 12' AS KienThucNenTang,
    'Practice' AS BuocTiepTheo,
    'Build Projects' AS MucTieu,
    'Database Expert!' AS KetQua;

-- Start practicing today! 💪

Success


Bạn đã làm project nào với SQL chưa? Chia sẻ kinh nghiệm! 💬

Tags

#SQL #Database #MySQL #PostgreSQL #DataScience #TinHoc12 #Backend

Tags:

#SQL #Database #MySQL #PostgreSQL #Data #Tin học 12

Chia sẻ bài viết:

Bài viết liên quan

Bài viết liên quan 1
Bài viết liên quan 2
Bài viết liên quan 3