HAVING

한상우·2024년 7월 4일

SQL

목록 보기
4/8

570. Managers with at Least 5 Direct Reports

  • 작성한 코드 (326ms)
WITH EmployeeCTE as (
    SELECT E1.name, E1.id, COUNT(E2.id) as reports
    FROM Employee as E1
    INNER JOIN Employee E2 ON E1.id = E2.managerId
    GROUP BY 1, 2
)
SELECT name
FROM EmployeeCTE
WHERE reports >= 5
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1PRIMARYnullALLnullnullnullnull6100null
2DERIVEDE1nullALLnullnullnullnull6100Using temporary
2DERIVEDE2nullALLnullnullnullnull616.67Using where; Using join buffer (hash join)
  • 상위 성능 코드 (271ms)
SELECT E1.name
FROM Employee as E1
INNER JOIN Employee E2 ON E1.id = E2.managerId
GROUP BY E1.id HAVING COUNT(E2.id) >= 5
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEE1nullALLnullnullnullnull6100Using temporary
1SIMPLEE2nullALLnullnullnullnull616.67Using where; Using join buffer (hash join)
  • 상위 성능 코드의 경우 HAVING 절을 사용하여 그룹화된 결과를 필터링 해 주어, 작성한 코드보다 테이블을 덜 사용 한다
    • HAVING절은 GROUP BY절과 함께 사용되며, 집계 함수(SUM, COUNT, AVG, ...)와 함께 그룹화된 데이터에 조건을 적용할 수 있게 해준다

논리적 쿼리 수행 순서

  • MySQL에서 논리적인 쿼리 수행 순서를 알아보자
# 예시 쿼리
SELECT column1, column2, AGGREGATE_FUNCTION(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2
HAVING AGGREGATE_FUNCTION(column3) condition
ORDER BY column1, column2
LIMIT limit_value
OFFSET offset_value;
  • 논리적 수행 순서
      1. FROM: 테이블에서 데이터를 읽습니다.
      1. WHERE: 행을 필터링합니다.
      1. GROUP BY: 그룹화합니다.
      1. HAVING: 그룹화된 결과를 필터링합니다.
      1. SELECT: 원하는 컬럼과 집계 함수를 선택합니다.
      1. ORDER BY: 결과를 정렬합니다.
      1. LIMIT/OFFSET: 결과의 행 수를 제한하고 시작 지점을 지정합니다
profile
개인 공부용 블로그입니다

0개의 댓글