MYSQL " IF " ( PROCEDURE,FUNCTION 문법 )
뭘 하든 경우에 따라 다른 코드를 실행하고 싶은 경우가 많습니다.
그럴 때 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을 붙여주자