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 đề
WHEREhoặcJOIN.
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 NULLhoặcIS NOT NULL(không dùng= NULL). -
Dùng hàm
COALESCE()để thay thế giá trịNULLbằ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:
-
HocVien(MaHV,HoTen,Email,ThanhPho) -
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:
Tên khóa học (
TenKhoaHoc).Tổng số lượt đăng ký của khóa đó.
Tổng doanh thu thu được từ khóa đó.
Xếp hạng doanh thu của khóa học (
DENSE_RANK).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

