Chào mừng bạn quay trở lại với trong chuỗi series SQL Nâng Cao cùng MCNA Technology School!
Trong quá trình làm việc với cơ sở dữ liệu, chắc hẳn bạn đã từng phải lặp đi lặp lại một công thức tính toán phức tạp (như tính thuế, tính điểm trung bình có trọng số, hoặc quy đổi tỷ giá) ở nhiều câu truy vấn khác nhau. Làm thế nào để “đóng gói” công thức đó thành một hàm riêng biệt và gọi ra dùng bất cứ lúc nào? User-Defined Functions (UDF) trong SQL chính là công cụ giúp bạn thực hiện điều này.
1. User-Defined Functions (UDF) Trong SQL Là Gì?
User-Defined Functions (UDF) là các hàm do người dùng tự định nghĩa để mở rộng khả năng tính toán của SQL Server bên cạnh các hàm có sẵn như SUM(), COUNT(), AVG().
Ưu điểm của UDF:
-
Modular Code (Mô-đun hóa): Viết logic tính toán một lần, sử dụng ở bất kỳ đâu trong các câu lệnh
SELECT,WHERE,HAVING. -
Dễ bảo trì: Khi công thức tính toán thay đổi, bạn chỉ cần sửa logic bên trong hàm UDF mà không cần sửa lại hàng trăm câu truy vấn gốc.
-
Thực thi linh hoạt: Khác với Stored Procedure, hàm UDF có thể nhúng trực tiếp vào trong mệnh đề
SELECTđể tính toán trên từng dòng dữ liệu.
2. Phân Biệt 2 Loại Hàm UDF Phổ Biến
2.1. Scalar Functions (Hàm trả về giá trị đơn)
Trả về đúng 01 giá trị duy nhất (kiểu số, chuỗi, ngày tháng…).
SQL
-- Tạo hàm tính giá trị sau thuế VAT (10%)
CREATE FUNCTION fn_TinhThueVAT (@GiaGoc DECIMAL(18,2))
RETURNS DECIMAL(18,2)
AS
BEGIN
RETURN @GiaGoc * 1.10;
END;
-- Cách gọi hàm trong câu truy vấn
SELECT TenKhoaHoc, HocPhi, dbo.fn_TinhThueVAT(HocPhi) AS HocPhiCoVAT
FROM KhoaHoc;
2.2. Table-Valued Functions (Hàm trả về một bảng dữ liệu)
Trả về kết quả là một bảng dữ liệu (Table). Loại hàm này đóng vai trò tương tự một VIEW có nhận tham số đầu vào.
SQL
-- Tạo hàm lấy danh sách học viên theo từng lớp
CREATE FUNCTION fn_GetHocVienTheoLop (@MaLop VARCHAR(10))
RETURNS TABLE
AS
RETURN (
SELECT MaHV, HoTen, Email
FROM HocVien
WHERE MaLop = @MaLop
);
-- Cách gọi hàm (dùng như một bảng bình thường)
SELECT * FROM dbo.fn_GetHocVienTheoLop('SQL-ADV');
⚡ CẨN TRỌNG VỚI HẠN CHẾ HIỆU NĂNG CỦA SCALAR FUNCTION!
Lạm dụng Scalar Function trong mệnh đề
SELECTtrên các bảng dữ liệu hàng triệu dòng có thể gây ra hiện tượng RBAR (Row-By-Agonizing-Row) – hàm phải chạy đi chạy lại từng dòng một làm suy giảm hiệu năng nghiêm trọng.🚀 Đồng hành cùng Khóa học SQL Nâng Cao & Tối Ưu Hệ Thống tại MCNA Technology School:
Master kỹ thuật: Chuyển đổi Scalar Function sang Inline Table-Valued Function để tối ưu tốc độ gấp 10 lần.
Xử lý bài toán lớn: Xây dựng hệ thống thư viện hàm chuẩn hóa cho toàn bộ doanh nghiệp.
Mentor 1:1: Được các Chuyên gia Dữ liệu trực tiếp đánh giá và tối ưu Code.
👉 [ĐĂNG KÝ NHẬN TƯ VẤN ] (link đăng ký)
3. So Sánh Nhanh UDF Và Stored Procedure
| Tiêu chí | User-Defined Function (UDF) | Stored Procedure |
| Mục đích chính | Tính toán và trả về giá trị / bảng dữ liệu | Thực hiện các tác vụ logic phức tạp / thay đổi dữ liệu |
| Giá trị trả về | Bắt buộc phải có RETURN |
Có thể trả về hoặc không |
Sử dụng trong SELECT |
Có thể nhúng trực tiếp vào câu lệnh SELECT |
Không thể nhúng, phải gọi bằng EXEC |
| Thay đổi dữ liệu | Không được phép dùng INSERT, UPDATE, DELETE làm thay đổi bảng gốc |
Cho phép thao tác chỉnh sửa dữ liệu thoải mái |
4. Bài Tập Thực Hành SQL Nâng Cao (Bài 6)
Hãy áp dụng kiến thức về User-Defined Functions (UDF) để giải bài tập xếp loại học viên dưới đây:
Đề bài: Cho bảng
HocVien(MaHV,HoTen,DiemThi).
Viết một Scalar Function tên là
fn_XepLoainhận vào tham số@DiemThi FLOATvà trả về chuỗiNVARCHAR(20)xếp loại:
Nếu
@DiemThi >= 8.0➔ Trả về'Giỏi'Nếu
@DiemThi >= 6.5➔ Trả về'Khá'Ngược lại ➔ Trả về
'Trung bình'Viết câu lệnh
SELECThiển thịHoTen,DiemThivà cộtXepLoaibằng cách gọi hàmfn_XepLoaivừa tạo.
SQL
-- 1. Tạo Scalar Function xếp loại học viên
CREATE FUNCTION fn_XepLoai (@DiemThi FLOAT)
RETURNS NVARCHAR(20)
AS
BEGIN
DECLARE @KetQua NVARCHAR(20);
IF @DiemThi >= 8.0
SET @KetQua = N'Giỏi';
ELSE IF @DiemThi >= 6.5
SET @KetQua = N'Khá';
ELSE
SET @KetQua = N'Trung bình';
RETURN @KetQua;
END;
-- 2. Thực thi gọi hàm trong câu truy vấn
SELECT
HoTen,
DiemThi,
dbo.fn_XepLoai(DiemThi) AS XepLoai
FROM HocVien;
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

