PROCEDURE WHILE
반복문으로 1부터 100까지 누적합을 계산합니다.
WHILE은 조건이 참인 동안 같은 SQL 블록을 반복한다. 반복 변수 증가를 빠뜨리면 무한 반복이 되므로 SET i = i + 1 같은 종료 방향 코드가 핵심이다.
이 글은 짧은 실습 코드를 그대로 외우는 것보다, 각 줄이 왜 필요한지와 어디에서 오류가 자주 나는지를 함께 정리하는 데 초점을 둔다.
| 문법 | 의미 | 확인 위치 |
|---|---|---|
| 초기값 | i는 1, hap은 0에서 시작한다. | 예제 코드에서 직접 확인 |
| 반복 조건 | i가 100 이하인 동안 반복한다. | 예제 코드에서 직접 확인 |
| 누적 | hap에 현재 i를 더해 다시 hap에 저장한다. | 예제 코드에서 직접 확인 |
| 증가식 | i를 1씩 증가시켜 언젠가 조건이 거짓이 되게 한다. | 예제 코드에서 직접 확인 |
| END WHILE | 반복 블록은 END WHILE로 닫는다. | 예제 코드에서 직접 확인 |
결과를 볼 때는 출력값만 맞는지 보지 말고, 왜 그 행만 남았는지 또는 왜 그 값이 계산되었는지를 역으로 설명할 수 있어야 한다.
| 확인 대상 | 정상 신호 | 의심할 부분 |
|---|---|---|
| 프로시저 생성 | Query OK 또는 생성 성공 | DELIMITER, END, 변수 선언 위치 |
| CALL 실행 | SELECT 결과가 출력됨 | 프로시저 이름, 권한, 내부 문법 |
| JOIN 결과 | 조건에 맞는 행만 출력 | ON 조건, 별칭, WHERE 위치 |
| 집합 결과 | 컬럼 수가 맞고 세로로 합쳐짐 | UNION 대상 컬럼 개수와 타입 |
| 행 개수 | 예상한 범위의 COUNT | CROSS JOIN으로 인한 곱셈 증가 |
| 실수 | 증상 | 해결 |
|---|---|---|
| DELIMITER 복구 누락 | 이후 SQL이 계속 $$ 기준으로 해석된다. | DELIMITER ; 로 되돌린다. |
| DECLARE 위치 오류 | 프로시저 생성에서 문법 오류가 난다. | BEGIN 바로 다음에 변수 선언을 모은다. |
| 조건 순서 오류 | ELSEIF 결과가 의도와 다르게 나온다. | 넓은 조건보다 구체적인 조건을 먼저 둔다. |
| 별칭 생략 | 같은 테이블/컬럼을 구분하기 어렵다. | A, B처럼 역할별 별칭을 붙인다. |
| 대량 CROSS JOIN | 결과 행이 폭증한다. | COUNT로 규모를 먼저 확인한다. |
예제는 고정값으로 작성되어 있지만 실무에서는 매개변수, 조건, 출력 컬럼을 바꿔 재사용한다. 먼저 상수로 동작을 확인한 뒤 필요한 값을 파라미터로 옮기면 디버깅이 쉽다.
| 질문 | 확인할 내용 |
|---|---|
| 이 SQL은 행을 줄이는가 늘리는가? | WHERE, INNER JOIN은 줄이고 CROSS JOIN은 늘린다. |
| 블록을 모두 닫았는가? | END IF, END WHILE, END와 DELIMITER를 확인한다. |
| 변수와 컬럼 이름이 충돌하지 않는가? | 필요하면 별칭과 명확한 변수명을 쓴다. |
| 반복 실행해도 같은 결과인가? | DROP IF EXISTS 또는 안전한 조건을 넣는다. |
| 결과가 비어도 정상일 수 있는가? | IN, NOT IN, JOIN 조건을 따로 테스트한다. |
프로시저와 조인, 집합 연산은 모두 작은 문법처럼 보이지만 오류가 나면 원인을 찾기 어렵다. 그래서 완성 SQL을 한 번에 실행하기보다 블록별로 나누어 검증하는 습관이 중요하다.
특히 프로시저는 서버에 저장되는 객체이므로 이름 충돌, 구분자 복구, 권한 문제까지 함께 생각해야 한다. JOIN과 UNION은 결과 행 수와 컬럼 의미가 맞는지 확인하는 것이 핵심이다.
| 문법 | 주요 역할 | 실무에서 보는 지점 |
|---|---|---|
| IF / ELSEIF | 조건에 따라 다른 명령 실행 | 조건 순서와 ELSE 처리 |
| WHILE | 조건이 참인 동안 반복 | 초기값, 증가식, 종료 조건 |
| INNER JOIN | 매칭되는 행만 연결 | ON 조건 누락 여부 |
| CROSS JOIN | 모든 조합 생성 | 결과 행 수 폭증 여부 |
| UNION ALL | 결과를 세로로 합침 | 컬럼 개수와 의미 일치 |
| ALTER CHANGE | 컬럼명과 타입 변경 | 기존 타입 재기입 여부 |
SQL 예제는 데이터가 어떤 모양인지에 따라 결과가 크게 달라진다. 같은 문법이라도 NULL이 있는지, 중복이 있는지, 관계가 1:1인지 1:N인지에 따라 해석이 달라진다.
| 데이터 상태 | 영향 | 확인 쿼리 |
|---|---|---|
| 중복 행 존재 | JOIN 또는 UNION ALL 결과가 늘어난다 | GROUP BY 후 COUNT(*) |
| NULL 존재 | NOT IN 결과가 예상과 달라질 수 있다 | WHERE 컬럼 IS NULL |
| 관계 누락 | INNER JOIN 결과에서 행이 사라진다 | LEFT JOIN으로 비교 |
| 오타 컬럼명 | ALTER나 SELECT가 실패한다 | DESC 테이블명 |
| 대량 테이블 | CROSS JOIN이 매우 느려질 수 있다 | 각 테이블 COUNT(*) |
이 묶음의 문법은 키워드 암기보다 “어떤 행이 남고 어떤 행이 사라지는가”를 설명하는 능력이 더 중요하다. 프로시저는 흐름을 저장하고, JOIN은 관계를 펼치며, UNION은 결과 집합을 합친다.
문제가 생기면 완성된 긴 SQL에서 바로 원인을 찾으려 하지 말고, 테이블 단독 조회와 작은 조건식부터 다시 확인한다. 이 방식이 가장 빠르고 재현 가능하다.
| 체크 | 통과 기준 |
|---|---|
| 제목 유지 | 기존 HTML title을 그대로 사용한다. |
| 코드 블록 | 원본 md의 핵심 SQL을 포함한다. |
| 용어 설명 | 초보자가 헷갈리는 키워드를 따로 설명한다. |
| 실수 정리 | 문법 오류와 결과 오류를 구분한다. |
| 검산 질문 | 실행 전후 확인할 질문을 남긴다. |
| 상황 | 바로 떠올릴 문법 | 주의 |
|---|---|---|
| 조건 분기 | IF, ELSEIF, ELSE | END IF 필수 |
| 반복 처리 | WHILE 조건 DO | 증가식 필수 |
| 객체 재생성 | DROP PROCEDURE IF EXISTS | 기존 객체명 확인 |
| 결과 합치기 | UNION ALL | 컬럼 수 일치 |
| 컬럼명 수정 | ALTER TABLE CHANGE | 타입까지 다시 작성 |
| 행 수 확인 | COUNT(*) | JOIN 전후 비교 |
이 예제는 실행 결과가 맞는지만 보는 것이 아니라, 결과가 나온 이유를 설명할 수 있을 때 정리된 것으로 본다. 조건, 반복, 조인, 집합, 구조 변경 중 어느 범주인지 먼저 분류하면 복습이 쉬워진다.
핵심 요약
Tags
'php' 카테고리의 다른 글
| MySQL CREATE TABLE FK 오류 — 참조 순서 완전 정리 (0) | 2026.06.29 |
|---|---|
| MySQL CREATE TABLE 기본 — 테이블 생성 완전 정리 (0) | 2026.06.29 |
| MySQL PROCEDURE — IF·ELSEIF 학점 계산 완전 정리 (0) | 2026.06.29 |
| MySQL PROCEDURE — DELIMITER · IF · DECLARE 완전 정리 (0) | 2026.06.29 |
| MySQL ALTER TABLE CHANGE — 컬럼명 변경 완전 정리 (0) | 2026.06.29 |
왕진 블로그

댓글