[ Index ]
1. IF 문
(1) IF 문 (2) IF ~ ELSE 문 (3) IF 문 활용
2. CASE 문
(1) CASE 문 (2) CASE 문 활용
3. WHILE 문
(1) WHILE 문 (2) ITERATE/LEAVE 문 (3) WHILE 문 활용
4. 동적 SQL
(1) 동적 SQL (2) 동적 SQL 활용
1. IF 문
(1) IF 문
IF문은 조건문이다.
IF 속 문장이 참이면, SQL 문장을 실행하고
IF 속 문장이 거짓이면, SQL 문장을 실행하지 않는다.
IF [조건식] THEN
[SQL 문장]
END IF;
SQL 문장이 두 문장 이상일 땐 BEGIN ~ END로 묶어줘야 한다.
DELIMITER $$
CREATE PROCEDURE [프로시저명];
BEGIN
IF [조건식] THEN
[SQL 문장]
END IF;
END $$
DELIMITER ; **DELIMITER과 ; 사이에 공백을 두지 않으면, 오류남**
※ SQL 프로그래밍은 기본적으로 스토어드 프로시저 안에 만들어야 한다.
(2) IF ~ ELSE 문
IF ~ ELSE 문은 조건문이 참이면, SQL 문장 1을 실행하고
조건문이 거짓이면, SQL 문장 2를 실행하는 구조이다.
DELIMITER $$
CREATE PROCEDURE [프로시저명]
BEGIN
IF [조건식] THEN
[SQL 문장 1]
ELSE
[SQL 문장 2]
END IF;
END $$
DELIMITER ;
(3) IF 문 활용
이전 게시글에서 만들었던 '회원' 테이블을 이용해 IF 문을 활용해 보겠습니다.
< 조건 >
주소가 울산인 회원의 가입 일자가 6개월이 지났다면,
'회원이 되신 지 OO일 지났습니다. 비밀번호를 변경해 주세요.'
6개월이 지나지 않았다면, '회원이 되신 OO일 지났습니다. 감사합니다.'
(단, 1개월은 30일로 생각)
DROP PROCEDURE IF EXISTS joinProc;
DELIMITER $$
CREATE PROCEDURE joinProc()
BEGIN
DECLARE joinDate DATE; -- 가입 일자
DECLARE today DATE; -- 오늘
DECLARE days INT; -- 회원 일수
SELECT join_date INTO joinDate
FROM sample.member
WHERE addr = '울산';
SET today = CURRENT_DATE();
SET days = DATEDIFF(today, joinDate);
IF (days/30) >= 6 THEN
SELECT CONCAT('회원이 되신지 ', days, '일 지났습니다. 비밀번호를 변경해주세요.');
ELSE
SELECT '회원이 되신지 ' + days + '일 지났습니다. 감사합니다.';
END IF;
END $$
DELIMITER ;
CALL joinProc();
Result |
![]() |
- (DROP PROCEDURE IF EXISTS 프로시저) 해당 프로시저가 존재하면 삭제한다.
- (DECLARE 변수 데이터형식) 변수를 선언한다.
- (값 INTO 변수) 변수에 값을 할당한다.
- (SET 변수 = 값) 변수에 값을 할당한다.
- (CONCAT, +) 문자열을 이어준다.
- (CALL 프로시저) 프로시저를 실행한다.
2. CASE 문
(1) CASE 문
IF 문은 한 가지 조건에 따라 실행 결과가 달라졌다.
CASE 문은 여러 가지 조건 중에 하나를 선택하는 구조이다.
즉, 여러 조건 중에 하나를 선택해 그에 맞는 결과를 도출한다.
CASE
WHEN 조건 1 THEN
SQL 문장 1
WHEN 조건 2 THEN
SQL 문장 2
WHEN 조건 3 THEN
SQL 문장 3
ELSE
SQL 문장 4
END CASE;
(2) CASE 문 활용
< 조건 >
회원들의 총구매액을 계산해 회원 등급을 나누려고 한다.
총 구매액 회원급 4000 이상 최우수고객 1000 이상 우수고객 나머지 일반고객
SELECT M.mem_id, M.mem_name, SUM(price*amount) "총구매액",
CASE
WHEN (SUM(price*amount) >= 4000) THEN '최우수고객'
WHEN (SUM(price*amount) >= 1000) THEN '우수고객'
ELSE '일반고객'
END "회원등급"
FROM buy B
RIGHT JOIN member M
ON B.mem_id = M.mem_id
GROUP BY M.mem_id
ORDER BY SUM(price*amount) DESC;
Result |
![]() |
3. WHILE 문
(1) WHILE 문
WHILE 문은 조건식이 참이면, SQL 문장을 계속 반복한다.
WHILE [조건식] DO
SQL 문장
END WHILE;
(2) ITERATE/LEAVE 문
특정 경우에만 반복문을 생략하고 싶을 때, 특정 조건을 만족하면 반복문을 중단하고 싶을 때, ITERATE와 LEAVE 문을 사용할 수 있다.
ITERATE [레이블] : 지정한 레이블로 가서 계속 진행한다.
LEAVE [레이블] : 지정한 레이블을 빠져나가 WHILE 문이 종료된다.
(3) WHILE 문 활용
< 조건 >
1에서 1000까지의 합을 구한다.
단, 10의 배수를 제외한 합을 구할 것
단, 합이 10000이 넘으면 반복문을 종료할 것
DROP PROCEDURE IF EXISTS whileProc;
DELIMITER $$
CREATE PROCEDURE whileProc()
BEGIN
DECLARE i INT; -- 1 ~ 1000
DECLARE sum_ INT; -- 더한 값을 누적할 변수
SET i = 1;
SET sum_ = 0;
while_1000: -- 레이블 지정
WHILE(i <= 1000) DO
IF (i % 10 = 0) THEN
SET i = i + 1;
ITERATE while_1000; -- 지정한 label 문으로 가서 계속 진행
END IF;
SET sum_ = sum_ + i;
IF (sum_ > 10000) THEN
LEAVE while_1000; -- 지정한 label 문을 떠남
END IF;
SET i = i + 1;
END WHILE;
SELECT '1부터 1000까지의 합, 10의 배수 제외, 10000 넘으면 종료', sum_ "결과";
END $$
DELIMITER ;
CALL whileProc();
Result |
![]() |
4. 동적 SQL
(1) 동적 SQL
동적 SQL을 사용하면 미리 SQL 문을 준비해 놓고,
나중에 필요한 값을 입력해 실행시킬 수 있다.
PREPARE [쿼리명] FROM '[SQL 문]';
EXECUTE [쿼리명];
DELLOCATE PREPARE [쿼리명];
- PREPARE; SQL 문을 미리 준비하는 과정
- EXECUTE; 미리 준비해 둔 SQL 문을 실행하는 과정
- DELLOCATE PREPARE; 미리 준비해둔 SQL 문을 해제하는 과정
(2) 동적 SQL 활용
< 조건 >
회원의 전화번호를 조회하는 SQL 문을 동적 SQL으로 미리 준비한다고 하자.
(단, 특정 회원에 대한 정보는 비워두고 실행할 때 USING을 이용해 입력한다.)
SET @memID = 'A111'; -- 회원 아이디 변수 생성
-- 동적 SQL 준비
PREPARE findQuery FROM 'SELECT mem_id, phone FROM member WHERE mem_id = ?';
-- 동적 SQL 실행
EXECUTE findQuery USING @memID;
-- 동적 SQL 해제
DEALLOCATE PREPARE findQuery;
Result |
![]() |
[ Reference ]
📙 우재남, 한빛미디어, 혼자 공부하는 SQL
'📖 STUDY > SQL' 카테고리의 다른 글
[EP.09] 인덱스의 모든 것 (0) | 2023.10.25 |
---|---|
[EP.08] 테이블의 모든 것 (0) | 2023.10.24 |
[EP.06] 조인(JOIN) (0) | 2023.10.18 |
[EP.05] 데이터 형식 (0) | 2023.10.17 |
[EP.04] 데이터 입력, 수정, 삭제 (0) | 2023.10.16 |