[ 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

+ Recent posts