Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 사용자 정의 변수 vs 로컬 변수, 핵심 차이점 완벽 정리

사용자 정의 변수(User-Defined Variable)란?

MySQL에서 사용자 정의 변수는 세션 전용 변수(session-specific variable)라고도 불립니다. 타입이 엄격하게 제한되지 않는(loosely typed) 변수로, 세션 도중 어느 시점이든 초기화할 수 있으며 세션이 종료될 때까지 그 값을 유지합니다.

사용자 정의 변수는 반드시 @ 기호를 접두사로 붙여야 합니다. 예를 들면 다음과 같습니다:

@anyVariableName;

사용자 정의 변수 초기화 방법 2가지

사용자 정의 변수를 초기화하는 방법에는 SET 명령어를 사용하는 방법과 SELECT 쿼리를 사용하는 방법, 두 가지가 있습니다.

첫 번째 방법은 다음과 같습니다:

SET @anyVariableName=anyValue;

두 번째 방법은 다음과 같습니다:

SELECT @anyVariableName :=anyValue;

주의할 점은 SELECT 쿼리에서 콜론(:)을 빠뜨리면 대입이 아닌 비교 연산식으로 평가된다는 것입니다. 이 경우 결과는 참(1) 또는 거짓(0)으로 반환됩니다:

mysql> select @m=10;

실행 결과는 다음과 같습니다:

+-------+
| @m=10 |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

로컬 변수(Local Variable)란?

로컬 변수는 저장 프로시저(stored procedure), 함수 등 프로그램 내부에서만 사용할 수 있는 변수입니다. DECLARE 키워드와 함께 선언하며, 사용자 정의 변수와 달리 @ 접두사가 필요하지 않습니다.

로컬 변수를 선언하는 기본 문법은 다음과 같습니다:

DECLARE yourVariableName dataType;

핵심 차이점: 로컬 변수는 저장 프로시저가 호출될 때마다 NULL 값으로 매번 새롭게 초기화됩니다. 반면 세션 전용 변수인 사용자 정의 변수는 NULL로 재초기화되지 않고 값을 계속 유지합니다. 또한 한 사용자가 설정한 사용자 정의 변수는 다른 사용자가 볼 수 없으며, 해당 사용자의 세션 변수는 접속이 종료되면 자동으로 소멸됩니다.

저장 프로시저로 확인하는 두 변수의 동작 차이

이제 실제 예제를 통해 세션 전용 변수와 로컬 변수의 차이를 살펴보겠습니다. 로컬 변수와 사용자 정의 변수를 함께 사용하는 저장 프로시저를 생성하는 쿼리는 다음과 같습니다:

mysql> DELIMITER //
mysql> CREATE PROCEDURE sp_LocalAndUserDefinedVariableDemo()
    -> BEGIN
    -> DECLARE localVariable int default 10;
    -> SET localVariable=localVariable+10;  
    -> SET @userVariable=@userVariable+10;
    -> SELECT localVariable;
    -> SELECT @userVariable;
    -> END;
    -> //
Query OK, 0 rows affected (0.39 sec)
mysql> DELIMITER ;

먼저 사용자 정의 변수에 값을 설정합니다:

mysql> SET @userVariable=10;
Query OK, 0 rows affected (0.00 sec)

첫 번째 호출

프로시저를 처음 호출하면 사용자 정의 변수는 10+10=20이 되고, 로컬 변수 역시 10+10=20이 됩니다.

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

실행 결과:

+---------------+
| localVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.32 sec)
+---------------+
| @userVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.34 sec)
Query OK, 0 rows affected (0.36 sec)

두 번째 호출

두 번째 호출부터 차이가 드러납니다. 사용자 정의 변수는 이전 값 20을 그대로 유지한 상태에서 10을 더해 20+10=30이 되지만, 로컬 변수는 다시 기본값 10으로 초기화된 후 10+10=20이 됩니다.

mysql> CALL sp_LocalAndUserDefinedVariableDemo();

실행 결과:

+---------------+
| localVariable |
+---------------+
|            20 |
+---------------+
1 row in set (0.00 sec)
+---------------+
| @userVariable |
+---------------+
|            30 |
+---------------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.02 sec)

세 번째 호출

세 번째 호출에서도 마찬가지입니다. 사용자 정의 변수는 값 30을 유지한 채 30+10=40이 되지만, 로컬 변수는 다시 10으로 초기화되어 10+10=20을 반환합니다.

정리

이 실험을 통해 알 수 있는 결론은 다음과 같습니다. 로컬 변수는 프로시저가 호출될 때마다 매번 초기화됩니다. 초기화 값은 NULL일 수도 있고, 위 예제처럼 DEFAULT 10처럼 지정한 기본값일 수도 있습니다. 즉, 프로시저가 호출될 때마다 로컬 변수는 항상 지정된 값으로 새로 설정되는 반면, 사용자 정의 변수는 세션이 유지되는 동안 값을 그대로 보존한다는 것이 두 변수의 가장 큰 차이점입니다.