이 문제를 풀면서 평소와 같이 쿼리를 아래처럼 작성했다.
SELECT
DEPT_ID,
DEPT_NAME_EN,
ROUND(AVG(SAL)) AS AVG_SAL
FROM HR_EMPLOYEES
LEFT JOIN HR_DEPARTMENT
USING(DEPT_ID)
GROUP BY DEPT_ID,
DEPT_NAME_EN
ORDER BY AVG_SAL DESC;
근데 계속 이런 쿼리에서 걸리는 점이 GROUP BY할 때 사실 DEPT_ID 하나만 해도 상관없는데, GROUP BY 사용할 때 SELECT 절에 올 수 있는 건 그룹화 대상이거나, 집계함수라고 알고 있었어서 계속 써왔다.
근데! 다른 사람 코드를 보니까 안써도 된다지 뭐야?
SELECT
DEPT_ID,
DEPT_NAME_EN,
ROUND(AVG(SAL)) AS AVG_SAL
FROM HR_EMPLOYEES
LEFT JOIN HR_DEPARTMENT AS D
USING(DEPT_ID)
GROUP BY DEPT_ID
ORDER BY AVG_SAL DESC;
그래서 GROUP BY에 DEPT_ID만 썼는데도 문제가 없는게 아니던가???????
그래서 GPT한테 물어봤다.
이렇다는거지....
생각해보니까 그렇다! 내가 지금 이 쿼리에서 DEPT_ID를 기준으로 DEPT_NAME_EN을 가져오고있기 때문에 DEPT_ID에 있어 DEPT_NAME_EN은 1:1 매칭이다. (N:1이어도 N인 컬럼이 그룹화 대상이라면 상관 없다.)
그리고 내가 지금 DEPT_ID로 그룹화를 하고있으니까 필요없는거임!
그렇기 때문에 GROUP BY에 DEPT_NAME_EN을 포함시키지 않아도 된다고 한다!
대박.
JOIN을 통해 특정 컬럼과 1:1 매칭 되는 컬럼 X의 경우 특정 컬럼으로 GROUP BY시, 컬럼 X를 그룹화 대상으로 두지 않고 SELECT 절에 이용할 수 있다.