
부서별 직원을 계산하는 쿼리를 쓰라.
내가 생각한 쿼리
SELECT
D.NAME,
COUNT(1) AS '부서별 직원 수'
FROM employees E INNER JOIN departmenst D ON E.DEPARTMENT_ID = D.ID
GROUP BY D.ID
이렇게 썼을 때의 문제점
INNER JOIN 했기 때문에 인원이 없는 부서는 결과에 나타나질 않음.
위 테이블엔 모두 부서 안에 인원이 있기 때문에 상관없지만 만약 없다면 달라짐.
만약 꿀잠팀 부서가 존재하고 그 부서에 인원이 없다면 결과에 부서 이름과 부서별 직원 수에 아예 나오지도 않음.

정답 쿼리
SELECT
d.name, COUNT(e.id) AS employee_count
FROM departments d LEFT JOIN employees e ON d.id = e.department_id
GROUP BY d.id
LEFT JOIN 했기 때문에 인원이 없는 부서라도 결과에 부서 이름 : 0명 이런식으로 나오기라도 함.
만약 꿀잠팀이 존재하고 그곳에 속한 인원이 없다면
위 결과에서 인사팀부터 기술팀 인원은 그대로 나오나 꿀잠팀 0이 나왔을것.

INNER JOIN, LEFT JOIN 차이
- INNER JOIN
두 테이블 간의 공통된 데이터만 반환한다.
두 테이블에서 일치하는 행만 포함되며, 일치하지 않는 행은 결과에 포함되지 않는다.
두 테이블에서 특정 조건을 만족하는 데이터만 필요할 때 사용한다.
- LEFT JOIN
왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 데이터를 반환하며, 오른쪽 테이블에 일치하는 데이터가 없을 경우 NULL로 표시한다.
왼쪽 테이블의 모든 행이 포함되며, 오른쪽 테이블에 일치하는 행이 없으면 NULL 값 반환.
왼쪽 테이블의 모든 데이터를 보존하면서, 오른쪽 테이블의 관련 데이터를 가져오고 싶을 때 사용한다.
'오류, 기능, 문제해결(SQL)' 카테고리의 다른 글
| ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) MacOs 기준 (0) | 2025.04.24 |
|---|---|
| TIMESTAMPDIFF가 알아서 윤년을 포함할까? (1) | 2024.12.04 |
| Invalid use of group function 해결 / WHERE, HAVING 차이? (1) | 2024.12.03 |
| SQL 명령어 사용법 기억날 때 마다 와서 써놓기 (0) | 2024.11.27 |