JOIN

관계형 데이터베이스에서 테이블 안에 있는 행들을 논리에 땨라 연결할 수 있도록 하는 기법.

JOIN DESC
EQUI JOIN 조건이 정확히 일치하는 경우, 결과 출력.
NON EQUI JOIN 조건이 정확히 일치하지 않는 경우, 결과 출력.
SELF JOIN 자체 테이블 내에서 조인.
OUTER JOIN 조건이 정확히 일치하지 않아도 모든 결과를 출력.
곱집합 (Cartesian Product) 가능한 모든 행을 조인.

EQUI JOIN

양쪽 테이블에서 공통적으로 존재하는 컬럼 값이 일치하는 행만 가져오는 일반적인 조인.
등호 (=) 연결 연산자를 사용해서 조건 값이 정확히 일치할 때만 행을 가져오기 때문에,
EQUI JOIN 혹은 INNER JOIN 이라고 함.
주로 PK와 FK의 관계를 이용해 조인하지만, 다양한 조건으로 조인할 수 있음.

SELECT
    A.열 이름1, B.열 이름 2
FROM
    테이블 1 A, 테이블 2 B
WHERE
    테이블 1.열 이름 = 테이블 2.열 이름
SELECT
    *
FROM
    employees A, departments B
WHERE
    A.department_id = B.department_id;
SELECT
    A.employee_id, A.department_id, B.department_name, C.location_id, C.city
FROM
    employees A, departments B, locations C
WHERE
    A.department_id = B.department_id
AND
    B.location_id = C.location_id

NON-EQUI JOIN

대상 테이블 간 동일 칼럼 없이, 다른 조건으로 조인할 때 사용.
같은 조건이 아닌 크거나 작은 경우 JOIN을 수행하는 방법.

SELECT
  A.employee_id, A.first_name, A.salary,
  B.grade
FROM
  employees A, salarygrade B
WHERE
  A.salary BETWEEN B.losalary AND B.hisalary;

HR 테이블에서는 적절한 예제가 없다.
위 예제도 salarygrade라는 테이블이 따로 필요함.
정상은 아님.


SELF JOIN

자기 자신의 테이블을 조인하는 것.

SELECT
    A.열 이름, B.열 이름
FROM
    테이블 1 A, 테이블 1 B
WHERE
    테이블 1.열 이름 1 = 테이블 1.열 이름 2
SELECT
    A.employee_id, A.first_name, A.last_name, A.manager_id,
    B.first_name|| ' ' ||B.last_name AS manager_name
FROM
    employees A, employees B
WHERE
    A.manager_id = B.employee_id
ORDER BY
    A.employee_id;

OUTER JOIN

조건을 만족하지 않는 행도 모두 출력하기 위해 사용.
조인시 값이 없는 테이블 측에 (+)연산자를 붙임.

SELECT
    A.열 이름1, B.열 이름 2
FROM
    테이블 1 A, 테이블 2 B
WHERE
    테이블 1.열 이름 = 테이블 2.열 이름(+)
SELECT
    A.employee_id, A.first_name, A.last_name,
    B.department_id, B.department_name
FROM
    employees A, departments B
WHERE
    A.department_id = B.department_id(+)
ORDER BY
    A.employee_id DESC
SELECT
    A.employee_id, A.first_name, A.last_name,
    B.department_id, B.department_name
FROM
    employees A, departments B
WHERE
    A.department_id(+) = B.department_id
ORDER BY
    A.employee_id DESC

ANSI JOIN

ANSI / ISO SQL 표준인 LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN을 지원.
ANSI JOIN이 명시적을 표형하기 때문에 더 가독성이 좋은 느낌.

INNER JOIN

그냥 묶을 때 사용.
INNER 생략 가능.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
INNER JOIN
    departments D
ON
    E.department_id = D.department_id;

LEFT OUTER JOIN

(+) 기호 대신 명시적으로 사용.
오른쪽 테이블에 조인 시킬 값이 없는 경우 사용.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
LEFT OUTER JOIN
    departments D
ON      
    E.department_id = D.department_id;

RIGHT OUTER JOIN

왼쪽 테이블에 조인 시킬 값이 없는 경우 사용.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
RIGHT OUTER JOIN
    departments D
ON
    E.department_id = D.department_id;

FULL OUTER JOIN

양쪽 모두 OUTER JOIN을 걸어야 하는 경우 사용.

SELECT
    DISTINCT(E.department_id), D.department_id
FROM
    employees E
FULL OUTER JOIN
    departments D
ON
    E.department_id = D.department_id;ㅋ

cross join은 뭐지?

728x90
반응형

'Database' 카테고리의 다른 글

[PostgreSQL] Windows에서 Data Directory 변경하기  (0) 2020.01.09
[SQL] SET OPERATOR  (0) 2019.12.27
[SQL] GROUP  (0) 2019.12.26
[SQL] 데이터를 가공하기 위한 DB 함수들  (0) 2019.12.26
[SQL] 조건절 WHERE  (0) 2019.12.24

+ Recent posts