JOIN
하나 이상의 테이블에서 데이터를 조회하기 위해 사용하고 수행결과는 하나의 Result Set으로 나옴
관계형 데이터 베이스는 최소한의 테이블을 담고 있어 원하는 정보를 테이블에서 조회하려면 한 개 이상의 테이블에서 데이터를 읽어와야 하는 경우가 많음. 무작정 데이터를 가져오는것이 아니라 테이블간 연결 고리로 관계 맺어진 데이터를 추출해야함.
사용데이터
EMPLOYEE 테이블
DEPARTMENT 테이블
JOIN 사용시 주의사항
오라클 에서만 사용할수 있는 JOIN문 이있고
ANSI 표준 구문이있다.
ANSI표준 뜻은 미국 국립 표준 협회를 뜻하고 미국의 산업 표준을 재정하는 민간단체임
국제화 표준 기구 ISO에 가입 되어있고 여기에서 제정한 표준 중 가장 유명한 것이 아스키코드임.
내부 조인(INNER JOIN)
연결 되는 컬럼의 값이 일치하는 행들만 조인(일치하는 값이 없는 행은 조인에서 제외)
예제1 (오라클 구문)
-- 사원번호, 사원이름, 부서코드, 부서이름 출력하기
-- 오라클 구문
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
예제1 (ANSI 구문)
-- 사원번호, 사원이름, 부서코드, 부서이름 출력하기
-- ANSI 구문
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID; --ON 문은 이름이 겹치지않을시 사용
예제2
-- 사원번호, 사원이름, 직급코드, 직급이름 조회하여 조회하기
-- ORACLE 구문
SELECT
EMP_ID
, EMP_NAME
, E.JOB_CODE
, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE; -- 테이블명 명시하지않으면 오류발생
-- 사원번호, 사원이름, 직급코드, 직급이름 조회하여 조회하기
-- ANSI 구문
SELECT
EMP_ID
, EMP_NAME
, JOB_CODE
, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
외부 조인(OUTER JOIN)
두 테이블의 지정하는 컬럼 값이 일치하지 않는 행도 JOIN에 포함
* 반드시 OUTER JOIN임을 명시해야함
LEFT [OUTER] JOIN : 합치기에 사용한 두 테이블 중 왼편에 기술 된 테이블을 기준으로 JOIN 함
-- ANSI 표준 구문
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- LEFT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); -- OUTER 생략 가능
-- ORACLE 전용 구문
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
자체 조인(SELF JOIN)
같은 테이블을 조인. 자기 자신과 조인을 맺음.
-- ANSI 구문
SELECT
E.EMP_ID AS "사원사번"
, E.EMP_NAME AS "사원이름"
, E.MANAGER_ID AS "관리자사번"
, M.EMP_NAME AS "관리자이름"
FROM EMPLOYEE E
JOIN EMPLOYEE M ON(E.MANAGER_ID = M.EMP_ID)
ORDER BY 1;
-- ORACLE 전용 구문
SELECT
E.EMP_ID AS "사원사번"
, E.EMP_NAME AS "사원이름"
, E.MANAGER_ID AS "관리자사번"
, M.EMP_NAME AS "관리자이름"
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID
-- WHERE E.EMP_ID = M.MANAGER_ID;
ORDER BY 1;
다중 조인
N개의 테이블을 조회할 때 사용한다.
-- ANSI 표준 구문
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID)
JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE);
-- ORACLE 전용 구문
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
, LOCAL_NAME
FROM EMPLOYEE, DEPARTMENT, LOCATION
WHERE DEPT_CODE = DEPT_ID
AND LOCATION_ID = LOCAL_CODE;
'프로그래밍 > Database(Oracle)' 카테고리의 다른 글
Oracle - INSERT, UPDATE, DELETE (0) | 2021.07.05 |
---|---|
Oracle - CREATE(생성, 제약조건), INSERT (0) | 2021.07.03 |
오라클 - GROUP & HAVING (0) | 2021.06.29 |
오라클 - 함수(Function) (0) | 2021.06.28 |
Oracle - WHERE(조건) (0) | 2021.06.26 |