oracleDB XE11g R2, DBeaver 21.2.3
wihdow10
- 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이다.
SELECT e.FIRSTNAME, e.LASTNAME, e.EMIL,
d.DEPARTMENT_ID, d.DEPARTMENT_NAME
FROM EMPLOYEES e
INNER JOIN DEPARTMENT d
ON e.DEPARTMENT_ID = d.DEPATRMENT_ID
;
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
;
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'
;
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'
;
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
;
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
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
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 ;
SELECT * FROM EMPLOYEES e LEFT OUTER JOIN JOB_HISTORY jh ON e.EMPLOYEE_ID jh.EMPLOYEE_ID ;
SELECT * FROM JOB_HISTORY jh LEFT OUTER JOIN EMPLOYTEES e jh ON jh.EMPLOYEE_ID = e.EMPLOYEE_ID ;
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
;