SQL cung cấp các loại hàm (function) giúp thao tác và xử lý dữ liệu nhanh chóng, từ hàm tích hợp sẵn đến hàm do người dùng định nghĩa (User-Defined Functions – UDFs). Việc nắm vững các cách sử dụng function trong SQL sẽ mang lại lợi ích lớn trong việc truy xuất thông tin dễ dàng và chính xác hơn.

Đọc bài viết này để hiểu rõ hơn về:

  • Các loại function trong SQL và cách sử dụng từng loại function
  • Quy tắc cần tuân thủ khi tạo hàm

Function trong SQL

Trong SQL, hàm (function) là một tập hợp các lệnh được định nghĩa sẵn, nhằm thực hiện một công việc cụ thể và trả về một kết quả. Đây là công cụ hữu ích giúp xử lý và thao tác dữ liệu trực tiếp trong câu lệnh SQL. Các hàm này có thể nhận đầu vào, thực hiện xử lý và trả về kết quả dưới dạng một giá trị đơn hoặc một bảng dữ liệu.

Function trong SQL đóng vai trò quan trọng trong việc tự động hóa các tác vụ thường xuyên, giúp truy xuất thông tin từ cơ sở dữ liệu dễ dàng và chính xác hơn.

Tuy nhiên, cần lưu ý rằng hàm trong SQL chỉ dùng để truy vấn và tính toán, không được phép thực hiện các thao tác thay đổi dữ liệu như INSERT, DELETE, hay UPDATE trực tiếp trong bảng dữ liệu.

Đọc thêm: Tổng hợp 30+ câu lệnh, toán tử và ràng buộc SQL

Quy tắc cần tuân thủ khi tạo và sử dụng function trong SQL

  • Đặt tên hàm hợp lệ: Tên hàm phải duy nhất trong cơ sở dữ liệu và không bắt đầu bằng các ký tự đặc biệt như @, $, #,…
  • Chỉ hỗ trợ câu lệnh SELECT: Các hàm chỉ được sử dụng trong câu lệnh SELECT và không hỗ trợ các thao tác như INSERT, DELETE, hoặc UPDATE.
  • Tính linh hoạt: Có thể sử dụng hàm ở bất cứ đâu trong truy vấn SELECT, ví dụ như AVG, COUNT, SUM, MIN, DATE, …
  • Output: Hàm bắt buộc phải trả về một giá trị hoặc một kết quả cụ thể sau khi thực thi. Giá trị trả về có thể là một giá trị đơn lẻ hoặc một bảng.
  • Chỉ sử dụng tham số đầu vào: Các hàm chỉ nhận tham số đầu vào và không có tham số đầu ra.
  • Không hỗ trợ TRY và CATCH: Không thể sử dụng các câu lệnh TRY và CATCH trong hàm.

Function trong SQL do hệ thống định nghĩa sẵn

SQL phân loại các function thành hai loại chính: Function trong SQL do hệ thống định nghĩa sẵn (System function)Function trong SQL do người dùng định nghĩa (User-defined function). Mỗi loại có vai trò riêng, cho phép người dùng thực hiện các thao tác và truy vấn dữ liệu linh hoạt, hiệu quả hơn trong các hệ quản trị cơ sở dữ liệu (DBMS) khác nhau. Tuy nhiên, giữa các hệ quản trị có sự khác biệt nhất định, ví dụ như MySQL không hỗ trợ table-valued function như trong SQL Server.

System function là các hàm do hệ thống định nghĩa sẵn, hay còn gọi là các hàm tích hợp (built-in function). Các hàm này hỗ trợ người dùng thực hiện các thao tác phổ biến trên dữ liệu mà không cần tự xây dựng từ đầu. Các system function thường được sử dụng trong các câu lệnh SELECT để tính toán và xử lý dữ liệu.

Một số loại system function thông dụng trong SQL Server bao gồm:

SQL Server String Function

Các hàm chuỗi (String Functions) trong SQL Server giúp xử lý và thao tác trên dữ liệu dạng chuỗi như lấy độ dài chuỗi, ghép chuỗi hoặc chuyển đổi chữ thường/chữ hoa:

Hàm Mô tả
ASCII Trả về giá trị ASCII của ký tự cụ thể
CHAR Trả về ký tự dựa trên mã ASCII
CHARINDEX Trả về vị trí của một chuỗi con trong chuỗi
CONCAT Ghép hai hoặc nhiều chuỗi lại với nhau
Concat with + Ghép hai hoặc nhiều chuỗi lại với nhau bằng toán tử ‘+’
CONCAT_WS Ghép hai hoặc nhiều chuỗi lại với nhau với một ký tự phân cách (bỏ qua giá trị NULL)
DATALENGTH Trả về số byte được dùng để biểu diễn một biểu thức
DIFFERENCE So sánh hai giá trị SOUNDEX và trả về một số nguyên
FORMAT Định dạng một giá trị số hoặc ngày theo định dạng chỉ định (áp dụng cho SQL Server 2012 trở lên)
LEFT Trích xuất một số ký tự từ chuỗi (từ trái sang)
LEN Trả về độ dài của chuỗi
LOWER Chuyển chuỗi thành chữ thường
LTRIM Loại bỏ khoảng trắng ở đầu chuỗi
NCHAR Trả về ký tự Unicode dựa trên mã số
PATINDEX Trả về vị trí của một mẫu trong chuỗi
QUOTENAME Thêm dấu phân cách vào chuỗi để làm cho chuỗi đó trở thành một định danh SQL hợp lệ
REPLACE Thay thế tất cả các chuỗi con trong chuỗi bằng một chuỗi con mới
REPLICATE Lặp lại một chuỗi số lần chỉ định
REVERSE Đảo ngược chuỗi và trả về kết quả
RIGHT Trích xuất một số ký tự từ chuỗi (từ phải sang)
RTRIM Loại bỏ khoảng trắng ở cuối chuỗi
SOUNDEX Trả về một mã bốn ký tự để đánh giá sự tương đồng của hai chuỗi
SPACE Trả về một chuỗi chứa một số lượng ký tự khoảng trắng xác định
STR Chuyển đổi một số thành dạng chuỗi với độ dài chuỗi và độ chính xác thập phân được chỉ định.
STUFF Xóa một phần của chuỗi và chèn một phần khác vào chuỗi tại vị trí chỉ định
SUBSTRING Trích xuất một số ký tự từ chuỗi
TRANSLATE Trả về chuỗi sau khi các ký tự được thay thế bằng ký tự khác
TRIM Loại bỏ khoảng trắng ở đầu và cuối chuỗi
UNICODE Trả về mã Unicode của ký tự đầu tiên trong biểu thức đầu vào
UPPER Chuyển chuỗi thành chữ hoa

SQL Server Math/Numeric Function

Các hàm số học trong SQL Server giúp thực hiện các phép tính toán, tính giá trị tuyệt đối, giá trị trung bình hoặc số ngẫu nhiên và các phép toán toán học khác: 

Hàm Mô tả
ABS Trả về giá trị tuyệt đối của một số
ACOS Trả về arc cosin của một số
ASIN Trả về arc sin của một số
ATAN Trả về arc tangent của một số
ATN2 Trả về arc tangent của tỷ số giữa hai số, tương ứng với ATAN(y/x)
AVG Trả về giá trị trung bình của một biểu thức
CEILING Trả về giá trị nguyên nhỏ nhất lớn hơn hoặc bằng số đã cho
COUNT Trả về số lượng các giá trị không NULL trong một cột hoặc tổng số bản ghi khi dùng COUNT(*)
COS Trả về cosin của một số
COT Trả về cotangent của một số
DEGREES Chuyển giá trị từ radian sang độ
EXP Trả về lũy thừa của e (số Euler) với một số xác định
FLOOR Trả về giá trị nguyên lớn nhất nhỏ hơn hoặc bằng số đã cho
LOG Trả về logarit tự nhiên của một số hoặc logarit theo cơ số chỉ định
LOG10 Trả về logarit tự nhiên của một số cơ số 10
MAX Trả về giá trị lớn nhất trong một tập giá trị
MIN Trả về giá trị nhỏ nhất trong một tập giá trị
PI Trả về giá trị của PI
POWER Trả về giá trị của một số lũy thừa với số khác
RADIANS Chuyển giá trị từ độ sang radian
RAND Trả về một số ngẫu nhiên
ROUND Làm tròn một số đến số chữ số thập phân chỉ định
SIGN Trả về dấu của một số
SIN Trả về sin của một số
SQRT Trả về căn bậc hai của một số
SQUARE Trả về bình phương của một số
SUM Tính tổng các giá trị trong một tập hợp
TAN Trả về tangent của một số

SQL Server Date Function

Các hàm ngày tháng trong SQL Server giúp thao tác với các dữ liệu ngày và giờ như lấy ngày hiện tại, tính toán khoảng thời gian hoặc trích xuất các thành phần ngày tháng cụ thể:

Hàm Mô tả
CURRENT_TIMESTAMP Trả về ngày và giờ hiện tại, tương đương với GETDATE nhưng không nhận tham số
DATEADD Thêm một khoảng thời gian vào một ngày rồi trả về ngày mới
DATEDIFF Trả về khoảng cách giữa hai ngày
DATEFROMPARTS Trả về một ngày từ các thành phần chỉ định (năm, tháng, ngày)
DATENAME Trả về một phần cụ thể của ngày (dưới dạng chuỗi)
DATEPART Trả về một phần cụ thể của ngày (dưới dạng số nguyên)
DAY Trả về ngày trong tháng từ một ngày cụ thể
GETDATE Trả về ngày giờ hiện tại của hệ thống cơ sở dữ liệu
GETUTCDATE Trả về ngày giờ UTC hiện tại của hệ thống cơ sở dữ liệu
ISDATE Kiểm tra một biểu thức và trả về 1 nếu là ngày hợp lệ, ngược lại trả về 0
MONTH Trả về phần tháng từ một ngày nhất định (một số từ 1 đến 12)
SYSDATETIME Trả về ngày giờ hiện tại của hệ thống SQL Server
YEAR Trả về năm từ một ngày nhất định

SQL Server Advanced Function

Các hàm nâng cao trong SQL Server hỗ trợ các phép biến đổi, kiểm tra kiểu dữ liệu và điều kiện logic, giúp xử lý các tình huống phức tạp hơn khi truy vấn dữ liệu:

Hàm Mô tả
CAST Chuyển đổi giá trị (của bất kỳ loại nào) thành kiểu dữ liệu chỉ định
COALESCE Trả về giá trị đầu tiên không phải NULL trong một danh sách
CONVERT Chuyển đổi giá trị (của bất kỳ loại nào) thành kiểu dữ liệu chỉ định
CURRENT_USER Trả về tên của người dùng hiện tại trong cơ sở dữ liệu SQL Server
IIF Trả về một giá trị nếu điều kiện là TRUE, hoặc giá trị khác nếu điều kiện là FALSE
ISNULL Trả về giá trị chỉ định nếu biểu thức là NULL, nếu không thì trả về biểu thức
ISNUMERIC Kiểm tra liệu một biểu thức có phải là số
NULLIF Trả về NULL nếu hai biểu thức bằng nhau
SESSION_USER Trả về tên của người dùng hiện tại trong cơ sở dữ liệu SQL Server
SESSIONPROPERTY Trả về giá trị của một thuộc tính phiên chỉ định, chẳng hạn như LANGUAGE hoặc ISOLATION LEVEL
SYSTEM_USER Trả về tên đăng nhập của người dùng hiện tại
USER_ Trả về tên người dùng cơ sở dữ liệu dựa trên ID chỉ định

Một số ví dụ

Cú pháp và cách triển khai có thể thay đổi tùy theo hệ quản trị. Dưới đây là ví dụ về cú pháp trong SQL Server:

Ví dụ để tính giá trị trung bình của một cột, sử dụng cú pháp:

SELECT AVG(So_luong) FROM Ten_bang;

Ví dụ để kiểm tra nếu một giá trị là NULL và thay thế bằng một giá trị khác nếu đúng, dùng cú pháp:

SELECT ISNULL(ten_cot, 'Gia_tri_mac_dinh') FROM Ten_bang;

Ví dụ để nối chuỗi trong SQL Server, ta có thể dùng cú pháp:

SELECT CONCAT('Hello', ' ', 'World!');

Câu lệnh trên trả về chuỗi ‘Hello World!’.

Function trong SQL do người dùng định nghĩa

User-defined function (UDF) là các hàm do người dùng tạo ra, được lưu trữ trong cơ sở dữ liệu của hệ thống hoặc trong các cơ sở dữ liệu người dùng định nghĩa. UDF giúp đơn giản hóa mã truy vấn và tăng tính đọc hiểu của truy vấn SQL. Các user-defined function chủ yếu có hai loại:

Scalar Function

Scalar Function là loại hàm trả về một giá trị duy nhất, có thể là kiểu số, chuỗi, ngày giờ,… Chúng thường được sử dụng để thực hiện các phép tính đơn giản hoặc thao tác với các giá trị cụ thể.

Cú pháp:

CREATE FUNCTION function_name (parameter1 datatype, parameter2 datatype, ...) 

RETURNS return_datatype 

AS

BEGIN 

-- Phần thân hàm RETURN (giá trị trả về); 

END;

Ví dụ để tạo một scalar function để tính diện tích hình tròn dựa trên bán kính ta sử dụng cú pháp sau:

CREATE FUNCTION dbo.CircleArea (@radius FLOAT) 

RETURNS FLOAT 

AS 

BEGIN 

   RETURN PI() * @radius *@radius; 

END;

Để sử dụng hàm trên ta thực thi cú pháp:

SELECT dbo.CircleArea(5) AS Area; -- Kết quả: 78.5398

Table-Valued Function

Table-Valued Function (TVF) trả về một tập hợp kết quả dưới dạng bảng và cho phép người dùng sử dụng nó trong các câu truy vấn như JOIN hoặc APPLY để lấy dữ liệu động.

Cú pháp:

CREATE FUNCTION function_name (parameter1 datatype, parameter2 datatype, ...) 

RETURNS TABLE 

AS 

RETURN 

(

     -- Câu truy vấn trả về bảng 

     SELECT column1, column2, ... 

     FROM table_name 

     WHERE condition 

);

Ví dụ để tạo một table-valued function trả về danh sách sản phẩm có giá lớn hơn một mức nhất định ta có thể sử dụng cú pháp sau:

CREATE FUNCTION dbo.ExpensiveProducts (@min_price DECIMAL) 

RETURNS TABLE 

AS 

RETURN 



     SELECTProductID, ProductName, Price

     FROM Products 

     WHERE Price > @min_price 

);

Để sử dụng hàm trên ta dùng cú pháp:

SELECT * FROM dbo.ExpensiveProducts(500); -- Lấy danh sách sản phẩm có giá > 500

Các câu hỏi thường gặp về Function trong SQL

Khi nào nên sử dụng table-valued function?

TVFs nên được dùng khi cần trả về một tập dữ liệu động có tham số và có thể sử dụng như bảng trong truy vấn. Chúng rất hữu ích cho các view có tham số và linh hoạt hơn stored procedures vì có thể được dùng trong JOINAPPLY trong các truy vấn phức tạp.

Có thể thay đổi dữ liệu bên trong function không?

Không, function trong SQL thường chỉ dùng để xử lý và trả về dữ liệu chứ không thể thay đổi dữ liệu bên trong cơ sở dữ liệu (không thể dùng các câu lệnh như INSERT, UPDATE, DELETE trực tiếp).

Function có thể nhận tham số không?

Có, function có thể nhận tham số để xử lý dữ liệu đầu vào, cho phép tùy chỉnh kết quả trả về dựa trên các giá trị tham số.

Function khác gì với thủ tục?

Function phải trả về một giá trị (có thể là một bảng), thường dùng trong các truy vấn. Thủ tục (Stored Procedure) linh hoạt hơn, có thể thực hiện nhiều tác vụ như thay đổi dữ liệu, và không nhất thiết phải trả về giá trị.

Bạn có thể tìm hiểu thêm về thủ tục trong SQL tại đây.

Tổng kết function trong SQL

Hiểu rõ về các loại function trong SQL và cách sử dụng chúng giúp bạn linh hoạt hơn khi làm việc với dữ liệu. Việc áp dụng đúng các loại hàm không chỉ giúp tăng tốc độ xử lý mà còn giúp truy vấn trở nên đơn giản và dễ hiểu hơn, nâng cao hiệu quả quản lý và phân tích dữ liệu trong các hệ thống SQL.

ITviec hy vọng bài viết trên đã giúp bạn có cái nhìn chi tiết hơn về hàm trong SQL.