#7 DBMS _SELECT문_JOIN

정진형·2021년 11월 4일
0

DBMS

목록 보기
7/11
post-thumbnail

oracleDB XE11g R2, DBeaver 21.2.3

wihdow10

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

    1-2. Join의 기본 사용 방법
  • 두개의 테이블에 하나라도 같은 컬럼이 있어야 한다.
  • 두 컬럼의 값은 공유 되어야 한다.
  • 보통 조인을위해 기본키(Primary Ket)와 외래키(Foregin Key)를 사용한다.

    1-3. Join의 종류
  • inner join : 각 테이블에서 조인 조건에 알치되는 데이터만 가져온다.( 교집합)
  • outer join : 조인 조건에 일치하는 데잍터 및 일치하는 데이터를 모두 select한다.
  • 조인조건에 일치하는 데이터가 없다면 NULL로 가져온다.
  • outer join은 inner join 과는 다르게 주(main)테이블이 어떤 테이블인지가 중요하다
  • 어떤 테이블이 중심이 되냐에 따라
    left outer join : 왼쪽에 있는 테이블이 주 테이블
    right outer join : 오른쪽에 있는 테이블이 주 테이블
    full outer join : 양쪽 테이블 모두가 주 테이블
    으로 세분할 수 있다.

    1-4. left outer joib
  • 왼쪽 테이블이 기준이 된다.
  • 조인 조건에 부학하는 데이터가 조인 당하는 테이블에 있으면 해당 테블, 부재하면 NULL이 select된다.

    1-5. right outer joib
  • 오른쪽 테이블이 기준이 된다.
  • 조인 조건에 부학하는 데이터가 조인 당하는 테이블에 있으면 해당 테블, 부재하면 NULL이 select된다.

    1-6. full outer joib
  • 양쪽 테이블이 기준이 된다.
  • 조인 조건에 부학하는 데이터가 조인 당하는 테이블에 있으면 해당 테블, 부재하면 NULL이 select된다.

    1-7. ANSI Join VS Oracle Join
  • 미국 국립 표준 협회(American National Standards Institue, ANSI)에서도 SQL에 대한 보편적인 문법을 제시하고 있는데, 그것이 바로 ANSI Query이다.
  • Oracle 에서만 사용하는 문법이 Oracle Join이다.
-- INNER JOIN
-- 사원의 FIRST_NAME, LAST_NAME, EMAIL, DEPARTMENT_ID, DEPARTMENT_NAME
-- 테이블의 알리아스를 사용해 . 을 붙히면 그 테이블에 소속되있는 칼럼
SELECT 	e.FIRSTNAME, e.LASTNAME, e.EMIL,
	d.DEPARTMENT_ID, d.DEPARTMENT_NAME
FROM	EMPLOYEES e
    INNER JOIN DEPARTMENT d
-- ON절에서 각각의 테이블에 중복되는 칼럼을 = 으로 처리해준다
    ON e.DEPARTMENT_ID = d.DEPATRMENT_ID
;

-- INNER JOIN(EMPLOYEES, JOBS)
-- 사원의 FIRST_NAME, LAST_NAME, EMAIL, JOB_ID, JOB_NAME
SELECT 	e.FIRSTNAME, e.LASTNAME, e.EMIL,
	j.JOB_ID, j.JOB_TITLE
FROM	EMPLOYEES e
    INNER JOIN JOBS j
    ON e.JOB_ID = j.JOB_ID
;

-- INNER JOIN(DEPARTMENT, LPPCATIONS)
-- 부서의 DEPARTMENT_ID, DEPARTMENT_NAME, LOCATION_ID, CITY
-- CITY가 Seattle인 경우만 조회
SELECT	d.DEPARTMENT_ID, d.DEPARTMENT_NAME, d.LOCATION_ID,
	l.CITY
FROM	DEPARTMENT d
    INNER JOIN LOCATIONS l
    ON d.LOCATION_ID = l.LOCATION_ID
-- 조인 해준 후 시애틀을 찾아야되서 이너절 다음에 처리해준다
WHERE	l.CITY = 'Seattle'
;

-- INNER JOIN(EMPLOYEES, DEPARTMENT, JOBS, LOCATIONS)
-- FIRST_NAME, LAST_NAME, EMAL, DEPARTMENT_NAME, JOB_ID,  JOB_ID, JOB_TITL, 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.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 LOCATIOS l
    ON d.LOCATION_ID = l,LOCATION_ID
WHERE	l.CITY = 'Seattle'
;

-- LEFT OUTER JOIN(EMPLOYEES, JOB_HISTORY)
-- EMPLOYEES가 기준 테이블
SELECT	e.EMPLOYEE_ID, e.FIRST_NAME, e.HIRE_DATE,
	jh.SATRT_DATE, jh.END_DATE, jh.DEPARTMENT_ID
FROM	EMPLOYEE e
    LEFT OUTER JOIN JOB_HISTORY jh
    ON e.EMPLOYEE_ID = jh.EMPLOYEE_ID
ORDER BY e.EMPLOYEE_ID
;
-- 레프트와 라이트 차이는 쿼리문상 레프트는 왼쪽 테이블이 기준 라이트는 오른쪽 테이블이 기준이다
-- 기준 테이블이 같으면 레프트 라이트 결과는 같다
-- DEPARTMENTS 기준으로 LEFT OUTER JOIN
SELECT	d.DEPARTMENT_ID, e.EMPLOYEE_ID, e.FIRST_NAME
FROM	DEPARTMENT d
    LEFT OUTER JOIN EMPLOYEES e
    ON d.DEPARTMENT_ID = e. DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID

-- DEPARTMENTS 기준으로 RIGHT OUTER JOIN
SELECT	d.DEPARTMENT_ID, e.EMPLOYEE_ID, e.FIRST_NAME
FROM	EMPLOYEES e
    LEFT OUTER JOIN DEPARTMENS e
    ON d.DEPARTMENT_ID = e. DEPARTMENT_ID
ORDER BY d.DEPARTMENT_ID

-- 위와 아래의 내용은 동일 실제로는 아래처럼 요구를 한다
-- JOB_HISTORY 테이블을 기준을 EMPLOYEES 테이블과 조인해서
-- EMPLOYEE_ID, FIRST_NAME, HIRE_DATE, START_DATE, END_DATE, JOB_ID, DEPARTMENT_ID

-- JOB 이동 이력이 있는 직원의
-- 사번, 이름, 고용일자, 이동 시작 날짜, 이동 끝 날짜, JOB 아이디, 부서 아이디를 조회해라
SELECT	e.EMPLOYEE_ID, e.FIRST_NAME, e.HIRE_DATE,
	jh.START_DATE, jh.END_DATE, jh.JOB_ID, jh.DEPARTMENT_ID
FROM	JOB_HISTORY jh
    LEFT OUTER JOIN EMPLOYEES e
    ON jh.EMPLOYEE_ID = e.EMPLOYEE_ID
    
SELECT * FROM JOB_HISTORY jh ORDER BY EMPLOYEE_ID ;
SELECT * FROM EMPLOYEES e ORDER BY EMPLOYEE_ID ;
-- e테이블 기준이라 e테이블이 다 나오고 중복되는 jh테이블도 나옴
SELECT * FROM EMPLOYEES e LEFT OUTER JOIN JOB_HISTORY jh ON e.EMPLOYEE_ID jh.EMPLOYEE_ID ;
-- jh테이블 기준이라 jh테이블이 다 나오고 중복되는 e테이블도 나옴
SELECT * FROM JOB_HISTORY jh LEFT OUTER JOIN EMPLOYTEES e jh ON jh.EMPLOYEE_ID = e.EMPLOYEE_ID ;

-- FULL OUTER JOIN
-- EMPLOYEES, JOB_HISTORY, FULL OUTER JOIN
SELECT	e.EMPLOYEE_ID , e.FIRST_NAME, e.HIRE_DATE.
	jh.START_DATE, jh.END_DATE, jhJOB_ID, jh.DEPARTMENT_ID
FROM	EMPLOYEES e
     FULL OUTER JOIN JOB_HISTORY jh
     ON e.EMPLYOEE_ID = jh.EMPLYOEE_ID
;

0개의 댓글