변수는 길고 복잡한 자료를 잠깐 보관하는 통이라고 생각하면 된다.
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 안에선 DECLARE 키워드로 변수를 생성하는 경우가 많다.
CREATE PROCEDURE mart.var_test()
BEGIN
DECLARE 변수1 INT;
DECLARE 변수2 VARCHAR(100);
DECLARE 변수3 INT DEFAULT 123;
END
CREATE PROCEDURE mart.var_test()
BEGIN
DECLARE 변수1 INT;
SET 변수1 = 10;
SET 변수1 = 변수1 + 1;
SELECT 변수1;
END
SET 변수를 사용해서 정의한 변수1에 10을 저장하였다. 그리고 값을 1 추가하였으므로
위의 코드는 11이 출력되어야한다.
변수를 사용할 수 있는 범위
@변수는 user variable 이라고 부르는데
작성하는 SQL 파일 모든 곳에서 전역으로 사용이 가능하다. 단점은 @변수를 똑같은 이름으로 중복선언하는 실수가 발생할 수 있다.
반면 DECLARE 변수는 변수를 만든 procedure 안에서만 사용할 수 있다. 그래서 마음대로 만들어도 안전하다.
변수가 언제사라지는지
@변수는 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은 한 번 만들면 접속 종료 전까지 계속 남아있기 때문이다.