개발 공부 기록하기/02. DB & SQL

내맘대로 정리하는 Real MySQL #9장) 사용자 정의 변수

lannstark 2020. 9. 2. 07:38

<내맘대로 정리하는> 시리즈는, 책을 읽으며 몰랐던 내용을위주로 정리한 내용 그대로 포스팅하는 시리즈입니다 ^^

원문의 문맥이 궁금하면 (좋은 책이니) 이 참에 하나 장만하는 것은 어떤가요??

MySQL 서버가 정의한 변수가 아니라 사용자가 정의하는 변수를 의미한다. 사용자 변수는 해당 커넥션에서만 유효하기 때문에 항상 세션 변수로 취급된다. 또한 사용자가 언제든지 값을 변경할 수 있기 때문에 동적 변수로 볼 수 있다.

사용자 변수 개요

  • MySQL의 사용자 변수 이름은 @로 시작한다.
  • 사용자 변수는 저장하는 값에 의해서 그 타입이 정해진다.
  • 저장할 수 있는 타입은 Integer, Decimal, Float, Binary와 문자열 타입만 가능하다.
  • 초기 값을 설정하지 않으면 NULL이 된다.
  • 값을 할당하는 SET 문장은 = 또는 := 연산자를 이용한다
SET @var := 'User Variable';
SELECT @var AS var1;
SET @rownum=0;

SELECT (@rownum:=@rownum+1) AS rownum, emp_no FROM employees LIMIT 5;

@rownum:=@rownum+1은 변수에 값을 할당하는 동시에 값을 참조하고 있다.

하지만 MySQL 메뉴에 '절대 동일 SQL 문장에서 변수에 값을 할당하고 동시에 참조하지 말라'라고 나와 있다. 그 이유는 사용자 정의 변수는 버전에 따라 일관되게 작동하지 않을 수 있기 때문이다.

→ (개인적인 생각) 사용자 변수는 웹 애플리케이션에서는 가능한 (절대) 쓰면 안된다

몇 가지 사용 예시

N 번째 레코드 가져오기

SELECT *
FROM departments, (SELECT @rn:=0) x
WHERE (@rn:@rn+1) = 3
ORDER BY dept_name;

누적 합계 가져오기

SELECT (@acc_salary:=@acc_salary + salary) AS acc_salary
FROM salaries, (SELECT @acc_salary:=0) x
LIMIT 10;

그룹별 랭킹 구하기

SELECT
  emp_no, first_name, last_name,
  IF(@prev_firstname=first_name,
     @rank:=@rank+1, @rank:=1+LEAST(0,@prev_firstname:=firstname)) rank
FROM employees, (SELECT @rank:=0) x1, (SELECT @prev_firstname:='DUMMY') x2
WHERE first_name IN ('Georgi', 'Bezalel')
ORDER BY first_name, last_name;