멋쟁이v의 개발일지

[DB] SELECT ~ INTO, CASE ~ END, WHILE 본문

0년차/DB

[DB] SELECT ~ INTO, CASE ~ END, WHILE

멋쟁이v 2023. 6. 11. 17:37
728x90
320x100

[목차]


01. SELECT ~ INTO

💡
OUT 매개변수 사용 시, 출력 매개 변수에 값을 대입하기 위해서 사용

MySQL에서 사용자가 정의한 변수에 SELECT에서 조회할 열에 값을 대입하기 위해 사용하며, 주로 프로시저에서 사용한다.

  • 구문
    BEGIN
    
    	DECLARE num1 INT;
    
    	SELECT
    		-- 테스트 테이블에서 조회할 member_age을 위에서 선언한 num1이라는 변수에 대입
    		member_age INTO num1
    	FROM
    		tb_test;
    
    END

  • 예시

    goods table 평균가격 → ROUND(AVG(g.g_price), 0)

    -- 기존 프로시저가 존재하면 삭제
    DROP PROCEDURE IF EXISTS sp_aver_price;
    
    DELIMITER $$
    CREATE PROCEDURE sp_aver_price(OUT averPrice INT) -- OUT 출력 매개 변수
    BEGIN
    
    	SELECT
    		-- 평균 가격 계산 후, averPrice에 담는다.
    		ROUND(AVG(g.g_price), 0) INTO averPrice 
    	FROM
    		tb_goods AS g;
    END $$
    DELIMITER ;
    
    -- 변수 @val을 선언하고, sp_aver_price 프로시저를 호출한다.
    -- 호출 결과가 @val에 저장된다.
    CALL sp_aver_price(@val);
    
    -- @val의 값을 출력
    SELECT @val;

02. CASE ~ END

💡
IF문은 참 또는 거짓만 존재하는데, 이를 이중 분기라고 부른다.

CASE문은 여러 조건을 비교할 수 있다.

그래서 다중 분기라는 용어를 사용한다.

  • 예시

    구매자별 주문 금액에 따라 회원 등급을 분류하고,

    구매자 아이디, 구매자 이름, 총 주문 금액, 해당 구매자의 등급을 조회하시오. (총 주문 금액은 내림차순으로 정렬)

    SELECT
    	o.o_id AS '구매자아이디',
    	m.m_name AS '구매자이름',
    	SUM(g.g_price * o.o_amount) AS 'total',
    	-- 여러 조건 비교
    	(CASE
    		WHEN (SUM(g.g_price * o.o_amount) >= 3000000) THEN 'VIP'
    		WHEN (SUM(g.g_price * o.o_amount) >= 2000000) THEN 'Diamond'
    		WHEN (SUM(g.g_price * o.o_amount) >= 1000000) THEN 'Gold'
    		WHEN (SUM(g.g_price * o.o_amount) >= 800000) THEN 'Silver'
    		ELSE '일반 회원입니다.'
    	END) AS '구매자 등급'
    FROM
      -- 3개의 테이블을 조인해서 사용
    	tb_member AS m
    	INNER JOIN
    	tb_order AS o
    	ON
    	m.m_id = o.o_id
    	INNER JOIN
    	tb_goods AS g
    	ON
    	o.o_g_code = g.g_code
    -- 구매자별 그룹
    GROUP BY o.o_id
    -- 내림차순 정렬
    ORDER BY total DESC;

    회원의 아이디를 입력 받아 레벨을 조회하는 프로시저

    DELIMITER $$
    CREATE PROCEDURE proc_grade_case(IN memId VARCHAR(50))
    BEGIN
    
    	DECLARE memLv INT DEFAULT 0;
    
    	SELECT
    		m.m_level INTO memLv
    	FROM
    		tb_member AS m
    	WHERE
    		m.m_id = memId;
    
    	CASE
    		WHEN(memLv = 1) THEN
    			SELECT '관리자' AS '권한';
    		WHEN(memLv = 2) THEN
    			SELECT '판매자' AS '권한';
    		WHEN(memLv = 3) THEN
    			SELECT '구매자' AS '권한';
    		ELSE
    			SELECT '회원' AS '권한';
    	END CASE;
    
    END $$
    DELIMITER ;
    
    -- 프로시저 호출
    CALL proc_grade_case('id005');

03. WHILE

💡
여러번 반복하는 WHILE문

WHILE문은 해당 조건식이 참일 경우 반복.

  • 구문
    👉🏻
    WHILE(조건식) DO

    ~~SQL문

    END WHILE;

  • 예시

    1 ~ 100까지 숫자를 더하는 WHILE문

    DROP PROCEDURE IF EXISTS proc_while_test;
    
    DELIMITER $$
    CREATE PROCEDURE proc_while_test()
    BEGIN
    
    	DECLARE num INT; -- 1 ~ 100까지 증가할 변수
    	DECLARE hap INT; -- 값을 누적할 변수
    
    	-- 초깃값 셋팅
    	SET num := 1;
    	SET hap := 0;
    
    	WHILE(num <= 100) DO
    		SET hap := hap + num;
    		SET num := num + 1;
    	END WHILE;
    
    	SELECT hap;
    
    END $$
    DELIMITER ;
    
    CALL proc_while_test();


tag : #데이터베이스 #DB #SELECT INTO #CASE #WHILE


Uploaded by N2T

728x90
320x100
Comments