5 minute read

JOIN

  • 두 개 이상 테이블의 데이터를 하나의 Result set으로 조회

Oracle 전용 구문

  • 등가 조인 EQUAL JOIN / 내부 조인 INNER JOIN
    • 연결시키는 컬럼의 값이 일치하는 행들만 조인해서 조회
    • 일치하는 값이 없을 경우 조회 불가
SELECT 컬럼명
FROM 테이블명1, 테이블명2
WHERE 테이블명1.컬럼명1 = 테이블명2.컬럼명2;

1) 연결할 테이블의 컬럼명이 다른 경우
SELECT 컬럼명
FROM 테이블명1, 테이블명2
WHERE 연결할 컬럼명1 = 연결할 컬럼명2;

Alt text

-

Alt text

-

Alt text

CLASS 테이블 + SC_DEPARTMENT 테이블

두 테이블 중 동일한 값을 갖고 있는 학과명을 선택하여 조회하였다.
값은 동일하지만 컬럼명이 다른 것을 확인하고 WHERE절에 기술해야한다.

학생이 8명이기 때문에 8행이 조회되었고
해당 학생의 학과 코드가 함께 조회되었다.

-

2) 연결할 테이블의 컬럼명이 같은 경우
SELECT 컬럼명
FROM 테이블명1, 테이블명2
WHERE 테이블명1.연결할 컬럼명1 = 테이블명2.연결할 컬럼명2;

Alt text

이번엔 연결한 컬럼의 이름이 같은 경우를 테스트했다.
두 테이블을 조회해 보면 학년을 저장하는 컬럼의 이름이 동일하다.

-

Alt text

1) CLASS 테이블과
2) SC_LOCATION 테이블을 하나로 결합한 조회 결과이다.

1) 테이블에는 LOCATION 컬럼이 없지만
2) 테이블에는 DEPARTMENT 컬럼이 없는데 JOIN을 이용하여
하나의 테이블처럼 조회할 수 있다.


ANSI 표준 구문

  • Oracle 구문과 다르게 WHERE가 아닌 JOIN을 사용한다.
SELECT 컬럼명
FROM 테이블1
JOIN 테이블2 ON (테이블1.컬럼명 = 테이블2.컬럼명);

1) 연결할 테이블의 컬럼명이 다른 경우
SELECT 컬럼명
FROM 테이블명1
JOIN 테이블명2 ON (연결할 컬럼명1 = 연결할 컬럼명2);

Alt text

-

Alt text

-

Alt text

Oracle 구문과는 다르게 JOIN을 사용한다.
FROM 절에 연 결할 두 개의 테이블 명을 기술하지 않고
연결 할 두번째 테이블 명을 JOIN에 기술한다.
겁나 헷갈리네…


2) 연결할 테이블의 컬럼명이 같은 경우
SELECT 컬럼명
FROM 테이블명1
JOIN 테이블명2 USING (동일한 컬럼명);

Alt text

같은 컬럼명을 갖고 있는 테이블의 JOIN.

-

Alt text

USING 이용하여 컬럼명을 한 번만 적어줘도 된다.
차이점을 잘 기억할것..!


컬럼에 별칭 지정

  • 테이블에 별칭을 지정하여 관련 테이블 정보를 쉽게 파악
SELECT 컬럼명
FROM 테이블명1 [별칭1]
JOIN 테이블명2 [별칭2] ON ([별칭1].연결할 컬럼명1 = [별칭2].연결할 컬럼명2);

별칭은 내 마음대로 지정할 수 있고,
수업 때는 테이블의 맨 앞글자를 따와서 지정했다.
Ex) CLASS 테이블 : C / SC_DEPARTMENT 테이블 : D

SELECT C.GRADE, D.DEPT_NAME, D.DEPT_CODE
FROM CLASS C
JOIN SC_DEPARTMENT D ON (C.DEPARTMENT = D.DEPT_NAME);

별칭 지정 후에는 SELECT에 컬럼명을 작성할 때도
테이블의 별칭을 넣어줬다.
어느 테이블의 어느 컬럼인지 쉽게 파악이 가능하다.


OUTER JOIN

  • 외부 조인
  • 한 개 이상의 테이블을 JOIN 할 경우, 조건에 만족하지 않는 행은 제외(INNER JOIN)되는데 OUTER JOIN은 조건에 만족하지 않는 행도 함께 조회
  • OUTER JOIN 명시 필수
  • LEFT OUTER JOIN : 테이블 중 왼쪽에 기술된 테이블의 컬럼 수를 기준으로 JOIN
  • RIGHT OUTER JOIN : 테이블 중 오른쪽에 기술된 테이블의 컬럼 수를 기준으로 JOIN
  • FULL OUTER JOIN : 사용한 테이블이 가진 모든 행을 결과에 포함시킬 때
  • Oracle에는 LEFT / RIGHT 개념이 없으며 FULL OUTER JOIN 사용 불가
1) ANSI
SELECT 컬럼명
FROM 테이블명1
LEFT OUTER JOIN 테이블명2 ON (연결할 컬럼명1 = 연결할 컬럼명2);

Alt text

NULL 값을 가진 테이블이 있을 때.

Alt text

JOIN 했을 경우, NULL 값이 포함된 행을 조회에서 제외된다. 이때 NULL 값의 행을 포함하고 싶을 경우 OUTER JOIN을 사용하면 된다.

Alt text

LEFT OUTER JOIN을 사용한 예시. NULL 값이 있는 행도 포함하여 조회되었다.
LEFT OUTER JOIN을 사용했기 때문에, 왼쪽에 있는 CLASS 테이블을 기준으로
이윤주 학생의 정보까지 함께 조회되었다.
처음에는 좀 헷갈리니까 실습 문제를 많이 풀어봐야한다…!!!

이 예시는 왼쪽 테이블이 기준이니,
반대로 RIGHT OUTER JOIN을 사용하면
NULL 값이 포함된 오른쪽 테이블 SC_DEPARTMENT을 기준으로 조회하기 때문에 이윤주 학생의 정보는 조회되지 않는다.

FULL OUTER JOIN을 사용하면
모두 조회된다. 양 쪽의 데이터를 모두 조회하기 때문에!


2) Oracle
SELECT 컬럼명
FROM 테이블1, 테이블2
WHERE 컬럼명1 = 컬럼명2(+);

Oracle 전용 구문에서는
앞에서 했던 JOIN 방법을 그대로 사용하고
포함하고 싶은 값이 있는 테이블에 (+) 기호를 추가해주면 된다.

Alt text

이 예시에서는 두 번째 테이블에 NULL 값이 있었고, 그 값을 포함하는 결과를 보고 싶기 때문에 오른쪽에 기호를 추가했다.

만약 조회를 원하는 테이블이 왼쪽이면 왼쪽 테이블에 추가할 수 있다.

Oracle에서는 FULL OUTER JOIN을 사용할 수 없기 떄문에
양 쪽에 모두 기호를 넣어줄 경우 ERROR가 발생한다.


CROSS JOIN

  • 교차 조인
  • 카테시안 곱(Cartesian Product)
  • JOIN 되는 모든 테이블의 각 행이 모두 매핑된 데이터 조회.(곱집합)
  • 테이블의 행들이 모두 곱해진 행들의 조합이 출력 -> 방대한 데이터 출력 -> 과부하의 위험
  • JOIN 시, ON 생략
    • 조건을 설정하는 것이 아니고 모든 행의 매핑 결과를 조회하기 때문에
1) ANSI
SELECT 컬럼명1, 컬럼명2
FROM 테이블명1
CROSS JOIN 테이블명2;

Alt text

두 테이블을 CROSS JOIN으로 JOIN 한 예시다.
각각의 컬럼들이 모든 경우의 수로 매핑되었다.
곱하기로 생각하면 편하다.


2) Oracle
SELECT 컬럼명1, 컬럼명2
FROM 테이블명1, 테이블명2;
SELECT NAME, DEPT_NAME
FROM CLASS, SC_DEPARTMENT;

동일한 결과 출력.


NON_EQU JOIN

  • 비등가 조인
  • JOIN 조건에 등호 미사용
  • 조건에 일치하는 컬럼의 조회가 아닌 값으 범위에 포함되는 행을 연결
  • 비교연산자, BETWEEN, AND, IN, NOT IN 등 사용
  • ANSI 구문 중 USING 사용 불가
    • USING 자체가 등가 조인이기 때문
1) ANSI
SELECT 컬럼명1, 컬럼명2
FROM 테이블명1
JOIN 테이블명2 ON (컬럼명 BETWEEN 조건1 AND 조건2);

SELECT 컬럼명1, 컬럼명2
FROM 테이블명1
JOIN 테이블명2 D ON (컬럼명 < 조건);

SELECT 컬럼명1, 컬럼명2
FROM 테이블명1
JOIN 테이블명2 D ON (컬럼명 IN(조건1, 조건2, ...));

Alt text

BETWEEN AND를 이용하여 조회했다.
조건은 점수가 60 ~ 90점 사이인 학생의 행이다.
여러 연산자를 이용하여 범위를 지정할 수 있다.
JOIN 절 앞에 NON_EQU 키워드가 없는 것도 확인할 것.


2) Oracle
SELECT 컬럼명1, 컬럼명2
FROM 테이블명1, 테이블명2
WHERE 컬럼명 BETWEEN 조건1 AND 조건2;

JOIN 절에 기술했던 것을 WHERE 절에 기술하면 된다.
기존 Oracle 구문에서 사용했던 JOIN 방식에 조건만 부여했다.

동일한 결과가 출력되니 이미지는 생략한다.


SELF JOIN

  • 자체 조인
  • 같은 테이블 조인

Alt text

기존 테이블에 mentor 정보를 추가했다.
김철수 학생의 mentor는 번호가 112번인 학생이다.

여기서 조회할 내용은 김철수 학생 mentor의 이름이다.

이럴 때 SELF JOIN을 사용한다.

-

1) ANSI
SELECT 컬럼명
FROM 테이블1 별칭
JOIN 테이블2 별칭 ON (테이블1.컬럼명 = 테이블2.컬럼명);

SELECT 컬럼명
FROM 테이블1 별칭
LEFT OUTER JOIN 테이블2 별칭 ON (테이블1.컬럼명 = 테이블2.컬럼명);

Alt text

SELF JOIN을 이용해서 조회한 결과를 보면
김철수 학생의 mentor였던 112번의 학생의 이름까지 함께 조회되고 있다.

겁나 헷갈리는……..

-

Alt text

위에서는 멘토가 없었던 이윤주 학생의 정보는 조회에서 제외되었다. 함께 조회하고 싶을 경우 위에서 배웠던 OUTER JOIN을 사용하면 된다.


2) Oracle
SELECT 컬럼명
FROM 테이블명1 별칭, 테이블명2 별칭
WHERE 테이블명1.컬럼1 = 테이블명2.컬럼2;

SELECT 컬럼명
FROM 테이블명1 별칭, 테이블명2 별칭
WHERE 테이블명1.컬럼1 = 테이블명2.컬럼2(+);

마찬가지로 동일한 결과가 조회된다.


다중 JOIN

  • 3개 이상의 테이블을 결합하여 조회
1) ANSI
SELECT 컬럼명
FROM 테이블명1 별칭
JOIN 테이블명2 별칭 ON (테이블명1.컬럼명1 = 테이블명2.컬럼명2)
JOIN 테이블명3 별칭 ON (테이블명2.컬럼명2 = 테이블명3컬럼명3);

Alt text

-

Alt text

-

Alt text

이 3개의 테이블을 순서대로 JOIN 한다.
색깔별로 JOIN이 가능한 컬럼들을 표시해뒀다.

다중 JOIN이 시 JOIN 하는 순서가 중요한 이유가 여기에 있다. 1번 테이블과 3번 테이블 경우
JOIN이 가능한 컬럼이 존재하지 않는다.
여기서 순서가 하나라도 바뀐다면 다중 JOIN이 되지 않는다.

다중 JOIN 시, 어떤 컬럼들을 이용하여 연결할 것인지 확인해야한다.

-

Alt text

위 테이블 3개를 JOIN한 결과이다.
1) 1, 2번 테이블을 UZING을 이용하여 JOIN 하고
2) JOIN 결과에 3번 테이블을 JOIN 했다.

결합이 가능한 컬럼들을 먼저 찾고
순서를 잘 생각해서 JOIN 해야한다.

지금은 테이블이 3개밖에 안 되지만 더 많은 테이블을 JOIN 할 경우 엄청 헷갈릴 거 같다..


2) Oracle
SELECT 컬럼명
FROM 테이블명1 별칭, 테이블명2 별칭, 테이블명2 별칭
WHERE 테이블명1.컬럼명1 = 테이블명2.컬럼명2
  AND 테이블명2.컬럼명2 = 테이블명3.컬럼명3;

Categories:

Updated: