Tối Ưu Hóa Truy Vấn SQL & Dự Án Phân Tích Thực Tế

C0c3c3bb-c847-4047-9237-b0e53ee704bc

Chúc mừng bạn đã đi đến hành trình trong chuỗi series tự học SQL cùng  MCNA Technology School!

Viết được một câu lệnh SQL chạy ra kết quả đúng là điều tốt, nhưng viết sao cho câu lệnh đó chạy nhanh, mượt và không làm sập hệ thống khi dữ liệu lên đến hàng triệu dòng lại là một câu chuyện khác.

Bài viết này sẽ hướng dẫn bạn các nguyên tắc tối ưu hóa truy vấn SQL cốt lõi và cùng thực hiện một dự án tổng hợp nhỏ (Mini Project) chuẩn doanh nghiệp.

1. Các Mẹo Tối Ưu Hóa Truy Vấn SQL Dành Cho Chuyên Viên Dữ Liệu

1.1. Tránh Dùng SELECT *

  • Vấn đề: SELECT * bắt hệ thống phải đọc và tải toàn bộ các cột trong bảng, gây lãng phí tài nguyên RAM và băng thông mạng.

  • Giải pháp: Chỉ liệt kê đích danh các cột bạn thực sự cần dùng.

    SQL

    -- NÊN TRÁNH:
    SELECT * FROM DonHang;
    
    -- NÊN DÙNG:
    SELECT MaDH, NgayDat, TongTien FROM DonHang;
    

1.2. Tạo Và Sử Dụng Chỉ Mục (INDEX)

  • Khái niệm: Index giống như mục lục của một cuốn sách. Thay vì phải quét từ đầu đến cuối bảng (Full Table Scan), hệ thống sẽ nhìn vào Index để nhảy thẳng tới dòng chứa dữ liệu.

  • Cú pháp tạo Index:

    SQL

    CREATE INDEX idx_hocvien_email ON HocVien(Email);
    
  • Lưu ý: Chỉ nên tạo Index cho các cột thường xuyên xuất hiện trong mệnh đề WHERE hoặc JOIN.

1.3. Cẩn Trọng Với Dấu Phụ Đề % Trong Lệnh LIKE

  • Tránh đặt dấu % ở đầu chuỗi tìm kiếm (ví dụ: LIKE '%Nguyễn') vì hệ thống sẽ không thể tận dụng Index để tìm kiếm nhanh.

  • Ưu tiên đặt dấu % ở phía sau (ví dụ: LIKE 'Nguyễn%').

2. Xử Lý Giá Trị Rỗng (NULL) Đúng Cách

Trong cơ sở dữ liệu, NULL nghĩa là “không có dữ liệu”, chứ không phải là số 0 hay chuỗi rỗng "".

  • Để tìm dữ liệu rỗng, dùng IS NULL hoặc IS NOT NULL (không dùng = NULL).

  • Dùng hàm COALESCE() để thay thế giá trị NULL bằng một giá trị mặc định khi hiển thị:

SQL

-- Nếu Email bị NULL, hiển thị mặc định là 'Chưa cập nhật'
SELECT HoTen, COALESCE(Email, 'Chưa cập nhật') AS EmailLienHe
FROM HocVien;

3. Dự Án Phân Tích Dữ Liệu Thực Tế (Mini Project)

Để hệ thống lại toàn bộ kiến thức từ Buổi 1 đến Buổi 7, hãy cùng giải quyết bài toán phân tích doanh thu cho MCNA Technology School.

Cơ sở dữ liệu gồm 2 bảng:

  1. HocVien (MaHV, HoTen, Email, ThanhPho)

  2. DangKy (MaDK, MaHV, TenKhoaHoc, HocPhi, NgayDangKy)

Yêu cầu kinh doanh:

Hãy viết 01 câu truy vấn SQL duy nhất (kết hợp CTE, JOIN, Aggregate và Window Function) để tạo báo cáo gồm:

  1. Tên khóa học (TenKhoaHoc).

  2. Tổng số lượt đăng ký của khóa đó.

  3. Tổng doanh thu thu được từ khóa đó.

  4. Xếp hạng doanh thu của khóa học (DENSE_RANK).

  5. Chỉ hiển thị các khóa học có tổng doanh thu trên 20,000,000 VNĐ.

SQL

WITH BaoCaoDoanhThu AS (
    SELECT 
        TenKhoaHoc,
        COUNT(MaDK) AS TongLuotDangKy,
        SUM(HocPhi) AS TongDoanhThu,
        DENSE_RANK() OVER (ORDER BY SUM(HocPhi) DESC) AS HangDoanhThu
    FROM DangKy
    GROUP BY TenKhoaHoc
)
SELECT 
    TenKhoaHoc,
    TongLuotDangKy,
    TongDoanhThu,
    HangDoanhThu
FROM BaoCaoDoanhThu
WHERE TongDoanhThu > 20000000;

Tác giả: Huỳnh Trung Hậu

📞 Hotline: 0939.866.825 (Mr. Minh Khang)
🌐 Website: MCNA Technology School
📍 Hà Nội: 30 Trung Liệt, Đống Đa | Liền kề 44B TT2 Văn Quán, Hà Đông
📍 TP.HCM: 50B Phan Tây Hồ, Cầu Kiệu

Chỉ mục