πŸ“Œ κ°œλ…

μ €μž₯ ν”„λ‘œμ‹œμ €λŠ” 미리 μž‘μ„±λœ SQL λ¬Έλ“€μ˜ 집합을 λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜μ—¬ ν•„μš”ν•  λ•Œλ§ˆλ‹€ ν˜ΈμΆœν•˜μ—¬ μ‹€ν–‰ν•  수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 반볡적인 μž‘μ—…μ„ μžλ™ν™”ν•˜κ³ , μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ 높이며, λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ˜ 일관성을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ› οΈ νŠΉμ§• 및 μž₯점

πŸ“ μ‚¬μš©λ²•

  1. μ €μž₯ ν”„λ‘œμ‹œμ € 생성

     CREATE PROCEDURE ν”„λ‘œμ‹œμ €λͺ… (λ§€κ°œλ³€μˆ˜ λͺ©λ‘)
     BEGIN
         -- SQL λ¬Έμž₯λ“€
     END;
    
  2. μ €μž₯ ν”„λ‘œμ‹œμ € 호좜

     CALL ν”„λ‘œμ‹œμ €λͺ… (인자 λͺ©λ‘)
    

πŸ” 예제

예λ₯Ό λ“€μ–΄, νŠΉμ • λΆ€μ„œμ˜ μ§μ›λ“€μ˜ 평균 κΈ‰μ—¬λ₯Ό κ³„μ‚°ν•˜λŠ” μ €μž₯ ν”„λ‘œμ‹œμ €λ₯Ό μƒμ„±ν•˜κ³  ν˜ΈμΆœν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. μ €μž₯ ν”„λ‘œμ‹œμ € 생성

     CREATE PROCEDURE GetAverageSalaryByDept(IN dept_id INT, OUT avg_salary DECIMAL(10,2))
     BEGIN
         SELECT AVG(salary) INTO avg_salary
         FROM employees
         WHERE department_id = dept_id;
     END //
     DELIMITER ;
    
  2. μ €μž₯ ν”„λ‘œμ‹œμ € 호좜

     CALL GetAverageSalaryByDept(10, @avg_salary);
     SELECT @avg_salary;
        
    

πŸ”„ 트리거(Trigger)

🎯 κ°œλ…

νŠΈλ¦¬κ±°λŠ” νŠΉμ • ν…Œμ΄λΈ”μ—μ„œ INSERT, UPDATE, DELETE λ“±μ˜ μ΄λ²€νŠΈκ°€ λ°œμƒν•  λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” νŠΉλ³„ν•œ μ’…λ₯˜μ˜ μ €μž₯ ν”„λ‘œμ‹œμ €μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 데이터 무결성 μœ μ§€, μžλ™ 둜그 기둝, λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΅¬ν˜„ 등을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ› οΈ νŠΉμ§• 및 μž₯점

πŸ“ μ‚¬μš©λ²•

  1. 트리거 생성

     CREATE TRIGGER 트리거λͺ…
     {BEFORE | AFTER} {INSERT | UPDATE | DELETE}
     ON ν…Œμ΄λΈ”λͺ… FOR EACH ROW
     BEGIN
         -- SQL λ¬Έμž₯λ“€
     END;
    

πŸ” 예제

예λ₯Ό λ“€μ–΄, 직원 ν…Œμ΄λΈ”μ—μ„œ κΈ‰μ—¬κ°€ 변경될 λ•Œ λ³€κ²½ 이λ ₯을 κΈ°λ‘ν•˜λŠ” 트리거λ₯Ό μƒμ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

CREATE TRIGGER LogSalaryChange
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
    IF NEW.salary <> OLD.salary THEN
        INSERT INTO salary_changes (employee_id, old_salary, new_salary, change_date)
        VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
    END IF;
END //
DELIMITER ;

⏰ 이벀트 μŠ€μΌ€μ€„λŸ¬(Event Scheduler)

🎯 κ°œλ…

이벀트 μŠ€μΌ€μ€„λŸ¬λŠ” νŠΉμ • μ‹œκ°„μ΄λ‚˜ 주기에 따라 μžλ™μœΌλ‘œ SQL 문을 μ‹€ν–‰ν•˜λ„λ‘ μ˜ˆμ•½ν•˜λŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. 정기적인 데이터 λ°±μ—…, 둜그 정리, 톡계 μ—…λ°μ΄νŠΈ λ“±μ˜ μž‘μ—…μ„ μžλ™ν™”ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ› οΈ νŠΉμ§• 및 μž₯점

πŸ“ μ‚¬μš©λ²•

  1. 이벀트 μŠ€μΌ€μ€„λŸ¬ ν™œμ„±ν™”

     SET GLOBAL event_scheduler = ON;
    
  2. 이벀트 생성

     CREATE EVENT 이벀트λͺ…
     ON SCHEDULE 일정
     DO
         -- SQL λ¬Έμž₯λ“€
    

πŸ” 예제

예λ₯Ό λ“€μ–΄, 맀일 μžμ •μ— νŠΉμ • ν…Œμ΄λΈ”μ˜ 데이터λ₯Ό λ°±μ—…ν•˜λŠ” 이벀트λ₯Ό μƒμ„±ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

CREATE EVENT DailyBackup
ON SCHEDULE EVERY 1 DAY
STARTS '2025-03-17 00:00:00'
DO
    INSERT INTO employees_backup
    SELECT * FROM employees;

πŸŒ€ 동적 SQL(Dynamic SQL)

동적 SQL은 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œμ μ— SQL 문을 λ™μ μœΌλ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‹€μ–‘ν•œ 쑰건과 μž…λ ₯값에 따라 μœ μ—°ν•˜κ²Œ SQL 문을 κ΅¬μ„±ν•˜κ³  μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•:

μ‚¬μš© μ˜ˆμ‹œ:

SET @table_name = 'Employees';
SET @sql = CONCAT('SELECT * FROM ', @table_name);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” ν…Œμ΄λΈ” 이름을 λ™μ μœΌλ‘œ μ„€μ •ν•˜μ—¬ ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.

μ°Έκ³ : 동적 SQL을 μ‚¬μš©ν•  λ•ŒλŠ” SQL μΈμ μ…˜