일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- spring boot 배너 설정
- 스프링 부트 배너 설정
- 숨어있는 숫자의 덧셈 (1) 자바
- 배열 순환
- string과 stringbuilder의 차이점
- 프로그래머스 공 던지기 게임
- 자바 팩토리얼
- 오블완
- string과 stringbuilder
- 소인수분해 구하는 공식
- 스프링부트 의존성 설정
- 자바 소인수분해
- string과 stringbuilder 성능 차이
- 접속 url 출력
- 모스부호(1) 자바
- 프로그래머스
- 왓챠피디아 클론 코딩
- stringbuilder란
- 배열 순환 문제 공식
- string과 stringbuilder의 차이
- 자바 합성수 찾기
- 경우의 수 자바
- 펙토리얼
- 티스토리챌린지
- 스프링 부트 프로젝트 세팅
- string과 stringbuilder 성능 최적화
- 외계행성의 나이 자바
- 개미 군단 자바
- 프로그래머스 문자열 정렬하기(1)
- 배열 순환 자바
- Today
- Total
여름 언덕에서 배운 것
procedure, function 안에서 쓸 수 있는 IF (my sql 인경우) 본문
https://codingapple.com/course/sql-and-database/
한 번에 끝내는 SQL & Database - 코딩애플 온라인 강좌
SQL은 관계형 데이터베이스에서 데이터를 입출력할 때 사용하는 언어입니다. 관계형 데이터베이스를 다루는 곳에서 백엔드 개발 잘하고 싶다면 SQL을 잘 알아두도록 합시다. 실은 SQL을 개발자
codingapple.com
뭘 하든 경우에 따라 다른 코드를 실행하고 싶은 경우가 많습니다.
조건에 따라 다른 SQL 문장을 실행하고 싶다
IF(),CASE 는 경우에 따라 문자 혹은 숫자를 1개만 남겨주기 때문에 조건에 따라 select와 같은 쿼리문은 사용 못합니다.
조건에 따라 다른 코드를 실행하고 싶으면 IF THEN ELSE
MySQL은 procedure 아니면 function 안에서만 IF를 사용가능합니다.
IF 조건식1 THEN
조건식1이 참이면 실행할 쿼리문;
ELSEIF 조건식2 THEN
조건식2가 참이면 실행할 쿼리문;
ELSE
그게 아니면 실행할 쿼리문;
END IF;
- THEN 다음엔 아무거나 넣어도 됩니다. 보통 SQL 쿼리문이 들어갑니다.
- ELSEIF 부분은 조건식이 여러개 필요없으면 생략해도 됩니다.
- 조건식이 여러개 맞을 경우 맞은 것들 중 맨 위의 1개만 실행됩니다. CASE문 이랑 동작방식이 유사함
- 세미콜론 까먹으면 망합니다
IF 1 =1 THEN
SELECT '맞음';
ELSE
SELECT '틀림';
END IF;
맞음 만 출력된다.
IF 2 = 7 THEN
SELECT '첫째가 맞음';
ELSEIF 1 = 1 THEN
SELECT '둘째가 맞음';
ELSE
SELECT '틀림';
END IF;
'둘째가 맞음'만 출력된다. 첫번째 문장은 틀렸으니까 skip~
IF 2 = 2 THEN
SELECT '첫째가 맞음';
ELSEIF 1 = 1 THEN
SELECT '둘째가 맞음';
ELSE
SELECT '틀림';
END IF;
이 경우는 첫째가 맞음만 출력되고 나머지는 종료!
card테이블의 '사용금액' 컬럼 총 합계를 구하는데
총 합계가 500만원이 넘지 않으면 SELECT '분발하세요'
총 합계가 500만원이 넘으면 SELECT '잘했어요' 를 실행하고 싶다면?
먼저 한글로 적어보기
CREATE PROCEDURE mart.test()
BEGIN
DECLARE totalAmount INT;
SELECT SUM(사용금액) INTO totalAmount FROM mart.card;
IF totalAmount > 5000000 THEN
SELECT '잘했어요';
ELSE
SELECT '분발하세요';
END IF;
END;
CALL mart.test();
조건에 따라서 다른 결과를 뱉는 함수만들기
미성년자와 성인 나이 체크하는 함수 만들어 보자
CREATE FUNCTION mart.adult(구멍 INT)
RETURNS VARCHAR(20) -- 함수가 문자열을 반환하므로 INT가 아닌 VARCHAR로 변경
DETERMINISTIC
BEGIN
DECLARE result VARCHAR(20); -- 결과를 저장할 변수 선언
IF 구멍 < 20 THEN
SET result = '미성년자에요'; -- 변수에 값을 저장할 때 SET을 사용
ELSE
SET result = '성인입니다'; -- 변수에 값을 저장할 때 SET을 사용
END IF;
RETURN result; -- 결과 반환
END;
SELECT adult(19);
🍎숙제
월을 파라미터로 입력하면 '해당 월이 며칠까지 있는지' 를 뱉는 함수를 만들어봅시다.
이상한 숫자 넣으면 0을 뱉게 만듭시다.
(동작예시)
SELECT 함수(3); 실행하면 31이 출력되어야합니다.
SELECT 함수(2); 실행하면 28이 출력되어야합니다. (윤년은 무시합시다)
SELECT 함수(13); 실행하면 0이 출력되어야합니다. (13월은 이 세계에 없음)
CREATE FUNCTION mart.month_chk(구멍 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;
SELECT month_chk(3);
Q2. 파라미터로 '평균'을 입력하면 'card 테이블 사용금액 컬럼'의 평균을 구해주고
파라미터로 '최댓값'을 입력하면 'card 테이블 사용금액 컬럼'의 최댓값을 구해주고
파라미터로 '최빈값'을 입력하면 'card 테이블 고객등급 컬럼'의 최빈값의 등장횟수를 구해주는
procedure를 만들어봅시다.
최빈값 등장횟수가뭐냐면 그냥 'vip' 라는 문자가 가장 많이 출몰한다면
'vip' 가 테이블에 몇개 들어있나 출력해달라는 소리입니다.
(동작예시)
CALL 프로시저('평균'); 을 실행하면 245766.6이 출력되어야합니다. (사용금액 평균값임)
CALL 프로시저('최댓값'); 을 실행하면 894000이 출력되어야합니다. (사용금액 최댓값임)
CALL 프로시저('최빈값'); 을 실행하면 6이 출력되어야합니다. (vip가 최빈값이고 그건 6번 출현합니다)
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
'가랑비에 옷 젖는 줄 모른다 💻 > SQL & DB' 카테고리의 다른 글
프로시저와 비슷한 function 문법 (0) | 2023.08.12 |
---|---|
SQL 날짜,시간 (0) | 2023.08.12 |
프로시저 많이 만들기 싫으면 파라미터 (0) | 2023.08.10 |
프로시저에서 쓰는 변수 (1) | 2023.08.09 |
저장프로시저 이용하기(stored procedure) (0) | 2023.08.09 |