DB/MYSQL

MYSQL " IF " ( PROCEDURE,FUNCTION 문법 )

svdjcuwg4638 2023. 5. 16. 10:18

뭘 하든 경우에 따라 다른 코드를 실행하고 싶은 경우가 많습니다. 

그럴 때 IF / THEN / ELSE 문법을 사용합시다.

 

조건에 따라 다른 SQL 문장을 실행하고 싶다

예를 들어봅시다. 

card테이블의 '사용금액' 컬럼 총 합계를 구하는데

총 합계가 500만원이 넘지 않으면 SELECT '분발하세요'

총 합계가 500만원이 넘으면 SELECT '잘했어요'

 

예전에 배운 IF() 또는 CASE 써도 가능하겠지만

그 문법들은 "이 경우엔 A, 저 경우엔 B를 그 자리에 남겨주세요" 이렇게

경우에 따라 문자나 숫자자료를 1개 남겨주는 문법일 뿐이라

조건에 따라 SELECT같은 쿼리문은 남기지 못합니다.  

 

조건에 따라 다른 코드를 실행하고 싶으면 IF THEN ELSE

 

이런 경우에는 A코드, 저런 경우에는 B코드를 실행하고 싶으면

IF 조건문이라는 문법을 사용합시다. 

다른 DBMS는 BEGIN/END라고 대충 적으면 그 안에서 IF 문법을 사용할 수 있는 경우가 있는데 

MySQL은 procedure 아니면 function 안에서만 IF를 사용가능합니다. 

 

IF 조건식1 THEN 
  조건식1이 참이면 실행할 쿼리문;
ELSEIF 조건식2 THEN 
  조건식2가 참이면 실행할 쿼리문;
ELSE 
  그게 아니면 실행할 쿼리문;
END IF;

이런 식으로 사용하는 문법입니다.

- THEN 다음엔 아무거나 넣어도 됩니다. 보통 SQL 쿼리문이 들어갑니다. 

- ELSEIF 부분은 조건식이 여러개 필요없으면 생략해도 됩니다. 

- 조건식이 여러개 맞을 경우 맞은 것들 중 맨 위의 1개만 실행됩니다. CASE문 이랑 동작방식이 유사함 

- 세미콜론 까먹으면 망합니다 

 

IF 1 > 0 THEN 
  SELECT '맞음';
ELSE 
  SELECT '틀림';
END IF;

 

결과

맞음이 출력된다

 

IF 2 = 1 THEN 
  SELECT '첫째가 맞음';
ELSEIF 1 = 1 THEN
  SELECT '둘째가 맞음';
ELSE 
  SELECT '틀림';
END IF;

 

결과

둘째가 맞음

 

사용예시 프로시져

 

사용금액을 합해서 5000000원이 넘으면 잘했어요 아니면 못했어요 를 출력하는 프로시져

DROP PROCEDURE IF EXISTS mart.total_sum;

DELIMITER $$
CREATE PROCEDURE mart.total_sum()
BEGIN

  IF (SELECT SUM(사용금액) FROM mart.card) > 5000000 THEN
    SELECT '잘했어요';
  ELSE 
    SELECT '못했어요';
  END IF;

END
$$ 
DELIMITER ;

CALL mart.chk();

 

글자를 입력받아 원하는 값을 돌려받는 프로시져 만들기

DROP PROCEDURE IF EXISTS mart.프로시저;
DELIMITER $$
CREATE PROCEDURE mart.프로시저(구멍 varchar(100))
BEGIN


  IF 구멍 = '평균' THEN
    SELECT AVG(사용금액) FROM mart.card;

  ELSEIF 구멍 = '최댓값' THEN
    SELECT MAX(사용금액) FROM mart.card;

  ELSEIF 구멍 = '최빈값' THEN
    SELECT 고객등급, COUNT(고객등급) FROM mart.card 
    GROUP BY 고객등급 ORDER BY COUNT(고객등급) DESC LIMIT 1;
  END IF;


END
$$ 
DELIMITER ;
CALL mart.프로시저('최댓값');

 

 

 

사용예시 함수

 

나이를 입력받았을때 20살 이상이면 출입가능 이하면 출입불가를 반환할려할때 코드

DROP FUNCTION IF EXISTS mart.age_check;
DELIMITER $$

CREATE FUNCTION mart.age_check(구멍 INT)
RETURNS VARCHAR(100)
DETERMINISTIC
BEGIN 

    IF 구멍 < 20 THEN  
      RETURN '출입금지';
    ELSE  
      RETURN '출입가능';
    END IF; 
END $$
DELIMITER ;

SELECT mart.age_check(21);

 

월을 파라미터로받아 해당 월이 며칠까지 있는지 뱉는 함수 만들기

DROP FUNCTION IF EXISTS mart.함수;
DELIMITER $$
CREATE FUNCTION mart.함수(구멍 INT)
RETURNS INT
DETERMINISTIC
BEGIN

    IF 구멍 IN (1,3,5,7,8,10,12) THEN 
      RETURN 31;
    ELSEIF 구멍 IN (4,6,9,11) THEN 
      RETURN 30;
    ELSEIF 구멍 = 2 THEN 
      RETURN 28;
    ELSE RETURN 0;
    END IF;

END $$
DELIMITER ;

 

정리

function은 deterministic와 return을 사용한다

procedure은 select이며 쿼리문이 실행되고 호출할때는 CALL을 잊지말자.

 

함수

if elseif else  end if 와 " ; " 를 잊지말자

else제외한 나머지 조건문에는 then을 붙여주자