대형 프로젝트 - C# + 유니티로 만드는 MMORPG 게임 개발/(2) 데이터베이스

SQL (16) - 변수와 흐름 제어

monstro 2025. 2. 18. 17:09
728x90
반응형

이번 포스트에서는 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

 

위 쿼리의 실행 결과는 다음과 같습니다.

 

의도한 대로 잘 수행된 것을 확인할 수 있습니다.

728x90
반응형