MySQL

IF, CASE, WHILE, 동적 SQL

neal89 2025. 4. 6. 05:42

✅ 1. IF 문

조건에 따라 분기 처리할 때 사용
문법은 자바나 다른 언어와 비슷하지만, THEN, END IF;가 들어가는 것이 특징입니다.

IF 조건 THEN
    -- 조건이 참일 때 실행
ELSEIF 다른_조건 THEN
    -- 조건이 두 번째로 참일 때
ELSE
    -- 조건이 모두 거짓일 때
END IF;

예제:

IF score >= 90 THEN
  SET grade = 'A';
ELSEIF score >= 80 THEN
  SET grade = 'B';
ELSE
  SET grade = 'C';
END IF;

✅ 2. CASE 문

다중 조건을 간결하게 처리할 때 유용

CASE WHEN 문법 (IF 대체용)

CASE
  WHEN 조건1 THEN 결과1
  WHEN 조건2 THEN 결과2
  ELSE 기본값
END

예제:

CASE
  WHEN salary >= 5000 THEN 'High'
  WHEN salary >= 3000 THEN 'Medium'
  ELSE 'Low'
END

SELECT 안에서 쓰는 예시:

SELECT name,
       CASE gender
         WHEN 'M' THEN 'Male'
         WHEN 'F' THEN 'Female'
         ELSE 'Other'
       END AS gender_name
FROM members;

✅ 3. WHILE 문

특정 조건이 참일 동안 반복 실행

WHILE 조건 DO
  -- 반복 실행할 내용
END WHILE;

예제 (1부터 10까지 출력):

DECLARE i INT DEFAULT 1;

WHILE i <= 10 DO
  SELECT i;
  SET i = i + 1;
END WHILE;

📌 참고: LEAVE, ITERATE, 레이블과 함께 사용하면 반복문 제어가 쉬움.


✅ 4. 동적 SQL (Dynamic SQL)

SQL 문장을 문자열로 생성해서 실행하는 방법
복잡한 조건, 테이블명 동적 변경 등에 유용

SET @sql = 'SELECT * FROM ' + 테이블명;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

예제:

SET @sql = CONCAT('SELECT * FROM ', table_name, ' WHERE status = "ACTIVE"');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

⚠️ 사용자 입력을 동적 SQL에 직접 넣을 땐 SQL Injection 주의 필요

 

❗ SQL Injection 위험 예제

아래는 사용자 입력을 그대로 SQL에 연결할 경우입니다.
예: userInput = "1 OR 1=1"

-- ⚠️ 매우 위험한 코드
SET @sql = CONCAT('SELECT * FROM users WHERE user_id = ', userInput);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

💥 만약 사용자가 이렇게 입력한다면?

userInput = "1 OR 1=1"

실제 실행될 SQL:

SELECT * FROM users WHERE user_id = 1 OR 1=1;

→ 조건이 항상 true이기 때문에 모든 유저 정보가 노출됨
→ 보안적으로 매우 치명적


✅ 안전한 예제 (Prepared Statement + Placeholder)

-- 안전하게 바인딩하는 방법
SET @userId = 1;
SET @sql = 'SELECT * FROM users WHERE user_id = ?';
PREPARE stmt FROM @sql;
EXECUTE stmt USING @userId;
DEALLOCATE PREPARE stmt;

📌 설명:

  • ?는 파라미터 바인딩 자리
  • EXECUTE ... USING으로 바인딩 값만 분리
  • 문자열로 합치지 않아서 SQL Injection 방지

📝 정리

문법 설명 키워드

IF 조건 분기 THEN, END IF
CASE 여러 조건 간결하게 분기 CASE WHEN END
WHILE 조건이 참이면 반복 WHILE DO END
동적SQL 문자열로 SQL 조합 및 실행 PREPARE, EXECUTE

필요하면 각 파트별로 포스팅 분리하거나 예제를 더 추가해도 좋아요.
원하는 디자인 스타일이 있다면 맞춰서 정리해줄게요!

'MySQL' 카테고리의 다른 글

Join  (0) 2025.04.04
CREATE, INSERT, UPDATE, DELETE, ALTER  (0) 2025.04.03