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
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|
| 1 | PRIMARY | | null | ALL | null | null | null | null | 6 | 100 | null |
| 2 | DERIVED | E1 | null | ALL | null | null | null | null | 6 | 100 | Using temporary |
| 2 | DERIVED | E2 | null | ALL | null | null | null | null | 6 | 16.67 | Using where; Using join buffer (hash join) |
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
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|
| 1 | SIMPLE | E1 | null | ALL | null | null | null | null | 6 | 100 | Using temporary |
| 1 | SIMPLE | E2 | null | ALL | null | null | null | null | 6 | 16.67 | Using 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;
- 논리적 수행 순서
- FROM: 테이블에서 데이터를 읽습니다.
- WHERE: 행을 필터링합니다.
- GROUP BY: 그룹화합니다.
- HAVING: 그룹화된 결과를 필터링합니다.
- SELECT: 원하는 컬럼과 집계 함수를 선택합니다.
- ORDER BY: 결과를 정렬합니다.
- LIMIT/OFFSET: 결과의 행 수를 제한하고 시작 지점을 지정합니다