Java 기반 클라우드 융합 개발자 과정 - KH 정보교육원/5월

22. 05. 20 - JOIN [ INNER, OUTER ] 집합연산자(UNION, INTERSECT, UNIONALL, MINUS )

giggs 2022. 5. 24. 23:27

 

조인의 대분류

  • EQUI JOIN ( 10=10처럼 값이 같은지 비교하겠다. )
  • NON-EQUI JOIN (조건에 맞게 ~ )

 

 

우리는 EQUI JOIN만 실습

 

1. INNER JOIN 

 

2. OUTER JOIN

  • -- LEFT OUTER JOIN
  • -- RIGHT OUTER JOIN
  • -- FULL OUTER JOIN

 

3. CROSS JOIN

 

4. SELF JOIN

 

 

 

 

 


 

 

[ 1번 - INNER JOIN ]

  • INNER JOIN은 앞에 INNER생략 가능

 

 

JOIN 할 2개의 테이블 내용 확인

 

 

왼쪽 = TEMP 테이블 //  오른쪽 = DEPT 테이블

 

 

 

  • TEMP 테이블에서 SMITH 사원의 부서 번호 20번 확인
  • DEPT 테이블에서 부서번호 10번의 부서 이름 확인
  • SMITH 사원의 부서이름 확인 가능!

 

 

 

 

부서 번호 칼럼의 값을 20번으로 사용한 이유는?

  • 부서명을 숫자로 사용하지 않고 RESERCH라는 부서명을 사용하면
  • 사원 추가시 부서명 칼럼에 많은 문자열을 매번 넣어줘야 하고 추가될 것이다.
  • 부서 코드로 관리 시 - 숫자 2개로 관리 가능
  • 공간을 훨신 더 효율적으로 사용 가능 ( 메모리 아껴서 사용 가능 )

 

 

 

 

 

그렇지만..

  • 부서 번호를 가지고 다른 테이블에 가서 부서명을 가져오고 하는 과정이 너무 귀찮다.
  • 이 귀찮음을 해결해주는 것이 JOIN

 

 

 

 

JOIN 작업 후의 RESULT SET !

 

 

 

  • JOIN 작업을 해주면 2개의 테이블이 조건에 맞게 매칭 되어서 하나로 합쳐진다!
  • 하나의 테이블에서 조회가능~!

 

 

 


 

 

JOIN 은 어떻게 사용하나요?

 

 

1. 합칠 테이블 조회

 

 

부서 테이블에서 부서번호와 부서명확인

 

 

 


 

 

 

2. 기준 테이블인 EMP 테이블과 조인 테이블인 DEPT테이블 JOIN

  • FROM 기준 테이블
  • JOIN 테이블 ON 조건식

 

 

SELECT * 했더니 JOIN의 기준이 되었던 DEPTNO 칼럼이 2번 추가되어서 보여진다.

 

 

 

  • DEPTNO 가 겹치네? 하나만 출력되게 해주자
  •  
  • 누구의 DEPTNO 표시해줄 것인지 표시 해줘야 한다. EMP.DEPTNO

 

 

 

ANSI 표준으로 작성한 JOIN

 

 

 

INNER JOIN 끝!

 

 

 


 

 

 

+@ 오라클에서는 WHERE 이용해서 JOIN 가능

  • 다른 곳에서는 안될 수도 있다.

 

 

 

 

 

 

가능하면 ANSI표준으로 작성하는 것이 범용성면에서 좋다.!

 

 

 

 

 


 

 

 

 

 

진도--

 

2번 - OUTER JOIN 

 

  • INNER JOIN 인 INNER 생략 가능했지만 OUTER는 불가능
  • OUTER JOIN 은 LEFT 인지 RIGHT인지 FULL인지 표시해주어야 함

 

 

 

 

2-1 : LEFT OUTER JOIN 사용해보기

  • 비교 기준인 DEPT NO에 NULL인 값 애도 표시해준다
  • INNER JOIN 은 매칭 안되면 잘라주었다.

 

 

 

 

 

 

OUTER JOIN 은 매칭 안되어도( 조건에 맞지 않아도) 일단 출력해주는구나~

대신 오른쪽 빈칸 값에 NULL이라고 표시되는구나~~

 

 

 

 

 


 

 

 

2-2 : RIGHT OUTER JOIN 사용해보기

 

 

 

 

 

  • ROW가 1개 더 나왔다.
  • 왜 그러냐?

 

 

## INNER JOIN 사용한 경우

  • :: 결과표에  DEPT테이블에 매칭 된 애들 ROW 14개 출력

 

## LEFT OUTER JOIN 사용한 경우

  • :: 결과표에 왼쪽 테이블 ( EMP 테이블 ) 기준 :
  • 왼쪽(EMP)테이블에서 조건에 맞지 않아서 매칭 X - 남아있던 swy - 1개 추가해서 - ROW 15개 출력
  • ( 오른쪽 테이블 dept테이블에 있는 - 매칭 안된 40번 OPERATION 이랑, 매칭안된 99번 부서부서 안 나옴)

 

## RIGHT OUTER JOIN 사용한 경우

  • :: 결과표에 오른쪽 테이블 ( DEPT 테이블 ) 기준 : 
  • 오른쪽(DEPT)테이블에서 조건에 맞지 않아서 매칭 X - 남아있던 40번, 99번 - 2개 추가해서 - ROW 16개 출력
  • ( 왼쪽 테이블 EMP 테이블에 있는 - 매칭 안된 번 매칭안된 SWY 안 나옴 )

 

 

 

## 짝이 없는 친구도 보여주려고 OUTER JOIN 사용! -기준 테이블을 정해준다.(LEFT / RIGHT)

## 쿼리문에 먼저 사용한 것이 LEFT ///// JOIN절에 사용한 것이 RIGHT

##일반적으로는 LEFT기준으로 사용

 

 

 

 


 

 

 

2-3 :  FULL OUTER JOIN 사용해보기

  • +++( 왼쪽 / 오른쪽 ) 양쪽에 소외된 애들 다 보여주고 싶다면?
  • --- 소외된 애들까지 모두 출력되어서 RESULT SET에 : ROW 17개 출력

 

 

 

왼쪽 오른쪽 매칭 안된 애들까지 모두 다 RESULT SET에서 보여준다.

 

 

 

 

 


 

 

 

 

진도--

3번 - CROSS JOIN

  • -- 곱하기를 생각하면 편하다.
  • -- 모든 행을 다 연결한다고 생각

 

 

 

 

 

##기준행 조건 필요 없다..

## 왼쪽테이블 X 오른쪽 테이블 ROW수만큼 출력

 

 

 

 


 

 

 

진도--

4번 - SELF JOIN

 

 

 

## 특정 사원의 관리자 번호로 관리자의 이름을 알고 싶다!

## 관리자 이름 가지고 있는 테이블은

## 그걸 가지고 있는 것이 지금의 테이블이구나! -

## 주의할 점은 별칭 잘 정해주기

## 실행사례 ) 댓글에 대댓글 - SELF JOIN으로 구현 가능 ( 다른 방식으로 처리한다 보통 JOIN이 무거워서)

 

 

 

 

 

 

 

 

## OUTER JOIN을 제일 많이 사용할 것이다. 이것만 잘해도 괜찮을 것이다.

## 이걸로도 해결안되면 CROSS JOIN 사용하는데. 흔치않다.

 

 

 

 

 


 

 

진도 --

 

집합 연산자 [ UNION, INTERSECT, UNIONALL, MINUS ]

 

 

 

 

 

왼쪽 테이블과 // 오른쪽 테이블 대상으로 집합연산자 사용

 

 

 

## UNION == 중복되는 데이터 있을 시 1개만 남겨주고 없애버린다. - 4개의 ROW 보여준다.

## INTERSECT == 교집합인 것만 보겠다 - 중복되는 데이터 -  1개의 ROW만 보여준다

## UNION ALL == 두 개의 테이블 모든 칼럼 보겠다 -  5개의 ROW 모두 보여준다

## MINUS - 교집합을 빼고 보겠다 -  중복 데이터 빼고 3개의 ROW 보여준다

 

 

 

 


 

 

1번 - UNION

  • UNION : 칼럼 타입, 개수 일치해야 함.
  • ( 숫자면 숫자로, 문자면 문자로 ) , ( 2개면 2개로 개수도 같이 )
  • 결과 집합을 연결해줌(세로 형태로)

 

 

 

 

 

 

 

 

## 서로 다른 어떤 결과 집합을 하나로 합쳐주는데 JOIN처럼 옆으로 합쳐주는 것이 아니라 밑으로 합쳐주는구나~!

## 첫 번째 SELECT 쿼리의 스키마만 적용되는구나~

## 실제 DB에 적용된 것은 아니다~ 결과 집합에서만 보이는 것!

 

 

 

 

 


 

 

 

 

2번 - INTERSECT ( 교집합 )

  • 교집합을 조회하겠다.

 

 

 

 

 


 

 

 

 

3번 - UNION ALL ( 합집합 )

  • 칼럼 모두 다 보겠다 - UNION ALL

 

 

 

 

 


 

 

 

4번 - MINUS ( 차집합 )

  • ## 교집합을 빼고 보겠다 - MINUS

 

 

 

 

 

 

 

 


 

 

 



REVIEW

JOIN과 집합 연산자에 대해 학습하였다.
두 가지 개념 모두 사용하거나 이해하는데
큰 무리는 없었다.
다만 실제 어떤 상황에 사용해야 할지 궁금해서 생각해보았다.

대표적인 INNER JOIN은
학생들이 수강하는 과목을 가지고
해당 과목 교수님과 매칭 지어주는 상황에서 사용할 수 있을 것 같고

[ LEFT,RIGHT,FULL ] OUTER JOIN 은
수강신청 안 한 학생, 수강생이 없는 과목 확인하려 할 때

SELF JOIN은 -
1차 검색 결과물을 대상으로 다시 검색할 때, 댓글에 대댓글을 다는 경우
사용할 수 있을 것 같다.

집합 연산자는
5가지 메뉴가 있는 푸드코트의 상황에서
INTERSECT ==> 떡볶이와 돈가스 모두 먹은 손님
UNION ALL ==> 푸드코트를 이용한 모든 손님
MINUS ==> 1개의 메뉴만 이용한 손님


실제 상황으로 사용해 본 적이 없어서 맞는 상황 예시인지 모르겠다.ㅎㅎ
어떤 기능이 있고, 어떻게 사용하는지 체크해 놓고
주어진 상황에 맞춰 사용할 수 있도록 해보자!