Chức năng MySQL là gì?

Hàm là một khối mã có tổ chức, có thể sử dụng lại được dùng để thực hiện một hành động đơn lẻ có liên quan. Các chức năng cung cấp tính mô-đun tốt hơn cho ứng dụng của bạn và mức độ tái sử dụng mã cao

MySQL cung cấp một bộ hàm dựng sẵn thực hiện các tác vụ cụ thể, ví dụ hàm CURDATE() trả về ngày hiện tại

Bạn có thể tạo một hàm được lưu trữ bằng cách sử dụng câu lệnh CREATE FUNCTION

cú pháp

Sau đây là cú pháp câu lệnh CREATE FUNCTION -

CREATE FUNCTION function_Name(input_arguments) RETURNS output_parameter

Trong đó, function_name là tên hàm bạn cần tạo, input_arguments là giá trị đầu vào của hàm và output_parameter là giá trị trả về của hàm

ví dụ 1

Giả sử chúng ta đã tạo một bảng có tên Emp trong cơ sở dữ liệu bằng cách sử dụng câu lệnh CREATE như hình dưới đây -

mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)

Và chúng tôi đã chèn ba bản ghi vào bảng Emp dưới dạng -

mysql> INSERT INTO Emp VALUES ('Amit', DATE('1970-01-08'), 'Hyderabad');
mysql> INSERT INTO Emp VALUES ('Sumith', DATE('1990-11-02'), 'Vishakhapatnam');
mysql> INSERT INTO Emp VALUES ('Sudha', DATE('1980-11-06'), 'Vijayawada');

Truy vấn sau tạo một hàm có tên getDob() chấp nhận tên của nhân viên, truy xuất và trả về giá trị của cột DOB

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;

Nếu bạn gọi hàm, bạn có thể nhận được ngày sinh của một nhân viên như hình bên dưới -

mysql> SELECT getDob('Amit');
+----------------+
| getDob('Amit') |
+----------------+
| 1970-01-08     |
+----------------+
1 row in set (0.15 sec)

ví dụ 2

Giả sử chúng ta đã tạo một bảng khác như hình bên dưới -

CREATE TABLE student (Name VARCHAR(100), Math INT, English INT, Science INT, History INT);
INSERT INTO student values('Raman', 95, 89, 85, 81);
INSERT INTO student values('Rahul' , 90, 87, 86, 81);
INSERT INTO student values('Mohit', 90, 85, 86, 81);
INSERT INTO student values('Saurabh', NULL, NULL, NULL, NULL );

Truy vấn sau tạo một hàm có tên tbl_Update −

mysql> DELIMITER //
Create Function tbl_Update(S_name Varchar(50), M1 INT, M2 INT, M3 INT, M4 INT)
   RETURNS INT
   DETERMINISTIC
   BEGIN
   UPDATE student SET Math = M1, English = M2, Science = M3, History = M4 WHERE Name = S_name;
   RETURN 1;
   END //
mysql> DELIMITER ;

Bạn có thể gọi hàm đã tạo ở trên như hình bên dưới -

mysql> Select tbl_update('Saurabh',85,69,75,82);
+-----------------------------------+
| tbl_update('Saurabh',85,69,75,82) |
+-----------------------------------+
| 1                                 |
+-----------------------------------+
1 row in set (0.28 sec)

Nếu bạn lấy các bản ghi của bảng student bằng câu lệnh select, bạn có thể quan sát bản ghi đã sửa đổi -

Câu lệnh CREATE FUNCTION được sử dụng để tạo một hàm được lưu trữ và các hàm do người dùng định nghĩa. Hàm được lưu trữ là một tập hợp các câu lệnh SQL thực hiện một số thao tác và trả về một giá trị

Bản tóm tắt. trong hướng dẫn này, bạn sẽ học cách tạo các hàm được lưu trữ bằng cách sử dụng câu lệnh

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;
3

Hàm được lưu trữ là một chương trình được lưu trữ loại đặc biệt trả về một giá trị duy nhất. Thông thường, bạn sử dụng các hàm được lưu trữ để đóng gói các công thức hoặc quy tắc kinh doanh phổ biến có thể sử dụng lại giữa các câu lệnh SQL hoặc các chương trình được lưu trữ

Khác với một thủ tục được lưu trữ, bạn có thể sử dụng một hàm được lưu trữ trong các câu lệnh SQL ở bất cứ nơi nào một biểu thức được sử dụng. Điều này giúp cải thiện khả năng đọc và khả năng bảo trì của mã thủ tục

Để tạo một chức năng được lưu trữ, bạn sử dụng câu lệnh

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;
3

Cú pháp MySQL mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50)) RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected (0.31 sec) mysql> DELIMITER ; 3

Sau đây minh họa cú pháp cơ bản để tạo một hàm được lưu trữ mới

________số 8

Trong cú pháp này

Trước tiên, hãy chỉ định tên của hàm được lưu trữ mà bạn muốn tạo sau từ khóa

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;
3  

Thứ hai, liệt kê tất cả các tham số của hàm được lưu trữ bên trong dấu ngoặc đơn theo sau là tên hàm. Theo mặc định, tất cả các tham số là tham số

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
0. Bạn không thể chỉ định công cụ sửa đổi

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
0 ,

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
2 hoặc

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
3 cho tham số

Thứ ba, chỉ định loại dữ liệu của giá trị trả về trong câu lệnh

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
4, có thể là bất kỳ loại dữ liệu MySQL hợp lệ nào

Thứ tư, chỉ định xem một hàm có xác định hay không bằng cách sử dụng từ khóa

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5

Hàm xác định luôn trả về cùng một kết quả cho cùng một tham số đầu vào trong khi hàm không xác định trả về các kết quả khác nhau cho cùng một tham số đầu vào

Nếu bạn không sử dụng

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
5 hoặc

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
7, MySQL sẽ sử dụng tùy chọn

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
7 theo mặc định

Thứ năm, viết mã trong phần thân của hàm được lưu trữ trong khối

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)
9. Trong phần nội dung, bạn cần chỉ định ít nhất một câu lệnh
mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
90. Câu lệnh
mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
90 trả về một giá trị cho các chương trình đang gọi. Bất cứ khi nào đạt đến câu lệnh
mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
90, việc thực thi chức năng được lưu trữ sẽ bị chấm dứt ngay lập tức

Ví dụ về MySQL mysql> DELIMITER // mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50)) RETURNS DATE DETERMINISTIC BEGIN declare dateOfBirth DATE; select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement return dateOfBirth; END// Query OK, 0 rows affected (0.31 sec) mysql> DELIMITER ; 3

Hãy lấy ví dụ về việc tạo một chức năng được lưu trữ. Chúng tôi sẽ sử dụng bảng

mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
94 trong cơ sở dữ liệu mẫu để trình diễn

Chức năng MySQL là gì?
Chức năng MySQL là gì?

Câu lệnh

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;
3 sau đây tạo một hàm trả về cấp khách hàng dựa trên tín dụng

DELIMITER $$ CREATE FUNCTION CustomerLevel( credit DECIMAL(10,2) ) RETURNS VARCHAR(20) DETERMINISTIC BEGIN DECLARE customerLevel VARCHAR(20); IF credit > 50000 THEN SET customerLevel = 'PLATINUM'; ELSEIF (credit >= 50000 AND credit <= 10000) THEN SET customerLevel = 'GOLD'; ELSEIF credit < 10000 THEN SET customerLevel = 'SILVER'; END IF; -- return the customer level RETURN (customerLevel); END$$ DELIMITER ;

Code language: SQL (Structured Query Language) (sql)

Sau khi chức năng được tạo, bạn có thể xem nó trong MySQL Workbench trong phần Chức năng

Chức năng MySQL là gì?
Chức năng MySQL là gì?

Hoặc bạn có thể xem tất cả các chức năng được lưu trữ trong cơ sở dữ liệu

mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
96 hiện tại bằng cách sử dụng
mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
97 như sau

mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
9
Chức năng MySQL là gì?
Chức năng MySQL là gì?

Gọi hàm được lưu trữ trong câu lệnh SQL

Câu lệnh sau sử dụng hàm được lưu trữ

mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
98

mysql> INSERT INTO Emp VALUES ('Amit', DATE('1970-01-08'), 'Hyderabad');
mysql> INSERT INTO Emp VALUES ('Sumith', DATE('1990-11-02'), 'Vishakhapatnam');
mysql> INSERT INTO Emp VALUES ('Sudha', DATE('1980-11-06'), 'Vijayawada');
8
Chức năng MySQL là gì?
Chức năng MySQL là gì?

Gọi một hàm được lưu trữ trong một thủ tục được lưu trữ

Câu lệnh sau đây tạo một thủ tục được lưu trữ mới gọi hàm được lưu trữ

mysql> CREATE TABLE Emp(Name VARCHAR(255), DOB DATE, Location VARCHAR(255));
Query OK, 0 rows affected (2.03 sec)
99

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;
0

Phần sau đây minh họa cách gọi thủ tục được lưu trữ

mysql> INSERT INTO Emp VALUES ('Amit', DATE('1970-01-08'), 'Hyderabad');
mysql> INSERT INTO Emp VALUES ('Sumith', DATE('1990-11-02'), 'Vishakhapatnam');
mysql> INSERT INTO Emp VALUES ('Sudha', DATE('1980-11-06'), 'Vijayawada');
80

mysql> DELIMITER //
mysql> CREATE FUNCTION test.getDob(emp_name VARCHAR(50))
   RETURNS DATE
   DETERMINISTIC
   BEGIN
      declare dateOfBirth DATE;
      select DOB into dateOfBirth from test.emp where Name = emp_name; MySQL CREATE FUNCTION Statement
         return dateOfBirth;
   END//
Query OK, 0 rows affected (0.31 sec)
mysql> DELIMITER ;
2

Điều quan trọng cần lưu ý là nếu một hàm được lưu trữ chứa các câu lệnh SQL truy vấn dữ liệu từ các bảng, thì bạn không nên sử dụng nó trong các câu lệnh SQL khác;

Trong hướng dẫn này, bạn đã học cách tạo một hàm được lưu trữ để đóng gói công thức chung hoặc quy tắc kinh doanh

Tại sao các chức năng được sử dụng trong MySQL?

Chức năng cho phép chúng tôi nâng cao khả năng của MySQL . Các hàm luôn trả về một giá trị và có thể tùy chọn chấp nhận các tham số. Các chức năng tích hợp là các chức năng được cung cấp cùng với MySQL. Chúng có thể được phân loại theo các loại dữ liệu mà chúng hoạt động trên i. e. chuỗi, ngày và số được xây dựng trong chức năng.

Các chức năng khác nhau trong MySQL là gì?

Các chức năng nâng cao của MySQL

Hai loại chức năng trong MySQL là gì?

Trong MySQL, chúng ta có các loại hàm khác nhau. Hàm chuỗi . hàm số.

Chúng ta có thể tạo các chức năng trong MySQL không?

Câu lệnh CREATE FUNCTION cũng được sử dụng trong MySQL để hỗ trợ các hàm có thể tải . Xem Phần 13. 7. 4. 1, “CREATE FUNCTION Statement for Loadable Functions”. Một chức năng có thể tải có thể được coi là một chức năng được lưu trữ bên ngoài.