본문 바로가기
Database/mysql

[1일1쿼리] 현재 재직중인 Technique Leader 의 월급중 가장 높은 사람은?

by JINJINC 2025. 1. 6.
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;

.

  1. WITH 키워드로 CTE를 시작합니다.
  2. cte_name은 임시 테이블처럼 사용할 CTE의 이름입니다.
  3. 괄호 () 안에 서브쿼리를 작성합니다.
  4. 이후 메인 쿼리에서 cte_name을 테이블처럼 참조합니다.

장점

  1. 가독성 향상:
    • 복잡한 서브쿼리를 CTE로 분리하면 쿼리가 더 이해하기 쉬워집니다.
  2. 재사용성:
    • 동일한 CTE를 여러 번 사용할 수 있습니다.
  3. 구조적 표현:
    • CTE는 중첩된 서브쿼리를 피하면서 쿼리를 단계적으로 작성할 수 있게 해줍니다.
  4. 재귀 쿼리 지원:
    • CTE는 재귀 쿼리 (계층 구조 데이터 처리 등)에 유용합니다.
728x90
반응형

댓글