Oracle Join- 2

박현우·2024년 1월 17일
0

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

  • SQL은 데이터베이스를 관리하기 위해 만들어진 프로그래밍 언어이며, 데이터베이스를 관리해주는 대부분의 DBMS들은 SQL을 사용한다.
  • 물론 DBMS 자체의 특수성 때문에 SQL의 사용법이 조금씩 다르기도 하지만, 큰 틀에서 보면 나름대로의 보편성을 가지고 있다.
  • 이를 위해 미국 국립 표준 협회(American National Standards Institute, ANSI)에서도 SQL에 대한 보편적인 문법을 제시하고 있는데, 그것이 바로 ANSI Query다.

-- 모든 사원의 부서
-- 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'
;

0개의 댓글

관련 채용 정보