[SQL] JOIN

지미미·2023년 4월 18일
0

Oracle SQL Developer

목록 보기
1/15
post-thumbnail

JOIN

하나 이상의 테이블에서 데이터를 조회하기 위해 사용하고 수행 결과는 하나의 Result Set으로 나온다.

동등 조인(EQUI-JOIN)

기본이 되는 가장 일반적인 조인으로 공통된 값을 가진 컬럼을 등호(=)연산자로 연결하여
2개 이상의 테이블이나 뷰에서 WHERE절에서 기술한 조건(=조인 조건)에 만족하는 데이터를 추출한다. 일치하는 값이 없는 행은 조인에서 제외된다

1) 오라클 전용 구문
SELECT 컬럼, 컬럼 ...
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명 = 테이블2.컬럼명;

        -- FROM절: 조회하고자하는 컬럼들을 ,(콤마)로 구분하여 나열
        -- WHERE절: 매칭 시킬 컬럼에 대한 조건을 제시
-- 테이블에 별칭을 사용한 경우 SELECT절 WHERE절에서 별칭을 이용해서 접근해야함

SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;

SELECT EMP_ID, EMP_NAME, E.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;

2) ANSI 표준 구문
* ANSI 미국 국립 표준 협회(American National Standards Institute)
SELECT 컬럼, 컬럼...
FROM 테이블1
[INNER] JOIN 테이블2 ON (테이블1.컬럼명 = 테이블2.컬럼명);
[INNER] JOIN 테이블2 USING (컬럼명);

        -- FROM절: 기준이 되는 테이블을 기술
        -- JOIN절: 같이 조회하고자 하는 테이블을 기술 후 조건을 명시
        -- 연결에 사용하려는 컬럼명이 같다면 USING절, 다르면 ON 사용
-- USING절의 열 부분은 식별자를 가질 수 없음 (컬럼 앞에 테이블 이름을 붙일 수 없음)

SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);

SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

세미 조인(SEMI-JOIN)

IN과 EXISTS 연산자를 사용하여 서브 쿼리에 존재하는 데이터만 메인 쿼리에서 추출한다.
IN: OR 조건으로 변환할 수 있음 즉, 이것 또는 저것으로 풀어쓰기가 가능하다.
EXISTS: 조건에 만족하는 데이터가 한 건이라도 있으면 결과를 즉시 반환한다.
서브쿼리에 존재하는 메인 쿼리 데이터가 여러 건 존재하더라도 최종 반환되는 메인 쿼리 데이터에는 중복되는 건이 없다.

안티 조인(ANTI-JOIN)

NOT IN과 NOT EXISTS 연산자를 사용하여 한 쪽 테이블에만 있는 데이터를 추출한다.

자체 조인(SELF-JOIN)

두 개 이상의 서로 다른 테이블을 연결하는 것이 동일한 하나의 테이블을 사용하여 조인한다.
SELECT절에 쓰인 모든 컬럼명에 테이블을 명시해야한다.

SELECT E.EMP_ID, E.EMP_NAME 사원이름, E.DEPT_CODE, E.MANAGER_ID, M.EMP_NAME 관리자이름
FROM EMPLOYEE E, EMPLOYEE M
WHERE E.MANAGER_ID = M.EMP_ID;

외부 조인(OUTER JOIN)

테이블 간 JOIN 시 조인 조건에 만족하는 데이터 뿐만 아니라 조건에 일치하지않는 행도 모두 포함시켜서 데이터를 추출한다.
기준이 되는 테이블을 지정해야한다.(LEFT/RIGHT/(+))

LEFT [OUTER] JOIN
: 두 테이블 중 왼쪽에 기술된 테이블 컬럼 수를 기준으로 JOIN을 진행한다.
왼쪽 컬럼에 해당하는 값을 모두 찾고 싶다면 오른쪽에(+) 붙이기

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
LEFT JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);

RIGHT [OUTER] JOIN
: 두 테이블 중 오른쪽에 기술된 테이블 컬럼 수를 기준으로 JOIN을 진행한다.
오른쪽 컬럼에 해당하는 값을 모두 찾고 싶다면 왼쪽에(+) 붙이기

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
RIGHT JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);

FULL [OUTER] JOIN
: 두 테이블이 가진 모든 행을 결과에 포함시켜서 데이터를 추출한다.

오라클 문법에서는 FULL OUTER JOIN : 컬럼명(+) = 컬럼명(+) 은 지원해주지않음

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
FULL JOIN DEPARTMENT
ON (DEPT_CODE = DEPT_ID);

  • 외부 조인 사용 시
  • 조인 대상 테이블 중 데이터가 없는 테이블 조건에는 (+)를 붙인다.
  • 외부 조인의 조인 조건이 여러 개일 때 모든 조건에 (+)를 붙인다.
  • 한 번에 한 테이블에만 외부 조인을 할 수 있다.
  • (+)연산자가 붙은 조건과 OR를 같이 사용할 수 없다.
  • (+)연산자가 붙은 조건에는 IN연산자를 같이 사용할 수 없다. (단, IN절에 포함되는 값이 1개일 때는 사용 가능)

카테시안 조인 (CATASIAN PRODUCT) = 교차 조인(CROSS JOIN)

WHERE절에 조인 조건이 없어서 조인되는 모든 테이블의 각 행이 모두 매핑된 데이터를 추출한다.
테이블 건수의 곱(‘행의 컬럼 수 * 또 다른 행의 컬럼 수‘)이 조합이 출력되기에 과부화 위험 有

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;

비등가 조인(NON EQUAL JOIN)

조인 조건에 등호(=)를 사용하지 않는 조인문을 비등가 조인이라고 한다.
지정한 컬럼 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결하는 방식이다.
(= 이외에 비교 연산자 >, <, >=, <=, BETWEEN AND, IN, NOT IN 등을 사용)
ANSI 구문으로는 JOIN ON 구문만 사용 가능(USING 사용 불가)

SELECT EMP_NAME, SALARY, E.SAL_LEVEL
FROM EMPLOYEE E
JOIN SAL_GRADE S ON (SALARY BETWEEN MIN_SAL AND MAX_SAL);

다중 JOIN

여러개의 테이블을 조인하는 경우에 사용한다.
- ANSI 구문을 쓰는 경우에는 다중 조인 순서가 중요하다.
- 오라클 구문에서는 FROM절에서 테이블이 명시되어있기 때문에 순서를 바꿔도 결과값에 영향을 받지 않는다.

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);

서브 쿼리(Sub-Query)

  • 하나의 SQL 문을 기준으로 최종 결과를 출력하는 쿼리를 메인 쿼리라고 한다면
    이를 위한 중간 단계 혹은 보조 역할을 하는 SELECT문을 서브 쿼리라고 한다. 서브쿼리는 여러개 사용될 수 있다.

[메인 쿼리와의 연관성에 따라]

  • 연관성 없는(Noncorrelated) 서브 쿼리
    : 메인 테이블과 조인 조건이 걸리지 않는다.

  • 연관성 있는 서브 쿼리
    : 메인 테이블과 조인 조건이 걸려있다.

  • 형태에 따라
    일반 서브 쿼리(SELECT절) / 인라인 뷰(FROM절) / 중첩쿼리(WHERE절)

  • 그 외 UPDATE문, DELETE문에서도 사용 가능 / SELECT문 안에서도 여러 개의 서브 쿼리 사용 가능

인라인 뷰(Inline View)

  • FROM절에 사용하는 서브 쿼리로 하나의 테이블이나 뷰와 같은 역할을 한다.
profile
블루라이트로 광합성 하는 새럼

0개의 댓글