728x90
반응형
내가 만든 쿼리 (Query Cost = 144233.44)
SELECT
t.emp_no,
t.title,
t.from_date,
s.salary
FROM
titles AS t
JOIN
salaries AS s
ON
s.emp_no = t.emp_no
WHERE
t.title = 'Technique Leader'
AND s.to_date = '9999-01-01'
ORDER BY
s.salary DESC
LIMIT 1;
개선 쿼리
1. ROW_NUMBER()를 활용한 서브쿼리(queryCost = 3.50)
ROW_NUMBER()를 사용하면 정렬된 순서에서 가장 높은 값을 가진 직원만 빠르게 가져올 수 있습니다. 이는 특히 많은 데이터를 처리할 때 LIMIT보다 가독성과 확장성이 좋습니다.
WITH RankedSalaries AS (
SELECT
t.emp_no,
t.title,
t.from_date,
s.salary,
ROW_NUMBER() OVER (ORDER BY s.salary DESC) AS rnk
FROM
titles AS t
JOIN
salaries AS s
ON
s.emp_no = t.emp_no
WHERE
t.title = 'Technique Leader'
AND s.to_date = '9999-01-01'
)
SELECT
emp_no,
title,
from_date,
salary
FROM
RankedSalaries
WHERE
rnk = 1;
2. 서브쿼리를 활용한 최대값 필터링(query cost 100413.55)
MAX()를 사용해 salary의 최대값을 먼저 가져오고, 그 값과 일치하는 행을 찾는 방법입니다.
SELECT
t.emp_no,
t.title,
t.from_date,
s.salary
FROM
titles AS t
JOIN
salaries AS s
ON
s.emp_no = t.emp_no
WHERE
t.title = 'Technique Leader'
AND s.to_date = '9999-01-01'
AND s.salary = (
SELECT
MAX(salary)
FROM
titles AS t2
JOIN
salaries AS s2
ON
t2.emp_no = s2.emp_no
WHERE
t2.title = 'Technique Leader'
AND s2.to_date = '9999-01-01'
);
WITH 문법은 SQL에서 **Common Table Expression (CTE)**를 정의하는 데 사용됩니다. CTE는 쿼리 결과를 이름 있는 일시적인 테이블처럼 사용할 수 있게 해줍니다. 이는 복잡한 쿼리를 단순화하고, 가독성을 높이며, 재사용성을 제공하는 데 유용합니다.
WITH cte_name AS (
-- CTE 내부에 작성할 쿼리
SELECT column1, column2
FROM table_name
WHERE condition
)
SELECT *
FROM cte_name;
.
- WITH 키워드로 CTE를 시작합니다.
- cte_name은 임시 테이블처럼 사용할 CTE의 이름입니다.
- 괄호 () 안에 서브쿼리를 작성합니다.
- 이후 메인 쿼리에서 cte_name을 테이블처럼 참조합니다.
장점
- 가독성 향상:
- 복잡한 서브쿼리를 CTE로 분리하면 쿼리가 더 이해하기 쉬워집니다.
- 재사용성:
- 동일한 CTE를 여러 번 사용할 수 있습니다.
- 구조적 표현:
- CTE는 중첩된 서브쿼리를 피하면서 쿼리를 단계적으로 작성할 수 있게 해줍니다.
- 재귀 쿼리 지원:
- CTE는 재귀 쿼리 (계층 구조 데이터 처리 등)에 유용합니다.
728x90
반응형
'Database > mysql' 카테고리의 다른 글
[1일1쿼리] 현재 재직중인 Technique Leader 의 월급중 가장 높은 사람의 부서는? (0) | 2025.01.07 |
---|---|
[1일 1쿼리] 2일차 2000년 1월 의 부서별 평균 연봉중 가장 높은 부서는 ? (0) | 2025.01.03 |
[1일 1쿼리] 1일차 development부서에서 가장 높은 연봉을 받는 사람은? (0) | 2025.01.03 |
댓글