안녕하세요
https://www.youtube.com/watch?v=QxJP8LlLqzQ
요즘 푸욱 빠진 노래입니다.
뭔가 힐링이되는 노래랄까…
밤바다 걸으면서 들으면 진짜 너무 좋을 듯요…
다들 한번씩 들어보세요 ㅎㅎ 노래 너무 좋습니다.
드디어 procedure 마지막 공부입니다.
오늘 배울 것은 procedure, function 안에서 쓸 수 있는 if를 배워볼것인데요.
뭘하든 경우에 따라 다른 코드를 실행하고 싶을때가 있습니다.
그럴때 어떤 코드를 사용할까요?
전에 배웠죠. IF / THEN / ELSE
조건에 따라 다른 쿼리를 실행하고 싶어요
예를 들어
card 테이블의 ‘사용금액’컬럼의 총 합계를 구합니다.
총 합계가 500만원 미만이면 SELECT ‘분발하세요’
총 합계가 500만원 이상이면 SELECT ‘잘했어요’
를 실행하고 싶다면 어떻게 쿼리를 짤까요?
예전에 배웠던 IF() or CASE 써도 가능하겠지만
그 문법들은 ‘이경우엔 a, 이땐 b 써주세요’ 경우에 따라 ‘값’을 뱉어주는거지 ‘쿼리문’은 남기지 못합니다…
조건에 따라 다른 코드를 실행하고 싶다면 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 다음엔 아무거나 넣어도 됩니다. (보통 쿼리가 드감)
- ELSEIF 부분은 조건식 여러개 일때 사용. 안써도 상관ㄴㄴ
- 조건식이 여러개 맞을경우 맨 위에거 1개 실행(CASE랑 작동원리 유사)
- 세미콜론 까먹 ㄴㄴ
IF 1 > 0 THEN
SELECT '맞음';
ELSE
SELECT '틀림';
END IF;
→ 요거는 SELECT ‘맞음’이 실행되겠지요.
IF 2 = 1 THEN
SELECT '첫째가 맞음';
ELSEIF 1 = 1 THEN
SELECT '둘째가 맞음';
ELSE
SELECT '틀림';
END IF;
→ 거짓이니까 SELECT ‘틀림’이 실행됩니다.
그래서 다시 돌아와서
아까 위에서 말한
card 테이블의 ‘사용금액’컬럼의 총 합계를 구합니다.
총 합계가 500만원 미만이면 SELECT ‘분발하세요’
총 합계가 500만원 이상이면 SELECT ‘잘했어요’
이건 어떻게 짤까요?
잘모르겠다구요???
당장 머리 싸매고 쿼리짜세욧!!
IF (SELECT SUM(사용금액) FROM card) > 5000000 THEN
SELECT '잘했어요';
ELSE
SELECT '분발하세요';
END IF;
할 수 있으면서 ㅋㅋ
실은 간단히 IF() or CASE() 써도 구현이 가능합니다.
하지만 조건에 따라 실행시킬 쿼리가 길고 복잡하면 IF 문법 쓰는게 훠~~~~~~~~얼씬 낫습니다 ㅎㅎ
조건에 따라서 다른 결과를 뱉는 함수 만들기
함수() 실행 시 파라미터로 나이를 입력했을 때 20살 미만이면 ‘구매불가’를 내뱉고 20살 이상이면 ‘구매가능’을 뱉는 함수()를 만들고 싶습니다.
그니까 함수(30); 딸깍 하면 ‘구매가능’이 그 자리에 남아야한단 소리입니다.
DROP FUNCTION IF EXISTS emart.age_check;
DELIMITER $$
CREATE FUNCTION emart.age_check(나이 INT)
RETURNS INT
DETERMINISTIC
BEGIN
IF 나이 > 20 THEN
RETURN '구매가능';
ELSE
RETURN '구매불가';
END IF;
END $$
DELIMITER ;
SELECT emart.age_check(20);
실전 🏌🏻
1. 월을 파라미터로 입력하면 '해당 월이 며칠까지 있는지' 를 뱉는 함수를 만들어보기
이상한 숫자 넣으면 0을 뱉음
(동작예시)
SELECT 함수(3); 실행하면 31이 출력되어야합니다.
SELECT 함수(2); 실행하면 28이 출력되어야합니다. (윤년은 무시합시다)
SELECT 함수(13); 실행하면 0이 출력되어야합니다. (13월은 이 세계에 없음)
DROP FUNCTION IF EXISTS emart.month_check;
DELIMITER $$
CREATE FUNCTION emart.month_check(월 INT)
RETURNS INT
DETERMINISTIC
BEGIN
IF 월 = 2 THEN
RETURN '28';
ELSEIF 월 % 2 = 0 THEN
RETURN '30';
ELSEIF 월 % 2 = 1 THEN
RETURN '31';
ELSE
RETURN '0';
END IF;
END $$
DELIMITER ;
SELECT emart.month_check(20);
잘했습니당👍
DROP FUNCTION IF EXISTS emart.month_check;
DELIMITER $$
CREATE FUNCTION emart.month_check(월 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 ;
IN 연산자를 이용해서 함수를 만들 수도 있습니다.
2. 파라미터로 '평균'을 입력하면 'card 테이블 사용금액 컬럼'의 평균을 구해주고
파라미터로 '최댓값'을 입력하면 'card 테이블 사용금액 컬럼'의 최댓값을 구해주고
파라미터로 '최빈값'을 입력하면 'card 테이블 고객등급 컬럼'의 최빈값의 등장횟수를 구해주는 procedure를 만들어보겠습니다.
(동작예시)
CALL 프로시저('평균'); 을 실행하면 245766.6이 출력되어야합니다. (사용금액 평균값임)
CALL 프로시저('최댓값'); 을 실행하면 894000이 출력되어야합니다. (사용금액 최댓값임)
CALL 프로시저('최빈값'); 을 실행하면 6이 출력되어야합니다. (vip가 최빈값이고 그건 6번 출현합니다)
DROP PROCEDURE IF EXISTS emart.select_check;
DELIMITER $$
CREATE PROCEDURE emart.select_check(찾는값 VARCHAR(100))
BEGIN
IF 찾는값 = '평균' THEN
SELECT AVG(사용금액) FROM card;
ELSEIF 찾는값 = '최댓값' THEN
SELECT MAX(사용금액) FROM card;
ELSEIF 찾는값 = '최빈값' THEN
SELECT 고객등급, COUNT(고객등급) FROM card
GROUP BY 고객등급 ORDER BY COUNT(고객등급) DESC LIMIT 1;
END IF;
END $$
DELIMITER ;
→ 최빈값은, GROUP BY 로 고객등급을 그룹지어, DESC 로 정렬한 후 맨 위에 1행이 최빈 값입니다.
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
index 만들어보기 그리고 성능 평가해보기 (0) | 2024.04.01 |
---|---|
솔로지옥 덱스말고 SQL index (0) | 2024.03.28 |
procedure 많이 만들기 싫다면? 파라미터로 해결하세요~ (0) | 2024.03.28 |
procedure에서 많이 쓰는 변수 문법 (0) | 2024.03.28 |
저장 프로시저 stored procedure 쓰면 나도 알파메일 (0) | 2024.03.28 |