본문 바로가기
MySQL

[MYSQL] 쿼리에서 변수 활용하기 SET

by LightBlogger 2018. 6. 19.

test 라는 테이블에서 어제자 데이터를 출력해야 하는 상황을 생각해 보자.


SELECT * FROM test WHERE date >= '2018-06-18'  and  date < '2018-06-19';


대략 위와 같이 쿼리를 구성하면 원하는 자료를 출력할 수 있을 것이다.



하지만 위와 같은 작업을 매일 반복해야 한다면


2018/06/12 - [MySQL] - [MYSQL] 오늘, 어제, 내일 날짜 자동으로 입력하기 curdate() 에 등장한 curdate()를 사용하는 편이 낫다.


SELECT * FROM test WHERE date >= subdate(curdate(), 1)  and  date < curdate();


위와 같이 쿼리를 구성하면 매일 별도로 날짜를 입력할 필요 없이 쿼리만 실행시키면 된다.



혹시 2일전, 3일전, 4일전 자료도 출력해야 한다면?


SELECT * FROM test WHERE date >= subdate(curdate(), 2)  and  date < subdate(curdate(), 1);


이렇게 하면 2일전


SELECT * FROM test WHERE date >= subdate(curdate(), 3)  and  date < subdate(curdate(), 2);


이렇게 하면 3일전 데이터를 출력할 수 있을 것이다.



그런데 이렇게 매번 두 개씩 숫자를 바꾸어주려니 뭔가 변수를 쓰면 좋을 것 같은 생각이 든다.


쿼리에도 변수를 사용할 수 있을까? 


가능하다. SET 명령을 사용하며 변수 앞에는 @이 붙는다.


SET @var = 1;

SELECT * FROM test WHERE date >= subdate(curdate(), @var)  and  date < subdate(curdate(), @var-1);


위와 같이 쿼리를 구성하면 @var 의 값만 변경하여 원하는 효과를 얻을 수 있다.


다만 쿼리가 두 개로 나누어지므로 매번 두 개의 쿼리를 각각 한 번씩 실행시켜 주어야 한다는 점은 조금 아쉽다.



MySQL 메뉴얼에 따르면 @var := 1 과 같이 콜론과 이퀄을 이용해 변수를 세팅하고 SELECT 문 안쪽에 한 번에 작성할 수도 있다고는 한다.


SELECT @var := 1, * FROM test WHERE date >= subdate(curdate(), @var)  and  date < subdate(curdate(), @var-1);


대략 위와 같은 문법이 되는 셈, 하지만 메뉴얼에서는 이렇게 사용하는 것을 권장하지 않으며, 


이렇게 사용할 경우 아마도 의도한 결과를 얻겠지만(might get) 그 정확성을 보장할 수는 없다고(not guaranteed) 한다.






반응형

댓글