이번 포스트에서는 SQL에서 변수를 사용하는 방법과 흐름 제어를 구현하는 방법을 알아보겠습니다.
1) 변수
프로그래밍 언어인 SQL에서도 변수를 다루는 방법은 존재합니다.
다음의 연산자들을 사용하여 변수를 다룰 수 있습니다.
- DECLARE : 변수의 선언
- SET : 변수의 정의
1 - 1) 간단한 변수의 사용 예제
예제를 통해 변수를 사용하는 방법을 알아보겠습니다.
-- 변수의 초기화
DECLARE @num AS INT = 10;
-- 변수의 선언 + 정의
DECLARE @num2 AS INT;
SET @num2 = 10;
위와 같이 2개의 변수를 정의하였습니다.
두 변수를 SELECT한 결과는 다음과 같습니다.

1 - 2) 변수의 사용예제
이제 실제 데이터 테이블을 사용하여 변수를 만들어보겠습니다.
-- 역대 최고 연봉을 받은 선수의 이름을 성과 이름으로 분리하여 @firstName, @lastName 변수에 저장
DECLARE @firstName AS NVARCHAR(15);
DECLARE @lastName AS NVARCHAR(15);
SET @firstName = (SELECT TOP 1 nameFirst
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID
ORDER BY s.salary DESC);
SELECT @firstName;
위와 같이 쿼리를 구성하였습니다.
실행 결과는 다음과 같습니다.

위와 같이 SET을 사용하여 변수를 정의할 수 있지만,
MSSQL에서는 다른 방식으로도 변수를 정의할 수 있습니다.
-- MSSQL에서만 유효한 변수 사용예제
DECLARE @firstName2 AS NVARCHAR(15);
DECLARE @lastName2 AS NVARCHAR(15);
SELECT TOP 1 @firstName2 = p.nameFirst, @lastName2 = p.nameLast
FROM players AS p
INNER JOIN salaries AS s
ON p.playerID = s.playerID
ORDER BY s.salary DESC;
SELECT @firstName2;
SELECT @lastName2;
위 쿼리의 실행 결과는 다음과 같습니다.

위와 같이 문제없이 실행하는 것을 볼 수 있습니다.
2) BATCH
이번에는 BATCH에 대해 알아보겠습니다.
BATCH는 하나의 묶음으로 분석되고 실행되는 명령어 집합을 의미하는데,
간단하게 말해 쿼리안에 지역을 만들어 해당 지역에서만 유효한 변수를 만들 수 있게 해주는 기능입니다.
다른 언어에서의 { }라고 생각하시면 됩니다.
SQL에서의 BATCH를 생성하는 방법은 간단하게 쿼리앞과 끝에 GO를 작성해주면 됩니다.
실제 예제를 통해 BATCH를 다뤄보도록 하겠습니다.
GO
DECLARE @num3 AS INT = 10;
SELECT @num3;
GO
DECLARE @num3 AS INT = 15;
SELECT @num3;
두 개의 쿼리 모두 동일한 이름의 변수 @num3를 선언하고 정의하고 있습니다.
위의 쿼리의 @num3는 BATCH에서만 유효하고 BATCH 밖에서는 존재하지 않으므로 문제없이 실행됩니다.
실행결과를 살펴보겠습니다.

문제없이 로직이 동작한 것을 확인할 수 있습니다.
3) 흐름제어
3 - 1) 한줄로 동작하는 IF
흐름제어의 문법 중 IF를 SQL에서 사용하는 방법을 알아보겠습니다.
GO
DECLARE @num4 AS INT = 10;
IF @num4 = 10
PRINT('Correct');
ELSE
PRINT('Incorrect');
GO
아주 간단하게 @num4의 값을 비교하여 10일 경우와 그렇지 않은 경우의 로직을 분기하여 실행합니다.
실행 결과는 다음과 같습니다.

3 - 2) 여러줄로 동작하는 IF
이번에도 IF를 사용하되, 이전처럼 한줄로 동작하지 않고 여러줄로 동작하는 IF문을 사용해보겠습니다.
GO
DECLARE @num4 AS INT = 10;
IF @num4 = 10
BEGIN
PRINT('Correct1');
PRINT('Correct2');
END
ELSE
PRINT('Incorrect');
GO
여러줄로 동작하는 경우 해당하는 로직을 BEGIN ~ END로 감싸주어야 합니다.
실행 결과는 다음과 같습니다.

3 - 3) 단일 WHILE
이번에는 마찬가지로 흐름제어 중 하나인 WHILE문을 SQL에서 사용해보겠습니다.
GO
DECLARE @num4 AS INT = 0;
WHILE @num4 <= 10
BEGIN
PRINT @num4;
SET @num4 = @num4 + 1;
END
GO
@num4의 값이 10이하일 때까지만 동작하며 @num4의 값을 출력합니다.
실행 결과는 다음과 같습니다.

문제없이 수행하는 것을 볼 수 있습니다.
3 - 4)WHILE + BREAK / WHILE + CONTINUE
WHILE문에 반복문 중지를 수행하는 BREAK문과 루프를 건너뛰는 CONTINUE문을 사용해보겠습니다.
-- WHILE + BREAK
GO
DECLARE @num4 AS INT = 0;
WHILE @num4 <= 10
BEGIN
PRINT @num4;
SET @num4 = @num4 + 1;
IF @num4 = 6 BREAK;
END
GO
-- WHILE + CONTINUE
GO
DECLARE @num4 AS INT = 0;
WHILE @num4 <= 10
BEGIN
SET @num4 = @num4 + 1;
IF @num4 = 6 CONTINUE;
PRINT @num4;
END
GO
총 2개의 쿼리문이며 수행 결과는 다음과 같습니다.

첫 번째 쿼리는 @num4가 6이 되었을 때 BREAK하여 반복문을 완전종료하였습니다.

두 번째 쿼리는 @num4가 6이 된 경우 해당 루프를 건너뛰고 진행하였습니다.
4) 데이터 테이블의 변수화
마지막으로 데이터 테이블을 변수로 만드는 방법을 알아보겠습니다.
테이블 변수를 통해 임시로 사용할 테이블을 만들 수 있습니다.
데이터 테이블 변수는 DECLARE를 통해 만들 수 있고 tempdb 데이터베이스에 임시적으로 저장합니다.
만든 쿼리는 다음과 같습니다.
-- 임시 데이터 테이블 @test 생성
DECLARE @test TABLE
(
name VARCHAR(50) NOT NULL,
salary INT NOT NULL
);
-- players 테이블과 salaries 테이블을 내부 결합하고
-- players 테이블의 열 nameFirst와 nameLast를 공백을 넣고 합치고, salaries 테이블의 열 salary를
-- @test 테이블에 추가
INSERT INTO @test
SELECT p.nameFirst + ' ' + p.nameLast, s.salary
FROM players AS P
INNER JOIN salaries AS s
ON p.playerID = s.playerID;
SELECT *
FROM @test
GO
위 쿼리의 실행 결과는 다음과 같습니다.

의도한 대로 잘 수행된 것을 확인할 수 있습니다.
'대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발 > (2) 데이터베이스' 카테고리의 다른 글
| SQL (18) - INDEX 분석 (0) | 2025.02.19 |
|---|---|
| SQL (17) - 윈도우 함수 (0) | 2025.02.18 |
| SQL (15) - TRANSACTION (0) | 2025.02.18 |
| SQL (14) - JOIN (0) | 2025.02.17 |
| SQL (13) - 집합 연산자 (0) | 2025.02.17 |