Database

[Database] Ch06.JOIN - 문제 풀이

OptimizerStart 2025. 4. 30. 18:39

 

[Database] Ch06.JOIN - 문제 풀이

현재 SELF JOIN까지 풀었습니다. 틀린 답이 있을 수도 있습니다.

tabase

[Database] Ch05.SubGroup으로 데이터 분류 - 문제 풀이

6.4 EQUIJOIN 예 - 예제 9

1. 직원(S_EMP) 테이블과 부서(S_DEPT)테이블을 JOIN하여, 사원의 이름과 부서, 부서명을 나타내시오.

select e.name, e.dept_id, d.name
from s_emp e, s_dept d  
where e.dept_id = d.id;

 


6.5 칼럼과 테이블의 ALIAS사용 - 예제 10

1. 서울 지역에 근무하는 사원에 대해 각 사원의 이름과 근무하는 부서명을 나타내시오. 

select distinct e.name, d.name 
from s_dept d, s_region r, s_emp e
where d.region_id = r.id and r.name like '%서울%';
-- where d.region_id = r.id and r.name like '%서울%' and e.title = '사원'; -- 사원 직책으로 제한하는 경우

 

생각 정리 
select distinct e.name, d.name  -- 44
from s_dept d, s_region r, s_emp e
where d.region_id = r.id and r.name like '%서울%' and e.title = '사원';
-- r.id = 1 조건을 and로 주면서 다른 지역인 부서 제외함. dept_id를 축소시킴
-- [주의] r.id =1인 데이터를 보고 서울의 region_id 가 1인걸 알고 대입하면 안됨. 틀림 

 

 

6.6 NON-EQUIJOIN -예제 11

1. 직원 테이블(S_EMP)과 급여 테이블(SALGRADE)을 JOIN하여 사원의 이름과 급여, 그리고 해당 급여 등급을 나타내시오.

select e.name, e.salary, sg.grade
from s_emp e, salgrade sg -- 145 = 29 * 5
where e.salary between sg.losal and sg.hisal; -- 직급 상관없는 경우
--where e.salary between sg.losal and sg.hisal and (title = '사원');

 



6.7 OUTER JOIN

예. 고객을 배정받은 직원의 사원명, 직원id, 고객명 출력. 두번째 컬럼 기준 오름차순 정렬

select e.name "사원명" , e.id, c.name "고객명"
from s_emp e, s_customer c
where e.id(+)= c.sales_rep_id  -- 15.고객을 배정 + 배정X 받은 직원. (일하는 직원과 일하지 않는 직원 포함) 
-- 데이터가 부족한 테이블에 (+) 붙임
-- where e.id(+)= c.sales_rep_id and e.id is not null -- e.id is not null 넣으면 null출력되던 행 제거. 14
order by 2; -- select 문기준으로 2번째 컬럼? select문의 순서 변경시 정렬기준 바뀜. 
-- null 값이 조인으로 인해 발생.

 

 


6.8 OUTER JOIN - 예제12

1. 직원(S_EMP) 테이블과 고객(S_CUSTOMER)테이블에서 사원의 이름과 사번, 그리고 각 사원의 담당 고객 이름을 나타내시오.

단, 고객에 대하여 담당영업사원이 없더라도 모든 고객의 이름을 나타내고, 사번 순으로 오름차순 정렬하시오.

 

-- 직원을 배정받지 못한 고객 출력. null이 customer에 존재 right outer join
select e.name as "사원이름", e.id, c.name as "담당고객"
from s_emp e, s_customer c
where e.id = c.sales_rep_id(+)
order by e.id asc;

--where e.id = c.sales_rep_id(+) and title = '사원';  -- 직책을 사원으로 제한한 경우.

 



6.8 SELF JOIN - 예제 13

1. 직원 중에 '김정미'와 같은 직책(title)을 가지는 사원의 이름과 직책, 급여, 부서번호를 나타내시오.

SELF JOIN을 사용할 것. 

 

[ 정답 ]

select e2.name, e2.title, e2.salary, e2.dept_id
from s_emp e1, s_emp e2 
where e1.name = '김정미' and e2.title = '과장' 
and e1.name <> e2.name;

[ 틀린 답] 

-- '김정미'와 같은 직책(title)을 어떻게 표현하지? 
--  직책 같은 애들끼리 필터링 하고, 그다음에 김정미인 이름만 출력하면 됨.
select m.name, m.title, m.salary, m.dept_id --  왜 e가 아닌 m일까? m에 김정미와 같은 직원의 정보가 있음. 
from s_emp e, s_emp m -- 841
where e.title = m.title and e.name = '김정미'   ; -- 셀프조인도 조인 조건은 = 동등조인

틀린 이유

조인 결과를 스프레드 시트에 표현을 했다. 이때 셀프 조인으로 인해 e2 테이블에 '김정미', '과장'이 중복으로 있어 제거하는 조건이 필요하다.