MySQL - 저장된 함수

안녕하세요, 데이터베이스 열정가 여러분! 오늘 우리는 MySQL 저장된 함수의 fascineting 세계로 뛰어들어 보겠습니다. 여러분의 친절한 이웃 컴퓨터 교사로서, 저는 여러분이 코드를 한 줄도 적지 않았더라도 이 여정을 안내해 드리게 되어 기쁩니다. 그러니 마음에 드는 음료 한 잔을 손에 들고, 시작해 보세요!

MySQL - Stored Functions

MySQL 저장된 함수는 무엇인가요?

당신이 마법의 레시피책을 가지고 있어서 언제든지 좋아하는 요리를瞬间에 만들 수 있다고 상상해 보세요. MySQL 저장된 함수는 데이터베이스에 대해 이와 같은 역할을 합니다! 그들은 마치 미리 작성된 레시피(또는 함수)로, 데이터베이스에서 특정 작업을 수행할 때마다 호출할 수 있는 것입니다.

저장된 함수를 사용하는 이유는 무엇인가요?

  1. 재사용성: 한 번 작성하고 여러 번 사용할 수 있습니다!
  2. 일관성: 어디서나 동일한 논리가 적용되도록 보장합니다.
  3. 보안: 누가 함수에 접근하고 수정할 수 있는지 통제할 수 있습니다.
  4. 성능: 동일한 코드를 반복적으로 작성하는 것보다 빠를 수 있습니다.

이제 손을 dirt하고 우리의 첫 번째 저장된 함수를 만들어 보겠습니다!

첫 번째 저장된 함수 만들기

다음은 우리가 시작하기 위해 간단한 예제를 보여줍니다:

DELIMITER //

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

DELIMITER ;

이를 간단히 설명하자면:

  1. DELIMITER //: 이는 MySQL이 기본적인 문장 구분자인 세미콜론(;) 대신 //를 사용하도록 지시합니다. 우리의 함수에 세미콜론이 포함되어 있기 때문에 MySQL이 혼동하지 않도록 합니다.

  2. CREATE FUNCTION HelloWorld(): 이 줄은 우리가 "HelloWorld"라는 이름의 함수를 만들고 있다고 선언합니다.

  3. RETURNS VARCHAR(50): 이는 우리의 함수가 최대 50자까지의 문자열(VARCHAR)을 반환할 것임을 지정합니다.

  4. DETERMINISTIC: 이 키워드는 MySQL이 동일한 입력에 대해 함수가 항상 동일한 출력을 반환할 것임을 알립니다.

  5. BEGINEND: 이 키워드들은 우리의 함수 본문을 감싸고 있습니다.

  6. RETURN 'Hello, World!';: 이는 우리의 함수의 실제 코드입니다. 이는 단순히 "Hello, World!" 문자열을 반환합니다.

  7. DELIMITER ;: 이는 구분자를 기본적인 세미콜론으로 되돌립니다.

이제 우리의 함수를 호출해 보겠습니다:

SELECT HelloWorld();

그러면 "Hello, World!"가 결과로 나타날 것입니다. 축하합니다, 첫 번째 저장된 함수를 만들고 호출했습니다!

저장된 함수에서 매개변수와 변수 사용하기

이제 우리의 함수에 매개변수와 변수를 추가하여 더 흥미롭게 만들어 보겠습니다.

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 ;

이 예제에서:

  1. 우리는 함수에 name VARCHAR(50) 매개변수를 추가했습니다.
  2. 우리는 DECLARE 키워드를 사용하여 greeting 변수를 선언했습니다.
  3. 우리는 SET 키워드를 사용하여 변수에 값을 할당했습니다.
  4. 우리는 CONCAT 함수를 사용하여 문자열을 결합했습니다.

이제 우리의 새로운 함수를 호출해 보겠습니다:

SELECT Greet('Alice');

이는 "Hello, Alice! Welcome to MySQL functions!"를 반환해야 합니다.

데이터베이스 데이터와 저장된 함수 사용하기

이제 우리는 데이터베이스와 상호작용하는 함수를 만들어 보겠습니다. 가정해 봅시다. 우리가 employees라는 테이블이 있고, 이 테이블에 id, first_name, last_name, 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 ;

이 함수는:

  1. employee_id를 입력으로 받습니다.
  2. employee_salarybonus 변수를 선언합니다.
  3. employees 테이블에서 직원의 급여를 가져옵니다.
  4. 급여의 10%를 보너스로 계산합니다.
  5. 계산된 보너스를 반환합니다.

이 함수를 사용하려면:

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

이는 id가 1인 직원의 이름, 성, 그리고 계산된 보너스를 반환합니다.

저장된 함수에서 제어 흐름 사용하기

보너스 계산을 더욱 향상시키기 위해 제어 흐름을 추가해 보겠습니다.

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 ;

이 함수는 IF, ELSEIF, 그리고 ELSE를 사용하여 직원의 급여에 따른 보너스 등급을 결정합니다.

저장된 절차에서 저장된 함수 호출하기

마지막으로, 우리는 저장된 함수를 저장된 절차 내에서 사용하는 방법을 살펴보겠습니다:

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 ;

이 저장된 절차는:

  1. 직원 ID를 입력으로 받습니다.
  2. 직원의 전체 이름을 가져옵니다.
  3. CalculateBonus 함수를 호출하여 보너스 금액을 가져옵니다.
  4. CalculateBonusTier 함수를 호출하여 보너스 등급을 가져옵니다.
  5. 직원의 이름, 보너스 금액, 그리고 보너스 등급을 반환합니다.

이 절차를 호출하려면:

CALL EmployeeBonusReport(1);

그리고 여기서 우리는 MySQL 저장된 함수의 기본적인 내용을 다루었고, 저장된 절차 내에서의 사용법도 배웠습니다. 연습이 완벽을 이루는 열쇠이니, 자신의 함수로 실험해 보세요. 행복한 코딩을 기원합니다!

MySQL 함수 메서드
CREATE FUNCTION
RETURNS
DETERMINISTIC
BEGIN...END
DECLARE
SET
IF...ELSEIF...ELSE
SELECT...INTO
RETURN

Credits: Image by storyset