728x90
JOIN
두 개 이상의 테이블에서 데이터를 같이 조회하고자 할때 사용하며,
조회 결과는 하나의 결과로 나온다.
무작정 JOIN을 사용해서 조회하는 것이 아니라 테이블 간 연결고리에 해당하는 컬럼을 매칭시켜야 한다.
Oracle 전용 구문 | ANSI (Oracle + 다른 DBMS) 구문 |
등가조인(EQUAL JOIN) | 내부조인(INNER JOIN) -> JOIN USING / ON 외부조인(OUTER JOIN) -> JOIN USING |
포괄조인(LEFT/RIGHT OUTER) | 왼쪽 외부조인(LEFT OUTER JOIN) 오른쪽 외부조인(RIGHT OUTER JOIN) 전체 외부조인(FULL OUTER JOIN) => Oracle에서는 불가 |
카테시안 곱(CARTESIAN PRODUCT) | 교차조인(CROSS JOIN) |
자체조인(SELF JOIN) 비등가조인(NON EQUAL JOIN) |
JOIN ON |
728x90
등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)
연결시키는 컬럼의 값이 일치하는 행들만 JOIN 돼서 조회( == 일치하지 않는 값들은 조회에서 제외)
Oracle 전용 구문
FROM절에 조회하고자하는 테이블들을 나열(,)
WHERE절에 매칭시킬 컬럼명(연결고리)에 대한 조건을 제시함
1) 연결할 두 컬럼명이 다른 경우
-- 전체 사원들의 사번, 사원명, 부서코드, 부서명 같이 조회
-- EMPLOYEE - "DEPT_CODE" / DEPARTMENT - "DEPT_ID"
SELECT DEPT_CODE FROM EMPLOYEE;
SELECT DEPT_ID FROM DEPARTMENT;
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
2) 연결할 두 컬럼명이 같은 경우
-- 전체 사원들의 사번, 사원명, 직급코드, 직급명(EMPLOYEE - JOB_CODE / JOB - JOB_CODE)을 조회
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE JOB_CODE = JOB_CODE;
-- 에러 발생(AMBIGUOUSLY)
-- 방법1. 테이블명을 이용하는 방법
SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
-- 방법2. 테이블의 별칭 사용(각 테이블마다 별칭 부여 가능)
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
ANSI 구문
FROM 절에 기준 테이블 하나 기술
그 뒤에 JOIN절에서 같은 조회하고자 하는 테이블 기술(매칭시킬 컬럼에 대한 조건도 기술)
1) 연결할 두 컬럼명이 다른 경우( ON 구문만 사용 가능)
-- 사번, 사원명, 부서코드, 부서명
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
/*INNER*/ JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID); -- INNER 생략 가능
2) 연결할 두 컬럼명이 같은 경우 ( ON /USING 구문 사용)
2-1) ON 구문 이용: AMBIGUOUSLY 에러가 발생할 수 있기 때문에 명시
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE);
2-2) USING 구문 이용: AMBIGUOUSLY 에러 발생 X / 알아서 매칭
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
JOIN 을 이용한 조회시 추가적인 조건 제시도 가능
Oracle 전용 구문
-- 직급이 대리인 사원들의 정보 조회
SELECT EMP_ID, EMP_NAME, SLALRY, JOB_NAME
-- EMPLOYEE JOB
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE
AND JOB_NAME = '대리';
ANSI 전용 구문
1) ON
SELECT EMP_ID, EMP_NAME, SALARY, JOB_NAME
-- EMPLOYEE JOB
FROM EMPLOYEE E
JOIN JOB J ON (E.JOB_CODE = J.JOB_CODE)
WHERE JOB_NAME = '대리';
2) USING
SELECT EMP_ID, EMP_NAME, SALARY, JOB_NAME
-- EMPLOYEE JOB
FROM EMPLOYEE
/*INNER*/ JOIN JOB USING (JOB_CODE)
WHERE JOB_NAME = '대리';
728x90