공부/인프런 - Rookiss

Part 5-2-18. SQL 입문 : 변수와 흐름 제어, 배치/테이블 변수

셩잇님 2024. 5. 30. 22:38
반응형

 

 

💅 SQL 입문

 

 지난 시간에는 TRANSACTION과 COMMIT, ROLLBACK을 통해 TRANSACTION의 개념과 COMMIT, ROLLBACK의 개념에 대해서 알아보았다. 이번 시간에서는 SQL에서의 변수의 선언부터 시작해서, 배치(batch), 흐름 제어(if~else)를 통한 흐름 제어를 통해 상황에 따라 유동적으로 코드를 처리하는 방법에 대해서 알아보는 시간을 가지자. 😎

 


 

🍩 변수 선언

 

C#, C++에서 변수 선언은 어떻게 할까? 아주 간단하다. int x;와 같이 선언하여 사용할 수 있다. SQL에서도 이와 마찬가지로 선언할 수 있다. 다만 SQL에서는 DECLARE*라는 키워드를 사용하여 변수를 선언한다. 변수의 선언 방법은 아래 예제를 참고한다.

* DECLARE의 뜻은 '선언하다.'이다.

 

-- 1. 변수의 선언 및 선언과 동시에 초기화
DECLARE @i AS INT;
DECLARE @j AS INT = 10;

-- 2. SET을 이용한 값 선언
DECLARE @z AS INT
SET @z = 10;

 

 

 일반적으로 개발언어에서 사용하는 방법과 동일하게 선언, 선언과 동시에 초기화, SET을 이용한 값 선언 등 다양한 방법으로 변수를 선언할 수 있다. 간단한 예제로 역대 최고 연봉을 받은 선수 이름을 파악해서 해당 선수의 이름을 변수 선언하여 그 안에 담아보자.  

 

-- 예제) 역대 최고 연봉을 받은 선수 이름?
SELECT TOP 1 *
FROM players AS p
	INNER JOIN salaries AS s
	ON p.playerID = s.playerID
ORDER BY s.salary DESC;

-- 쿼리를 실행하면 역대 최고 연봉을 받은 선수의 이름은 Alex Rodriguez임을 알 수 있다.

-- 변수를 이용하여 선수의 이름을 담아보자.
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;

-- 위와 같이 작성하면 @firstName에 해당 선수의 이름이 들어가는 것을 볼 수 있다. 👨‍🦱

 

 그러나 위와 같이 선언하면, @firstName과 @lastName을 각각 불러줘야하는 귀찮음이 있다. 따라서 SQL은 다음과 같은 문법을 제공한다. 강의에서는 SQL이 아닌 다른 서버에서는 지원을 하지 않는다고 말씀하셨는데 영상을 찍은 이후로 시간이 오래 지났기 때문에 지금은 명확하게 제공하고 있는지 여부는 잘 모르겠다.

 

-- SQL SERVER에서만 지원하는 문법
-- firstName과 lastName을 한번에 설정할 수 있다.
SELECT TOP 1 @firstName = p.nameFirst, @lastName = p.nameLast
FROM players AS p
	INNER JOIN salaries AS s
	ON p.playerID = s.playerID
ORDER BY s.salary DESC;

SELECT @firstName, @lastName;

 


 

🍩 배치(Batch)

 

 배치는 GO키워드를 통해 하나의 묶음으로 분석되고 실행되는 영역이라고 생각하면 된다. C#의 경우, 괄호 { }안의 지역변수와 괄호 바깥의 지역번수의 이름이 서로 같아도 상관없지만, SQL은 그렇지 않다. 따라서 아래와 같은 상황에서 배치를 이용한다. 즉 배치를 이용해 변수의 유효범위를 설정하는 것이다.

 

GO
DECLARE @i AS INT = 10;

-- 이미 위에 @i를 선언했음에도 불구하고 배치를 이용했기 때문에 문제없이 선언할 수 있다.

 

 배치는 하나의 묶음으로 분석되는 영역이므로 아래와 같이 쿼리를 작성해도 문제가 없다.

 

SELECT *
FOM players;

GO

SELECT *
FROM salaries

-- ↑ players는 확인할 수 없지만, salaries의 정보는 볼 수 있다. 배치로 구분을 나누었기 때문이다.

 


 

🍩 흐름제어

 

 흐름제어는 C#에서 일반적으로 사용하는 while, if~else문과 동일하다. 단 열이 2줄 이상일 경우 BEGIN과 END 키워드를 통해 영역을 구분해주어야 한다.

 

-- IF-ELSE
-- @i의 값이 10, 혹은 50일 때 출력되는 PRINT의 값이 다르다.
GO
DECLARE @i AS INT = 10; -- 50;

IF @i = 10
	PRINT('BINGO!');
ELSE
	PRINT('NO!');

-- 또한 아래와 같이 열이 2줄이 넘어가면 C#의 괄호({ })와 같이 BEGIN, END를 통해 묶어주어야 한다.
IF @i = 10
BEGIN
	PRINT('BINGO!');
	PRINT('BINGO!');
END
ELSE
	PRINT('NO!');

 

-- WHILE
GO

DECLARE @i AS INT = 0;
WHILE @i <= 10
BEGIN
	PRINT @i
	SET @i = @i + 1;
	IF @i = 3 CONTINUE
	IF @i = 6 BREAK
END

 


 

🍩 테이블 변수

 

 테이블 변수는 임시로 사용할 테이블을 변수로 선언하여 사용하는 것을 뜻한다. C#으로 예를 들면 임시 클래스 temp를 만들어 값을 임시로 저장한다고 볼 수 있다. 마찬가지로 DECLARE 키워드를 통해 선언한다. 아래 예제에서는 @test 테이블을 변수로 선언하여 임시 저장 하는 것을 볼 수 있다.

 

-- 임시로 사용할 테이블을 변수로 만들어 사용한다.
-- testA, testB 만들고 삭제 → NO!
GO

DECLARE @test TABLE
(
	name VARCHAR(50) NOT NULL,
	salary INT NOT NULL
);

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;

 

 

 

반응형