MySQL에서는 쿼리 내에서 사용자 정의 변수를 생성하고 값을 할당할 수 있음
SELECT @변수명 := 컬럼 또는 표현식
- @변수명: '@'로 시작하는 사용자 정의 변수
- :=: MySQL의 할당 연산자
- 컬럼 또는 표현식: 변수에 할당될 값
SELECT @total_salary := SUM(salary)
FROM employees
WHERE department_id = 10;
부서 ID가 10인 직원들의 총 급여를 계산하여 @total_salary 변수에 할당
- SUM(salary): 급여의 합계를 계산
- @total_salary에 계산된 합계가 할당
- 쿼리 결과로 할당된 값이 반환
@A := B 처럼 변수에 할당하고
@A 로 변수를 사용하믄 댐
사용자 정의 변수는 다음과 같은 상황에서 유용하게 사용될 수 있음:
1. 복잡한 계산 결과를 저장하고 재사용할 때
-- 회사의 평균 급여를 계산하고, 이를 기준으로 고액 연봉자를 찾음
SELECT @avg_salary := AVG(salary) FROM employees;
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > @avg_salary * 1.5;
@avg_salary에 평균 급여를 저장하고, 이를 다음 쿼리에서 재사용하여 평균의 1.5배 이상 받는 직원을 찾음.
2. 동일한 쿼리 내에서 여러 번 사용되는 값을 효율적으로 관리할 때
-- 특정 부서의 최고 급여자와 최저 급여자를 한 번의 쿼리로 찾음
SELECT
@dept_id := 10 as department_id,
@max_salary := MAX(salary),
@min_salary := MIN(salary)
FROM employees
WHERE department_id = @dept_id;
SELECT
e1.employee_id as highest_paid_emp_id,
e2.employee_id as lowest_paid_emp_id
FROM
employees e1,
employees e2
WHERE
e1.department_id = @dept_id AND e2.department_id = @dept_id
AND e1.salary = @max_salary AND e2.salary = @min_salary;
3. 연속적인 쿼리에서 이전 쿼리의 결과를 활용할 때
-- 가장 최근에 고용된 직원을 찾고, 그 직원의 부서에서 가장 오래 일한 직원을 찾음
SELECT @latest_hire_date := MAX(hire_date) FROM employees;
SELECT @latest_hire_dept := department_id
FROM employees
WHERE hire_date = @latest_hire_date
LIMIT 1;
SELECT employee_id, first_name, last_name, hire_date
FROM employees
WHERE department_id = @latest_hire_dept
ORDER BY hire_date ASC
LIMIT 1;
첫 번째 쿼리에서 가장 최근 고용 날짜를 찾고, 두 번째 쿼리에서 그 날짜에 해당하는 직원의 부서를 찾음.
마지막 쿼리에서는 그 부서에서 가장 오래 일한 직원을 찾음.
주의사항:
- 이 문법은 MySQL과 MariaDB에서 주로 사용되며, 다른 데이터베이스 시스템과는 호환되지 않을 수 있음.
- 과도한 사용은 쿼리의 가독성을 해칠 수 있으므로, 필요한 경우에만 사용하는 것이 좋음.
- 변수의 범위는 현재 클라이언트 세션으로 제한됨.
이 문법을 이용하면 복잡한 쿼리를 더 효율적으로 작성할 수 있으며, 특히 저장 프로시저나 함수에서 유용하게 활용될 수 있음.
AS와의 유사점과 차이점:
유사점:
- 둘 다 결과 집합에 열을 생성함.
- 쿼리 결과를 특정 이름으로 참조할 수 있게 해줌.
차이점:
- 문법:
- AS: SELECT column AS alias
- 변수 할당: SELECT @variable := column
- 용도:
- AS: 결과 집합의 열에 별칭을 부여함.
- 변수 할당: 값을 변수에 저장하고, 쿼리 내에서 재사용할 수 있게 함.
- 범위:
- AS: 해당 쿼리의 결과 집합에서만 유효함.
- 변수 할당: 세션 내에서 지속적으로 사용 가능함.
- 재사용성:
- AS: 다른 쿼리에서 재사용 불가능함.
- 변수 할당: 같은 세션 내의 다른 쿼리에서도 사용 가능함.
SELECT salary AS monthly_salary, @annual_salary := salary * 12
FROM employees
WHERE employee_id = 100;
'monthly_salary'는 결과 집합의 열 이름이고, '@annual_salary'는 재사용 가능한 변수임.
'MyBatis' 카테고리의 다른 글
LPAD, NEXTVAL (ID 관리) (0) | 2024.09.09 |
---|---|
계층 쿼리 (중첩 SELECT_mysql, CTE_mysql, CONNECT BY_oracle) (0) | 2024.09.09 |
<sql>, <include>, <selectKey> (0) | 2024.09.09 |
<set>, <where> (0) | 2024.09.09 |
<if>, <foreach>, <trim> (0) | 2024.09.09 |