작성
·
77
0
안녕하세요.
섹션5의 두번째 강의인 Group by 실습-01 에서 다룬 예제에 대해 질문드립니다.
-- 부서명 SALES와 RESEARCH 소속 직원별로 과거부터 현재까지 모든 급여를 취합한 평균 급여
select b.empno, max(b.ename) as ename, avg(c.sal) as avg_sal
from hr.dept a
join hr.emp b on a.deptno = b.deptno
join hr.emp_salary_hist c on b.empno = c.empno
where a.dname in('SALES', 'RESEARCH')
group by b.empno
order by 1;
이 쿼리에서 b.ename을 집계함수에 넣지 않고 아래와 같이 group by에 넣어서 출력하는 방식으로 해봤는데 결과가 동일하게 나옵니다.
select b.empno, b.ename, avg(c.sal) as avg_sal
from hr.dept a
join hr.emp b on a.deptno = b.deptno
join hr.emp_salary_hist c on b.empno = c.empno
where a.dname in('SALES', 'RESEARCH')
group by b.empno, b.ename
order by 1;
두 쿼리 중 실무적으로 더 권장하는 방법이 있으신가요? 성능 혹은 기능 등의 차이가 있는지도 궁금합니다.
답변 2
1
안녕하십니까,
두가지 SQL 모두 결과가 동일합니다. (왜 동일하게 되는지도 아셔야 하는데) 고유한 empno 별로 서로 다른 ename이 존재 할 수 없기 때문에 group by empno 나 group by empno, ename 이나 group by 레벨이 동일하게(empno 레벨로) 됩니다.
강의에서도 말씀드리는데 group by 에 들어가는 컬럼은 group by의 집합 레벨을 명확하게 지정해 주면서 설정해 주는게 좋습니다. 그래서 group by empno로 하시는게 group by empno, ename 보다 더 좋은 방식입니다. 현 SQL은 Group by를 empno 레벨로 하겠다고 명확하게 지정하고 있기 때문입니다.
실무에서 사용되는 SQL중에는 Select 절의 출력 때문에 불필요하게 empno, ename으로 group by 를 하는 경우들이 있는데, (이게 크게 잘못되었다기 보다는 ^^) 이는 권장 드리고 싶지 않은 SQL 스타일입니다. 본 실습 SQL은 SQL이 그다지 복잡하지 않지만 실무에서는 이렇게 불필요한 Group by로 인해서 SQL이 이유없이(?) 복잡해지는 경우들이 생길 수도 있습니다.
성능적으로는 큰 차이는 없지만, 굳이 조그만한 차이라도 성능차이에 넣자면 Group by empno, ename이 group by 부하가 좀 더 크기 때문에 시간이 더 걸릴 수 있습니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
JE님께서 질문하신 내용과 비슷한 질문과 답변이 있어 관련 정보를 공유드립니다. group by
사용 시, 컬럼이 select
절에 나오기 위해 집계 함수와 함께 사용되거나 group by
절에 포함되어야 함을 알고 계시는 것 같습니다.
현재 두 쿼리 모두 동일한 결과를 반환하지만 방법론적으로 차이가 있습니다.
첫 번째 쿼리 (max(b.ename)
사용):
b.empno
로 group by
를 수행하고, b.ename
을 집계 함수 (max()
)로 래핑합니다. empno
가 고유한 키로 사용되므로 ename
이 중복될 가능성이 없어 max()
나 min()
을 사용하는 것이 유효합니다.group by
에 사용되지 않은 컬럼을 출력할 때 일반적으로 사용됩니다.두 번째 쿼리 (group by b.empno, b.ename
사용):
b.ename
도 group by
에 포함하여 그룹화된 결과를 반환합니다.b.empno
에 의해 이미 데이터가 고유하게 식별되므로 b.ename
을 추가적으로 group by
에 포함해도 결과가 동일하게 나옵니다. 하지만, 이는 데이터베이스가 더 많은 컬럼으로 그룹화를 처리하게 하여 불필요한 추가 작업을 초래할 수도 있습니다.실무적으로 권장하는 방법:
- 첫 번째 방법(max(b.ename)
)을 주로 권장합니다. 이는 명시적으로 집계가 필요한 컬럼에 대해 집계 함수(max
, min
)를 사용하여 동일한 처리와 설명을 가능하게 합니다. 또한, 컬럼 추가로 인한 group by
의 처리 부담을 줄일 수 있습니다.
아래 게시물을 참조하시면 질문에 대한 설명을 보다 상세히 보실 수 있습니다:
- 조인 실습 02에서 max(ename) as ename을 max함수로 한 이유가 뭔가요?
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
결과는 동일할지라도 첫번째 쿼리가 group by의 집합 레벨을 더 명확히 규정한다는 점에서 더 좋은 쿼리라는 말씀 도움이 많이 되었습니다. 쿼리를 짤 때 group by의 집합 레벨 혹은 부하를 생각하지 않고 냅따 group by에 많은 컬럼을 때려박을(?) 때가 있는데, 주의해야할 것 같습니다. 답변 감사합니다!