MySQL - Hàm Lưu Trữ

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng lặn sâu vào thế giới kỳ diệu của các Hàm Lưu Trữ MySQL. Là người giáo viên máy tính gần gũi của bạn, tôi rất háo hức dẫn dắt bạn trong hành trình này, ngay cả khi bạn chưa bao giờ viết một dòng mã trước đây. Vậy, hãy lấy một ly đồ uống yêu thích của bạn, và chúng ta cùng bắt đầu!

MySQL - Stored Functions

Hàm Lưu Trữ MySQL Là Gì?

Hãy tưởng tượng bạn có một cuốn sách công thức ma thuật có thể ngay lập tức nấu ra món ăn yêu thích của bạn bất cứ khi nào bạn cần. Đó chính là điều mà các Hàm Lưu Trữ MySQL làm cho cơ sở dữ liệu! Chúng giống như những công thức viết sẵn (hoặc hàm) mà bạn có thể gọi khi cần thực hiện một nhiệm vụ cụ thể trong cơ sở dữ liệu của bạn.

Tại Sao Sử Dụng Hàm Lưu Trữ?

  1. Tái Sử Dụng: Viết một lần, sử dụng nhiều lần!
  2. Đ一致性: Đảm bảo logic giống nhau được áp dụng ở mọi nơi.
  3. An Toàn: Kiểm soát ai có thể truy cập và chỉnh sửa hàm của bạn.
  4. Hiệu Suất: Chúng có thể nhanh hơn việc viết cùng một mã nhiều lần.

Bây giờ, hãy cởi bỏ áo khoác và tạo hàm lưu trữ đầu tiên của chúng ta!

Tạo Hàm Lưu Trữ Đầu Tiên

Dưới đây là một ví dụ đơn giản để bắt đầu:

DELIMITER //

CREATE FUNCTION HelloWorld() 
RETURNS VARCHAR(50)
DETERMINISTIC
BEGIN
    RETURN 'Hello, World!';
END //

DELIMITER ;

Hãy phân tích này:

  1. DELIMITER //: Điều này cho biết MySQL sử dụng // làm bộ phân cách câu lệnh thay vì dấu phẩy đơn (;) mặc định. Chúng ta làm điều này vì hàm của chúng ta chứa dấu phẩy đơn, và chúng ta không muốn MySQL nhầm lẫn.

  2. CREATE FUNCTION HelloWorld(): Dòng này宣布 rằng chúng ta đang tạo một hàm tên là "HelloWorld".

  3. RETURNS VARCHAR(50): Điều này xác định rằng hàm của chúng ta sẽ trả về một chuỗi (VARCHAR) lên tới 50 ký tự.

  4. DETERMINISTIC: Từ khóa này cho biết với cùng một đầu vào, hàm sẽ luôn trả về cùng một đầu ra.

  5. BEGINEND: Các từ khóa này bao quanh thân của hàm chúng ta.

  6. RETURN 'Hello, World!';: Đây là mã thực tế của hàm chúng ta. Nó đơn giản trả về chuỗi "Hello, World!".

  7. DELIMITER ;: Điều này đặt bộ phân cách lại thành dấu phẩy đơn mặc định.

Bây giờ, hãy gọi hàm của chúng ta:

SELECT HelloWorld();

Và voilà! Bạn nên thấy "Hello, World!" là kết quả. Chúc mừng, bạn vừa tạo và gọi hàm lưu trữ đầu tiên của mình!

Tham Số và Biến trong Hàm Lưu Trữ

Hãy làm cho mọi thứ thú vị hơn bằng cách thêm tham số và biến vào hàm của chúng ta.

DELIMITER //

CREATE FUNCTION Greet(name VARCHAR(50))
RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN
    DECLARE greeting VARCHAR(100);
    SET greeting = CONCAT('Hello, ', name, '! Welcome to MySQL functions!');
    RETURN greeting;
END //

DELIMITER ;

Trong ví dụ này:

  1. Chúng ta đã thêm một tham số name VARCHAR(50) vào hàm của mình.
  2. Chúng ta đã宣布 một biến greeting sử dụng từ khóa DECLARE.
  3. Chúng ta sử dụng từ khóa SET để gán giá trị cho biến của mình.
  4. Chúng ta đã sử dụng hàm CONCAT để kết hợp các chuỗi.

Hãy gọi hàm mới của chúng ta:

SELECT Greet('Alice');

Điều này nên trả về: "Hello, Alice! Welcome to MySQL functions!"

Sử Dụng Hàm Lưu Trữ với Dữ Liệu Cơ Sở Dữ Liệu

Bây giờ, hãy tạo một hàm thực sự tương tác với cơ sở dữ liệu của chúng ta. Giả sử chúng ta có một bảng叫做 employees với các cột id, first_name, last_name, và salary.

DELIMITER //

CREATE FUNCTION CalculateBonus(employee_id INT)
RETURNS DECIMAL(10,2)
READS SQL DATA
BEGIN
    DECLARE employee_salary DECIMAL(10,2);
    DECLARE bonus DECIMAL(10,2);

    SELECT salary INTO employee_salary
    FROM employees
    WHERE id = employee_id;

    SET bonus = employee_salary * 0.1;

    RETURN bonus;
END //

DELIMITER ;

Hàm này:

  1. Nhận employee_id làm đầu vào. 2.宣布 các biến employee_salarybonus.
  2. Lấy lương của nhân viên từ bảng employees.
  3. Tính bonus 10% dựa trên lương.
  4. Trả về bonus đã tính.

Để sử dụng hàm này:

SELECT first_name, last_name, CalculateBonus(id) AS bonus
FROM employees
WHERE id = 1;

Điều này sẽ trả về tên đầu tiên, tên cuối cùng và bonus đã tính cho nhân viên có id là 1.

Luồng Điều Khiển trong Hàm Lưu Trữ

Hãy cải thiện việc tính bonus bằng cách thêm luồng điều khiển:

DELIMITER //

CREATE FUNCTION CalculateBonusTier(employee_id INT)
RETURNS VARCHAR(20)
READS SQL DATA
BEGIN
    DECLARE employee_salary DECIMAL(10,2);
    DECLARE bonus_tier VARCHAR(20);

    SELECT salary INTO employee_salary
    FROM employees
    WHERE id = employee_id;

    IF employee_salary < 30000 THEN
        SET bonus_tier = 'Bronze';
    ELSEIF employee_salary < 50000 THEN
        SET bonus_tier = 'Silver';
    ELSE
        SET bonus_tier = 'Gold';
    END IF;

    RETURN bonus_tier;
END //

DELIMITER ;

Hàm này sử dụng IF, ELSEIF, và ELSE để xác định cấp bonus dựa trên lương của nhân viên.

Gọi Hàm Lưu Trữ Từ Thủ tục Lưu Trữ

Cuối cùng, hãy xem cách chúng ta có thể sử dụng hàm lưu trữ trong một thủ tục lưu trữ:

DELIMITER //

CREATE PROCEDURE EmployeeBonusReport(IN emp_id INT)
BEGIN
    DECLARE emp_name VARCHAR(100);
    DECLARE emp_bonus DECIMAL(10,2);
    DECLARE emp_bonus_tier VARCHAR(20);

    SELECT CONCAT(first_name, ' ', last_name) INTO emp_name
    FROM employees
    WHERE id = emp_id;

    SET emp_bonus = CalculateBonus(emp_id);
    SET emp_bonus_tier = CalculateBonusTier(emp_id);

    SELECT emp_name AS 'Employee Name',
           emp_bonus AS 'Bonus Amount',
           emp_bonus_tier AS 'Bonus Tier';
END //

DELIMITER ;

Thủ tục này:

  1. Nhận id nhân viên làm đầu vào.
  2. Lấy tên đầy đủ của nhân viên.
  3. Gọi hàm CalculateBonus để lấy bonus.
  4. Gọi hàm CalculateBonusTier để lấy cấp bonus.
  5. Trả về báo cáo với tên nhân viên, số tiền bonus và cấp bonus.

Để gọi thủ tục này:

CALL EmployeeBonusReport(1);

Và thế là xong! Chúng ta đã bao gồm các nguyên tắc cơ bản của các Hàm Lưu Trữ MySQL, từ việc tạo ra chúng đến việc sử dụng chúng trong thủ tục lưu trữ. Nhớ rằng, thực hành là chìa khóa của sự hoàn hảo, vì vậy đừng ngần ngại thử nghiệm với các hàm của riêng bạn. Chúc các bạn may mắn với việc lập mã!

Credits: Image by storyset