Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tạo Function MySQL tính trung bình cột theo điều kiện

Tạo Stored Function

Function trả về giá trị đơn (scalar), dùng được trong SELECT, WHERE, ORDER BY.

Ví dụ

Tạo bảng:

CREATE TABLE DemoTable638 (Name VARCHAR(100), Marks INT);
INSERT INTO DemoTable638 VALUES
('John', 67), ('John', 90), ('David', 99), ('John', 60);

Tạo function tính trung bình Marks của 'John':

SET GLOBAL log_bin_trust_function_creators = 1;  -- Cần cho replication

DELIMITER //
CREATE FUNCTION getAverageDemo()
RETURNS INT
DETERMINISTIC
BEGIN
    DECLARE value INT;
    SELECT AVG(Marks) INTO value
    FROM DemoTable638
    WHERE Name = 'John';
    RETURN value;
END //
DELIMITER ;

Gọi function:

SELECT getAverageDemo();

Kết quả: 72 (AVG của 67, 90, 60 = 217/3 = 72.33 → INT truncate).

Giải thích các từ khóa

  • RETURNS INT: Kiểu trả về.
  • DETERMINISTIC: Cùng input → cùng output (cho phép caching, replication safe).
  • DECLARE value INT: Biến local.
  • SELECT ... INTO value: Gán kết quả query vào biến (phải trả về 1 dòng 1 cột).
  • RETURN value: Trả về kết quả.

Cải tiến: Function có tham số

CREATE FUNCTION getAverageByName(p_name VARCHAR(100))
RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
    DECLARE avg_val DECIMAL(10,2);
    SELECT AVG(Marks) INTO avg_val
    FROM DemoTable638
    WHERE Name = p_name;
    RETURN COALESCE(avg_val, 0);
END;

Sử dụng:

SELECT getAverageByName('John');  -- 72.33
SELECT getAverageByName('David'); -- 99.00
SELECT getAverageByName('Unknown'); -- 0

Function vs Procedure

Đặc điểmFUNCTIONPROCEDURE
Trả về1 giá trị (RETURN)0 hoặc nhiều result set (OUT params)
Gọi từSELECT, WHERE, ORDER BYCALL statement
DML (INSERT/UPDATE)Không cho phép (thường)Cho phép
TransactionKhôngCó

Lưu ý

  • log_bin_trust_function_creators=1 cần cho binary logging + replication.
  • Function nên DETERMINISTIC hoặc READS SQL DATA / NO SQL.
  • Tránh logic phức tạp, side-effect trong function.