안녕하세요
초급개발자로 쿼리 연습문제 푸는중 아우터 조인 질문드립니다
(문제는 오라클 기본 hr 계정입니다)
--employees 사원테이블
--departments 부서테이블
--locations 지역테이블
--countries 도시테이블
[문제]
국가(country_name) 별 도시(city)별 직원수를 조회하시오
단, 부서에 속해있지 않은 직원 이 있기 때문에 106명의 직원만 출력이 된다
부서정보가 없는 직원은 국가명과 도시명 대신에 ‘<부서없음>’이 출력되도록 하여 107명 모두 출력되게 한다
[답] -- 테이블 아우터 조인부분만
FROM
employees e
LEFT JOIN departments d ON e.department_id = d.department_id
LEFT JOIN locations l ON d.location_id = l.location_id
LEFT JOIN countries c ON l.country_id = c.country_id
[질문]
제가 푼 쿼리는 사원테이블 기준으로 부서테이블만 아우터 조인을 맺고
--e.dpeartment_id = d.department_id(+)
부서 테이블과 지역테이블,도시테이블은 이너조인을 맺었습니다
--d.location_id = l.location_id
--l.country_id = c.country_id
이유는 부서가없는 사원테이블과 조인을 맺은것만으로 조건이 완료되었다고 생각했는데요
답을보면
사원을 기준으로 부서로 아우터조인,
부서를 기준으로 지역과 아우터조인,
지역을 기준으로 도시와 아우터조인
이런식으로 아우터조인이 진행됩니다
사원과 부서테이블외에 나머지테이블이 아우터조인이 맺어져야하는지 이유를 모르겠습니다
혹시 알려주실분 계실까요? ㅜㅜ
[질문2]
조인시 실행 순서에대해 잘못이해하고있는지 여쭤봅니다.
첫번째 조인인 사원 기준으로 부서를 아우터로 걸면
부서가없는 전체 사원 107명이 조회되고
그결과를 갖고
107개의 부서테이블과 지역테이블이 이너조인을 맺고
그결과를 갖고
지역테이블과 도시테이블이 다시 이너조인을 맺고
이런식으로 돌아가는게 아닌건가요??
감사합니다!
먼저 조건을 명확히 합니다.
사원 테이블 : 사원의 정보 및 사원이 소속된 부서 아이디를 포함한다.
부서 테이블 : 부서 정보 및 부서가 위치한 지역 아이디를 포함한다.
지역 테이블 : 지역 정보 및 지역이 어느 도시에 소속되어 있는지 도시 아이디를 포함한다.
도시 테이블 : 도시 정보를 포함한다.
국가별, 도시별 직원 수를 구해야 합니다.
그런데 국가가 없네요. 지역별, 도시별 직원 수를 구해야 하는 문제 같습니다.
각각의 직원이 소속된 지역, 도시를 표시한 테이블을 출력하는 쿼리를 먼저 작성하고
이 쿼리에 지역, 도시별로 그룹화 한 후 직원 정보를 카운팅하는 쿼리를 추가해 주면 됩니다.
각각의 직원이 소속된 지역, 도시를 표시한 테이블을 출력하는 쿼리를 생각해 봅시다.
직원 아이디가 1,2,3,4,5가 있다고 합시다.
각각 아이디별로 매칭이 되는 부서가 판매, 연구, 사무가 있다고 합시다.
만약 매칭이 1-판매, 2-연구, 3-사무가 되면
원하는 결과는 1-판매, 2-연구, 3-사무, 4-null 이 되어야 합니다.
이것을 조인을 한다면
1-판매, 2-연구, 3-사무만 나오고 4-null은 나오지 않습니다.
레프트 조인을 하면
1-판매, 2-연구, 3-사무, 4-null가 나옵니다.
이제 각각의 부서가 속한 지역을 출력한다고 합시다.
그런데 테이블의 지역 중 일부가 빠져 있을 경우가 있을 수 있습니다.
매칭이 판매-강남구, 연구-해운대구, 사무-달서구라고 할 때
지역 테이블에는 달서구가 없을 경우가 있습니다.
이 경우를 고려해 주게 되면
판매-강남구, 연구-해운대구, 사무-null이라는 결과가 나와야 합니다.
그런데 조인을 하면
1-판매-강남구, 2-연구-해운대구만 나오게 됩니다.
레프트 조인을 하게 되면
1-판매-강남구, 2-연구-해운대구, 3-사무-null, 4-null-null이 나오게 됩니다.
도시 테이블과의 조인도 마찬가지입니다
매칭이 강남구-서울, 해운대구-부산, 달서구-대구라고 했을 때,
도시 테이블에 부산과 대구가 없다고 합시다. 그러면
조인을 하면
1—판매-강남구-서울만 나옵니다.
레프트 조인을 하면
1—판매-강남구-서울, 2-연구-해운대구-null, 3-사무-달서구-null, 4-null-null-null이 나옵니다.
질문 1
먼저 지역 테이블에 해당 부서가 속한 모든 지역이 표기되어 있는지 확인합니다. 지역 중 부서와 매칭이 되지 않는 것이 있다면 조인하게 되면 매칭되지 않는 부서가 쿼리 결과에서 사라진다는 점을 떠올려야 합니다.
마찬가지로 도시 테이블에도 해당 지역이 속한 모든 도시가 표기되어 있는지 확인하고 매칭되지 않는 것이 있다면 조인을 할 시 도시가 쿼리 결과에서 사라진다는 것을 알아야 합니다.
문제에 나온 조건뿐만 아니라 테이블에 어떤 데이터가 들어 있는지도 살피세요.
질문2
사원 테이블에 부서를 레프트 조인하면
1-판매, 2-연구, 3-사무, 4-null이 됩니다.
이 결과에 지역을 조인하면 어떻게 될까요?
원하는 결과는
1-판매-강남구, 2-연구-해운대구, 3-사무-null, 4-null-null 이어야 합니다.
하지만 조인을 하게 되면
1-판매-강남구, 2-연구-해운대구로 지역 테이블에서 연결될 수 있는 값이 없다면 사라집니다.
따라서 레프트 조인을 해야 합니다.
추가
부서, 지역, 도시 테이블을 조인으로 묶으면
판매-강남구-서울만 남게 됩니다.
이것을 사원 테이블에 레프트 조인을 하게 되면
1-판매-강남구-서울
2-null-null-null
3-null-null-null
4-null-null-null
이 나오게 할 수 있습니다.
사원의 수 106명은 카운팅 할 수 있어야 하므로 어떤 조인을 하더라도 사원 수가 줄어들게 해서는 안 됩니다.
그리고 select절에 지역과 도시에 null이면 부서없음으로 출력하게 조건을 걸어주면
각각의 직원이 소속된 지역, 도시를 표시한 테이블을 출력하는 쿼리를 만들 수 있습니다.
여기다 그룹화 한 뒤 카운팅 걸어주면 답을 구할 수 있습니다.