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) 한다.
'MySQL' 카테고리의 다른 글
[MYSQL] 에러 번호 1175 Safe Update 해결방법 (0) | 2018.07.17 |
---|---|
[MYSQL] 오늘, 어제, 내일 날짜 자동으로 입력하기 curdate() (0) | 2018.06.12 |
[MySQL] 날짜, 시간 표기 방식 지정하기 DATE_FORMAT() (0) | 2017.12.31 |
[MySQL] 행, 열 바꾸어 출력하기 CASE ~ AS (0) | 2017.12.30 |
[MySQL] 결과를 특정 순서로 정렬하기 ORDER BY FIELD() (2) | 2017.12.29 |
[MySQL] 데이터 변경하기 UPDATE (0) | 2017.12.28 |
[MySQL] 데이터 삭제하기 DELETE, TRUNCATE (1) | 2017.12.27 |
[MySQL] 테이블에 데이터 입력하기 INSERT INTO (0) | 2017.12.10 |
[MySQL] 테이블 이름 확인하기 SHOW TABLES (0) | 2017.12.08 |
[MySQL] DB에서 특정 행들만 가져오기(1) - WHERE 절의 "or"를 이용 (0) | 2017.09.08 |
댓글