✅ 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 |