Nội dung chính
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.
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) và 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 JOIN và APPLY 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.