JOIN 조인 D04

최성진·2023년 2월 13일
0

DBMS

목록 보기
6/12

JOIN 조인

1. JOIN 조인이란?

  • 두 개 이상의 테이블을 서로 연결하여 데이터를 검색할 때 사용하는 방법으로
    두 개의 테이블을 마치 하나의 테이블인 것처럼 보여 주는 것

2. JOIN의 기본 사용 방법

  • 두 개의 테이블에 하나라도 같은 컬럼이 있어야 한다.(연결고리가 필요함)
  • 두 컬럼의 값은 공유되어야 한다.
  • 보통 JOIN을 위해 기본키(Primary Key)와 외래키(Foreign Key)를 활용한다.

3. Inner join

  • 각 테이블에 조인 조건에 일치되는 데이터만 가져온다.
  • Inner join은 교집합이라고 말한다.
SELECT 	*
FROM 	TABLE_A t1 INNER JOIN TABLE_B t2

--inner join
SELECT  e.EMPLOYEE_ID , e.DEPARTMENT_ID , 
		d.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	INNER JOIN 	DEPARTMENTS d
	ON			e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE	e.EMPLOYEE_ID = 178
;

SELECT 	*
FROM 	EMPLOYEES e 
WHERE	DEPARTMENT_ID IS NULL
;

4. Outer Join

  • 조인 조건에 일치하는 데이터 및 일치하지 않은 데이터트를 모두 select한다
  • 조인 조건이 일치하는 데이터가 없다면 NULL로 가져 온다.
  • Outer Join 은 Inner Join과는 다르게 주(main)테이블이 어떤 테이블인지가 중요하다.
    그래서 어떤 테이블이 중심이 되느냐에 따라 다시
    Left Outer Join, Right Outer Join, Full Outer Join 으로 세분화 할 수 있다.
    -left Outer Join은 왼쪽에 있는 테이블이,
    Right Outer Join은 오른쪽에 있는 테이블이,
    Full Outer Join은 양쪽 테이블이 모두가 중심(주)이라는 뜻이다.

5. LEFT OUTER JOIN

  • 왼쪽 테이블이 기준이 된다.
  • 조인 조건에 부합하는 데이터가 조인 당하는 테이블(오른쪽)에 있으면 해당 데이터를,
    부재하면 NULL로 SELECT 된다.
SELECT 	*
FROM 	TABLE_A t1 LEFT OUTER JOIN TABLE_B t2

--조인 사용시 테이블에 알리아스를 무조건 사용해줘야 한다.

--Left Outer Join
SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , 
		d.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
;	

6. RIGHT OUTER JOIN

  • 오른쪽 테이블이 기준이 된다.
  • 조인 조건에 부합하는 데이터가 조인 당하는 테이블(왼쪽)에 있으면 해당 데이터를,
    부재하면 NULL로 SELECT 된다.
SELECT 	*
FROM	TABLE_A t1 RIGHT OUTER JOIN TABLE_B t2

SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , 
		d.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	RIGHT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
;	

7. FULL OUTER JOIN

  • 양쪽 테이블이 기준이 된다.
  • 조인 조건에 부합하는 데이터가 조인 당하는 테이블(왼쪽 또는 오른쪽)에 있으면 해당 데이터를,
    부재하면 NULL로 SELECT 된다.
SELECT 	*
FROM	TABLE_A t1 FULL OUTER JOIN TABLE_B t2

SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , 
		d.DEPARTMENT_ID , d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	FULL OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
;	

8. ANSI Join vs Oracle Join

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

문제

--우리 회사에 있는 사원 중에서 사원이름, 사원번호, 부서이동 정보(start_date, end_date, jobid)를
-- 출력하시오

SELECT 	e.EMPLOYEE_ID ,e.FIRST_NAME ,e.HIRE_DATE ,jh.START_DATE , jh.END_DATE , jh.JOB_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN JOB_HISTORY jh 
	ON e.EMPLOYEE_ID = jh.EMPLOYEE_ID 
;


-- 문제1) 사원들의 이름, 부서번호, 부서명을 출력하라
SELECT 	e.FIRST_NAME , e.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 , d.DEPARTMENT_ID 
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.DEPARTMENT_ID , e.JOB_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 , d.LOCATION_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE 	d.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.EMPLOYEE_ID , e.FIRST_NAME  , e2.FIRST_NAME , e.MANAGER_ID 
FROM 	EMPLOYEES e
	INNER JOIN EMPLOYEES e2 
	ON e.EMPLOYEE_ID = e2.MANAGER_ID  
;
-- e.에서 꺼내오는건 직원거 e2.에서 꺼내오는건 메니저 이름이 된다.

-- 문제7) 사원이름과 부서명과 월급을 출력하는데 
-- 월급이 3000 이상인 사원을 출력하라
SELECT 	e.FIRST_NAME , e.SALARY, e.DEPARTMENT_ID ,d.DEPARTMENT_NAME 
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 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE e.SALARY BETWEEN 3000 AND 5000
;

-- 문제9) 급여가 3000이하인 사원의 이름과 급여, 
-- 근무지를 출력하라
SELECT 	e.FIRST_NAME , e.SALARY ,d.LOCATION_ID EMPLOYEE_ID ,l.CITY  
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID
	LEFT OUTER JOIN LOCATIONS l 
	ON d.LOCATION_ID = l.LOCATION_ID 
WHERE e.SALARY <= 3000
;

-- 문제10) Steven King의 부서명을 출력하라.
SELECT 	d.DEPARTMENT_NAME 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON	e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE	e.LAST_NAME = 'King'
AND		e.FIRST_NAME = 'Steven'
;

	

-- 문제11) IT부서에서 근무하고 있는 사람들을 출력하라.
SELECT 	*
FROM 	EMPLOYEES e
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE d.DEPARTMENT_NAME = 'IT'
;

-- 문제12) EMPLOYEES 테이블에서 사원번호,이름,업무, 
-- EMPLOYEES 테이블의 부서번호, 
-- DEPARTMENTS 테이블의 부서번호,부서명,근무지를 출력하여라
SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID , e.DEPARTMENT_ID 
		, d.DEPARTMENT_ID , d.DEPARTMENT_NAME ,d.LOCATION_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d
	ON	e.DEPARTMENT_ID  =	d.DEPARTMENT_ID
;



-- 문제13) EMPLOYEES 테이블과 DEPARTMENTS 테이블의 
-- 부서번호를 조인하고 
-- SA_MAN 사원만의 사원번호,이름,급여,부서명,근무지를 출력하라.

SELECT 	e.EMPLOYEE_ID , e.LAST_NAME , e.SALARY , e.DEPARTMENT_ID ,d.LOCATION_ID 
FROM 	EMPLOYEES e 
	LEFT OUTER JOIN DEPARTMENTS d 
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
WHERE JOB_ID LIKE 'SA_MAN'
;


-- 문제14) EMPLOYEES 테이블과 DEPARTMENTS 테이블에서 
-- DEPARTMENTS 테이블 기준으로 사원번호,이름,업무, 
-- 부서번호,부서명,근무지를 
-- EMPLOYEES 테이블의 부서번호 출력하여라

SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID , d.DEPARTMENT_ID , d.DEPARTMENT_NAME , d.LOCATION_ID 
FROM 	EMPLOYEES e  
	LEFT OUTER JOIN DEPARTMENTS d  
	ON e.DEPARTMENT_ID = d.DEPARTMENT_ID 
;
profile
마부리입니다

0개의 댓글