procedure에서 많이 쓰는 변수 문법

윤빈·2026년 2월 6일

SQL & Database

목록 보기
17/25

변수문법

변수는 길고 복잡한 자료를 잠깐 보관하는 통이라고 생각하면 된다.

SET @age = 20;
SET @age := 20;
SELECT @age := 20;

이런식으로 변수를 정의하면 된다.
셋 다 같은 방법이다.

SET @age = 20;
SELECT @age;

이렇게 하면 20이 출력된다.

SET @price = 6000;
SELECT * FROM product WHERE 가격 = @price;

이런식으로 가격이 6000원인 상품만 가져오라는 코드로 활용할 수 있다.

SET @price = 
(SELECT COUNT(*) FROM product WHERE 가격 = 5000)

변수에는 한가지 값만 들어가면 되기 때문에
한가지 값만 출력된다면 서브쿼리를 넣어도 상관없다.

SET @age = 20;
SET @age = @age + 1;
SELECT @age;

기존 변수에 값을 수정할 때 값 추가를 하고 싶으면 SET 변수 = 변수 + 1
하면된다.

(참고)
procedure와의 차이점은 procedure는 SQL 문장을 저장할 때 쓰면 되고 @변수에는 숫자,문자,binary,NULL 이런 자료 1개만 간단하게 저장할 수 있다.

procedure 안에서 변수 만들어쓰기

procedure 안에선 DECLARE 키워드로 변수를 생성하는 경우가 많다.

CREATE PROCEDURE mart.var_test()
BEGIN
	DECLARE 변수1 INT;
    DECLARE 변수2 VARCHAR(100);
    DECLARE 변수3 INT DEFAULT 123;
END
  1. DECLARE 변수명 데이터타입;
    이렇게 적으면 변수 정의할 수 있다. @ 안써도된다.
  2. BEGIN안에 넣어야한다.
  3. DEFAULT는 변수만들 때 초기값을 넣어주는 부분이다.
  4. DECLARE로 만든 변수에 데이터를 저장하고 싶으면 똑같이 SET 키워드를 사용하면 된다.
CREATE PROCEDURE mart.var_test()
BEGIN
	DECLARE 변수1 INT;
    SET 변수1 = 10;
    SET 변수1 = 변수1 + 1;
  	SELECT 변수1;
END

SET 변수를 사용해서 정의한 변수1에 10을 저장하였다. 그리고 값을 1 추가하였으므로
위의 코드는 11이 출력되어야한다.

DECLARE 변수 vs @변수

  1. 변수를 사용할 수 있는 범위
    @변수는 user variable 이라고 부르는데
    작성하는 SQL 파일 모든 곳에서 전역으로 사용이 가능하다. 단점은 @변수를 똑같은 이름으로 중복선언하는 실수가 발생할 수 있다.
    반면 DECLARE 변수는 변수를 만든 procedure 안에서만 사용할 수 있다. 그래서 마음대로 만들어도 안전하다.

  2. 변수가 언제사라지는지
    @변수는 DB연결이 종료되면 사라지지만
    DECLARE 변수는 procedure 실행 종료시 바로 사라진다.

DROP PROCEDURE IF EXISTS mart.var_test;

DELIMITER $$
CREATE PROCEDURE mart.var_test()
BEGIN
  DECLARE 나이 int DEFAULT 10;
  SET 나이 = 나이 + 10; 
  SELECT 나이;

END
$$ 
DELIMITER ;

CALL mart.var_test();
CALL mart.var_test();
CALL mart.var_test();

이렇게 만들어두면 var_test()라는 procedure를 사용할 때 마다 항상 20이 출력된다.
왜냐하면 procedure이 끝나면 DECLARE 변수는 사라지고 호출할 때마다 새로 정의가 되기 때문이다.

DROP PROCEDURE IF EXISTS mart.var_test;

DELIMITER $$
CREATE PROCEDURE mart.var_test()
BEGIN
  SET @나이 = @나이 + 10;
  SELECT 나이;

END
$$ 
DELIMITER ;

SET @나이 = 10;
CALL mart.var_test();
CALL mart.var_test();
CALL mart.var_test();

반면 @나이 변수를 user variable로 바깥에 만들어주면 procedure를 계속 호출했을 때 20 30 40이 출력된다.
왜냐하면 user variable은 한 번 만들면 접속 종료 전까지 계속 남아있기 때문이다.

profile
취준하려면 이런건하나씩있어야한다길래

0개의 댓글