1. join
1-1. left outer join
왼쪽 테이블이 기준이 된다.
조인 조건에 부합하는 데이터가 조인 당하는 테이블에 있으면 해당 데이터를, 부재하면 Null로 select 된다.
select * from A left outer join B on 조건
1-2. right outer join
오른쪽 테이블이 기준이 된다.
조인 조건에 부합하는 데이터가 종인 당하는 테이블에 있으면 해당 데이터를, 부재하면 Null로 select 된다.
select * from A right outer join B on 조건
1-3. full outer join
양쪽 테이블 모두가 기준이 된다.
조인 조건에 부합하는 데이터가 조인당하는 테이블에 있으면 해당 데이터를, 부재하면 Null로 select 된다.
select * from A full outer join B
1-4. ANSI join VS ORACLE join
-- 모든 사원의 부서
-- INNER JOIN
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , d.DEPARTMENT_NAME , d.DEPARTMENT_ID
FROM EMPLOYEES e
INNER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID , e.EMPLOYEE_ID
;
-- LEFT OUTER JOIN
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , d.DEPARTMENT_NAME , d.DEPARTMENT_ID
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID , e.EMPLOYEE_ID
;
-- RIGHT OUTER JOIN
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , d.DEPARTMENT_NAME , d.DEPARTMENT_ID
FROM EMPLOYEES e
RIGHT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID , e.EMPLOYEE_ID
;
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , d.DEPARTMENT_NAME , d.DEPARTMENT_ID
FROM DEPARTMENTS d
RIGHT OUTER JOIN EMPLOYEES e
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID , e.EMPLOYEE_ID
;
-- INNER JOIN
-- 사원 이름, 이메일 주소, 부서 아이디, 부서명, job_id, job_title
-- city 컬럼을 추가 조회, 조건: city가 Seattle인 도시만 조회
SELECT e.FIRST_NAME , e.LAST_NAME , e.EMAIL, d.DEPARTMENT_ID , d.DEPARTMENT_NAME , j.JOB_ID , j.JOB_TITLE, l.LOCATION_ID , l.CITY
FROM EMPLOYEES e
INNER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
INNER JOIN JOBS j
ON e.JOB_ID = j.JOB_ID
INNER JOIN LOCATIONS l
ON d.LOCATION_ID = l.LOCATION_ID
WHERE l.CITY = 'Seattle'
;
-- LEFT OUTER JOIN
-- EMPLOYEE_ID, FIRST_NAME, HIRE_DATE
-- START_DATE, END_DATE, JOB_ID, DEPARTMENT_ID
-- 단, EMPLOYEE_ID로 오름차순 정렬
-- 테이블 총 2개, 20분까지
SELECT e.EMPLOYEE_ID , e.FIRST_NAME , e.HIRE_DATE , jh.START_DATE , jh.END_DATE, jh.JOB_ID, jh.DEPARTMENT_ID , e.DEPARTMENT_ID
FROM EMPLOYEES e
LEFT OUTER JOIN JOB_HISTORY jh
ON jh.EMPLOYEE_ID = e.EMPLOYEE_ID
ORDER BY EMPLOYEE_ID
;
-- FULL OUTER JOIN
SELECT *
FROM EMPLOYEES e
FULL OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY e.EMPLOYEE_ID ;
;
-- 문제 1) 사원들의 이름, 부서번호, 부서명을 출력하라.
SELECT e.FIRST_NAME , d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
;
-- 문제 2) 30번 부서 사원들의 이름, 직업, 부서명을 출력하라.
SELECT e.FIRST_NAME , e.JOB_ID, d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.DEPARTMENT_ID = 30
;
-- 문제3) 커미션을 받는 사원의 이름, 직업, 부서번호,부서명을 출력하라
SELECT e.FIRST_NAME , e.JOB_ID , d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.COMMISSION_PCT IS NOT NULL
;
-- 문제4) 지역번호 2500 에서 근무하는
-- 사원의 이름, 직업,부서번호,부서명을 출력하라
SELECT e.FIRST_NAME , e.JOB_ID , d.DEPARTMENT_ID , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE LOCATION_ID = 2500
;
-- 문제5) 이름에 A가 들어가는 사원들의 이름과 부서이름을 출력하라
SELECT e.FIRST_NAME , d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.FIRST_NAME LIKE '%A%'
;
-- 문제6) 사원이름과 그 사원의 관리자 이름을 출력하라
SELECT e.FIRST_NAME "사원명" , e2.FIRST_NAME "매니저명"
FROM EMPLOYEES e
INNER JOIN EMPLOYEES e2
ON e.EMPLOYEE_ID = e2.MANAGER_ID
;
-- 문제7) 사원이름과 부서명과 월급을 출력하는데 월급이 3000 이상인
-- 사원을 출력하라
SELECT e.FIRST_NAME , d.DEPARTMENT_NAME , e.SALARY
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.SALARY >= 3000
;
-- 문제8) 급여가 3000에서 5000사이인 사원의 이름과 소속부서명 출력하라
SELECT e.FIRST_NAME , d.DEPARTMENT_NAME, e.SALARY
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.SALARY BETWEEN 3000 AND 5000
;
-- 문제9) Steven King의 부서명을 출력하라.
SELECT d.DEPARTMENT_NAME
FROM EMPLOYEES e
LEFT OUTER JOIN DEPARTMENTS d
ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
WHERE e.FIRST_NAME = 'Steven'
AND e.LAST_NAME = 'King'
;