Join의 모든것.(LEFT OUTER, RIGHT OUTER, INNER, FULL OUTER, CROSS)


전에 Q&A에 란에 올려 놓은 글이 있지만, 그 예제에 조금 살을 붙혀 글을 올리도록 하겠습니다.

1. LEFT OUTER JOIN(LEFT JOIN 이라고도 한다.)
LEFT OUTER JOIN(차후 LEFT JOIN 이라 칭하겠다.) 은 A라는 테이블과 B라는 테이블이 있다면 그 두 테이블중에서
기준을 세우는 테이블을 왼쪽에 두고 JOIN을 하려는 명령입니다.

그래서 A LEFT JOIN B 라고 하면 A라는 테이블의 전체 컬럼을 조회한후 B테이블의 컬럼을 JOIN하겠다는 뜻입니다.
그리고 ON조건은 B 테이블을 JOIN 하는 조건을 기술하는 곳입니다.

어렵게 설명이 되었을지 몰라 예를 들어 설명하겠습니다.

A테이블이

지역명, A물품 수량
-----------------
가 30
나 20
다 40
라 50
마 100

B테이블이

지역명, B물품 수량
------------------
가 50
나 70
다 80
마 20
바 200
사 150

라고 하면

DECLARE @ATable Table
( 지역명 nvarchar(10)
,A물품수량 int) 


DECLARE @BTable Table
( 지역명 nvarchar(10)
,B물품수량 int)

INSERT INTO @ATable VALUES("가", 30)
INSERT INTO @ATable VALUES("나", 30)
INSERT INTO @ATable VALUES("다", 40)
INSERT INTO @ATable VALUES("라", 50)
INSERT INTO @ATable VALUES("마", 100)

INSERT INTO @BTable VALUES("가", 50)
INSERT INTO @BTable VALUES("나", 70)
INSERT INTO @BTable VALUES("다", 80)
INSERT INTO @BTable VALUES("마", 20)
INSERT INTO @BTable VALUES("바", 200)
INSERT INTO @BTable VALUES("사", 150)

SELECT A.지역명, A.A물품수량, B.지역명, B.B물품수량
FROM @ATable AS A
LEFT JOIN @BTable AS B
ON(A.지역명 = B.지역명)

이걸 실행 시키면

지역명, A물품수량, 지역명, B물품수량
--------------------------------------
가 30 가 50
나 30 나 70
다 40 다 80
라 50 NULL NULL
마 100 마 20

이런식으로 결과가 출력된다.

즉 A테이블의 전체 데이터가 출력이 되구, ON조건인 A.지역명 = B.지역명인 데이터만 B테이블에서 조회해서 같은
A테이블에 맞는 로우에 데이터를 출력시켜 주는 조건이다..

이해가 되었는지 모르겠네요..

2.RIGHT JOIN
LEFT JOIN을 이해했다면 진짜 쉬어지는 JOIN입니다.
LEFT JOIN의 정 반대이기 때문입니다.
즉 기준이 되는 테이블을 오른쪽에 있는 테이블을 기준으로 두고, JOIN을 한다는 것입니다.
위의 두 테이블에 대해 다음과 같은 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.


SELECT A.지역명, A.A물품수량, B.지역명, B.B물품수량
FROM @ATable AS A
RIGHT JOIN @BTable AS B
ON(A.지역명 = B.지역명)

지역명, A물품수량, 지역명, B물품수량
--------------------------------------
가 30 가 50
나 30 나 70
다 40 다 80
마 100 마 20
NULL NULL 바 200
NULL NULL 사 150

이렇게 출력이 됩니다.

3. INNER조건은 무엇인가

다음과 같은 쿼리를 실행해 보면 아래와 같다.

SELECT A.지역명, A.A물품수량, B.지역명, B.B물품수량
FROM @ATable AS A
INNER JOIN @BTable AS B
ON(A.지역명 = B.지역명)

지역명, A물품수량, 지역명, B물품수량
--------------------------------------
가 30 가 50
나 30 나 70
다 40 다 80
마 100 마 20

이건결과가 출력된다.

즉 A테이블과 B테이블에 전부 존재하는 데이터만 조회하라는 의미이다.(물론 ON조건에 만족하는 데이터)
집합으로 표현하면 교집합이다.
좀 설명하기가 애매하지만, 이런식으로 이해하면 될것 같다.
1번째로 LEFT JOIN을 한후, 2번째 RIGHT JOIN을 한다.
3번째 중복된 데이터를 제거한다.
4번째 전체 컬럼에 NULL이 있는 데이터는 제거한다.
이렇게 설명하면 될것 같네요.. ^^
물론 매카니즘적인 설명은 아니지만, 굳이 설명하자면 위처럼 하면 될것 같네요.


4. FULL OUTER JOIN

다음과 같은 쿼리를 실행해 보면 아래와 같다.

SELECT A.지역명, A.A물품수량, B.지역명, B.B물품수량
FROM @ATable AS A
FULL OUTER JOIN @BTable AS B
ON(A.지역명 = B.지역명)

지역명, A물품수량, 지역명, B물품수량
--------------------------------------
가 30 가 50
나 30 나 70
다 40 다 80
라 50 NULL NULL
마 100 마 20
NULL NULL 바 200
NULL NULL 사 150

즉 두 테이블의 합집합을 나타낸다.
조건에 맞는 데이터는 같은 로우에 표현해주고 다른 데이터는 다른 로우에 표현해주는 방법이다.
좀 설명하기가 애매하지만, 이런식으로 이해하면 될것 같다.
1번째로 LEFT JOIN을 한후, 2번째 RIGHT JOIN을 한다.
3번째 중복된 데이터를 제거한다.
이렇게 설명하면 될것 같네요.. ^^


5. CROSS JOIN

다음의 쿼리를 실행해보자

SELECT A.지역명, A.A물품수량, B.지역명, B.B물품수량
FROM @ATable AS A, @BTable AS B

지역명, A물품수량, 지역명, B물품수량
--------------------------------------
가 30 가 50
나 30 가 50
다 40 가 50
라 50 가 50
마 100 가 50
가 30 나 70
나 30 나 70
다 40 나 70
라 50 나 70
마 100 나 70
가 30 다 80
나 30 다 80
다 40 다 80
라 50 다 80
마 100 다 80
가 30 마 20
나 30 마 20
다 40 마 20
라 50 마 20
마 100 마 20
가 30 바 200
나 30 바 200
다 40 바 200
라 50 바 200
마 100 바 200
가 30 사 150
나 30 사 150
다 40 사 150
라 50 사 150
마 100 사 150

이렇듯 모든 경우에 대해 표현을 해주는 것이 CROSS 조인이다.
즉 A테이블의 한 데이터(로우에 대해) B테이블 전체를 조인하는 것이다.
그래서 전체 로우수도 N x M 로우가 된다.

읽어보면서 각 쿼리를 실행해보면 각 JOIN에 대해 어느정도 이해가 갈 것이다.
이것을 이용하여 각종 쿼리를 만들어 내는 것이다.

LEFT, RIGHT JOIN의 경우 어는 테이블을 기준으로 삼느냐에 따라 쿼리가 달라질수 있다.
좀 어려운 이야기 일수 있는데, 데이터가 많은 테이블을 기준으로 삼느냐, 적은 테이블을 기준으로 삼느냐에 따라
데이터 건수가 조정되기 때문이다. 즉 자신이 원하는 데이터가 있는 테이블을 기준으로 삼으면 그 데이터 전체를
표현할수 있을것이다.

허접하지만, 3여년 동안 프로젝트를 수행하면서 얻었던 나만의 지식이었다. 처음에 많이 혼란스러웠던 이유들 중
어떤 JOIN을 써야 하며, 어느쪽을 기준으로 삼느냐에 따라 달라지는 데이터들 때문에 혼란스러웠지만,
지금은 이런 기준에 따라 JOIN을 한다.
다른 사람들도 전부 알고 있을지도 모르지만, 체험을 하면서 얻었던 나만의 지식이라 할수 있다.(물론 다른 많은
SQLER 가족들도 알고 계시겠지만요.. ^^)

Q&A에 JOIN에 대??질문들이 상당히 존재하는 것 같아 도움이 될지 몰라 올립니다. 

 

 

[출처] http://www.sqler.com/104920

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86138
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78637
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95365
78 [Kafka] Kafka 한번 살펴보자... Quickstart file 졸리운_곰 2021.06.18 1308
77 Java Kafka Producer, Consumer 예제 구현 Java를 이용하여 Kafka Producer와 Kakfa Consumer를 구현해보자. file 졸리운_곰 2021.06.18 1168
76 Beginner’s Guide to Understand Kafka file 졸리운_곰 2021.06.18 1571
75 [Kafka] Kafka 설치/실행 및 테스트 file 졸리운_곰 2021.06.18 1065
74 [java] [kafka] [Kafka] 개념 및 기본예제 file 졸리운_곰 2021.06.16 2170
73 Getting started with Apache Kafka in Python file 졸리운_곰 2020.09.10 2255
72 [Kafka] 다운로드 및 Quick Start file 졸리운_곰 2020.09.07 1890
71 [Kafka] 기본 개념잡기 file 졸리운_곰 2020.09.07 1704
70 Flume Integration with Kafka file 졸리운_곰 2019.04.16 2081
69 빅데이터: 플럼(Flume) 토폴로지 설계 file 졸리운_곰 2019.04.16 1600
68 실시간 처리를 위한 분산 메시징 시스템 카프카(Kafka) file 졸리운_곰 2018.05.12 1409
67 Flume과 Kafka를 사용한 초당 100만개 로그 수집 테스트 file 졸리운_곰 2018.05.12 1375
66 웹 크롤링 / web crwaling / web scraping / 웹 스크래핑 file 졸리운_곰 2017.07.09 1846
65 빅데이터 단지 몇퍼센트의 예측 정확성을 위하여 장애로 가득찬 빅데이터 시스템을 도입하여야 하는가에 대한 의문! file 졸리운_곰 2017.03.20 1605
64 빅데이터: 플럼(Flume) 토폴로지 설계 file 졸리운_곰 2017.03.20 1415
63 [실시간 분석 시스템] Apache Flume를 활용한 데이터 수집(1) file 졸리운_곰 2017.03.06 1316
62 [실시간 분석 시스템] 데이터 수집 #2 Apache Sqoop을 활용하여 RDBMS 데이터 수집(2) file 졸리운_곰 2017.03.06 1383
61 [실시간 분석 시스템] 데이터 수집 #2 Apache Sqoop을 활용하여 RDBMS 데이터 수집(1) file 졸리운_곰 2017.03.06 1101
60 [실시간 분석 시스템] 데이터 수집 #1 오픈 소스 수집기 비교 file 졸리운_곰 2017.03.06 1744
59 [실시간 분석 시스템] 일단 데이터 들여다 보기 file 졸리운_곰 2017.03.06 1934
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED