Search

반응형

'DATABASE'에 해당되는 글 20건

  1. 2020.09.13 [HOW]SQL 외부조인(OUTER JOIN) 사용하는 방법, LEFT/RIGHT/FULL OUTER JOIN, 오라클, 조인
  2. 2020.09.12 [HOW]NATURAL JOIN, CROSS JOIN 사용하는 방법, ANSI 조인 -오라클 (ORACLE)
반응형

안녕하세요. 신기한 연구소입니다.

기본적으로 SQL 작업을 하는 개발자는 이 포스팅이 큰 의미가 없을 수 있어요.

하지만 처음 접하는 개발자나 오랜만에 사용해서 갑자기 생각이 안나는 경우를

대비해서 공유도 하고 나 자신도 활용하기 위해 작성해 봅니다.

 

 

이번 포스팅은 외부 조인(OUTER JOIN)입니다.

 

어떤 경우에 사용하는지 먼저 예를 들어봅니다. 

팀원 정보를 조회하는 화면이 있습니다.

관리자는 팀원들의 정보를 한눈에 보기를 원합니다.

하지만 테이블은 관련 정보를 기준으로 그룹화되어 여러 테이블로 분리되어 있습니다.

그 중 하나를 살펴보면..

관리자는 팀원들의 사내 동호회 활동에 대해 궁금해합니다.

하지만 모든 팀원들이 사내 동호회를 가입한 건 아닙니다.

 

 

이전 포스팅에서 배운 내부 조인(INNER JOIN)을 활용해 보면

사원 테이블과 동호회 테이블이 조인이 되어 서로 연결된 정보를

한 데이터 집합으로 화면에 조회가 됩니다.

 

 

그런데 문제가 발생합니다.

팀원이 12명인데 9명만 나오는 현상이 발생합니다.

왜 그런지 살펴보니 3명은 아직 동호회에 가입하지 않은 겁니다.

그래서 사원 정보에 동호회 코드가 NULL이기에 조인 성립이 되지 않아서

조회 대상에서 누락된 겁니다.

관리자는 팀원 전원인 12명의 정보를 원합니다.

가입이 안되었다면 ‘미가입’ 또는 빈칸으로 나오기를 바랍니다.

이런 경우 팀원 전원이 나와야 하기에 드라이빙 테이블이 됩니다.

그리고 동호회 테이블과 조인하면서 있으면 보여주고 없으면 NULL을

보여주면 됩니다.

 

이런 경우에 외부 조인(OUTER JOIN)을 사용하면 됩니다.

 

 

이제 원하는 데이터가 화면에 나와서 관리자는 만족할 겁니다.

그런데 쿼리를 보니 처음 보는 기호가 있습니다.

(+)인데요..

바로 이것이 외부 조인(+)에 사용하는 기호입니다.

기본 사용법은 다음과 같습니다.

주 테이블(드라이빙)은 그대로 두고 없어도 NULL을 더해서 보여주라고 (+)를

상대 테이블의 컬럼에 전부 붙여주면 됩니다.

 

 

위 쿼리를 보면 CLUBNO(+) <> ‘10’ 조건을 넣을 때 조인 조건이 아니지만

(+)를 넣었습니다.

WHERE절의 모든 조건 중 대상 테이블의 컬럼이 나오면 조인 조건이든 아니든

(+)를 붙여줘야 한다는 겁니다.

그리고 OR연산자에는 사용할 수 없습니다.

 

 

해당 쿼리는 오류가 발생합니다.

그런데 기존 버전에서는 IN 연산자는 IN의 조건 값이 하나를 초과하면

외부 조인이 안된다고 하는데 테스트해보니 잘 되네요.

 

 

개선되었나 봅니다.

다음으로 중요한 부분인데요.

대상 테이블의 컬럼에 외부 조인 (+)를 붙인 후 서브 쿼리와 사용할 수 없습니다.

 

 

이렇게 조회를 하면 오류가 발생하니 주의하세요.

 

이제 ANSI 표준에 대해 살펴보겠습니다.

외부 조인 사용방법은 내부 조인과 비슷합니다.

 

 

FROM절에 외부 조인을 적용한 쿼리입니다.

왼쪽 사원 테이블이 드라이빙 테이블이기에 LEFT를 사용했습니다.

기존 외부 조인에서 드라이빙 테이블은 그냥 두고 대상 테이블 컬럼에 (+) 붙인 것과 같습니다.

만약 동호회 테이블을 드라이빙 테이블로 사용하고 사원 테이블을 대상 테이블로 한다면

FROM 절에 RIGHT OUTER JOIN을 사용하면 됩니다.

오른쪽에 있는 테이블이 주 테이블(드라이빙)이라는 의미거든요.

그리고 OUTER를 생략해도 같은 의미가 됩니다.

 

 ANSI 기준에 따라 당연히 조인 조건은 ON, USING을 사용해야 합니다.

추가 조건은 ON, USING에 추가해도 되고

WHERE 절을 추가해서 사용해도 되지만 WHERE절에 조인 조건을 넣으면 오류가 납니다.

 

 

마지막으로 기존 조인에서 불가능한 부분을 ANSI에서 편하게 사용할 수 있는

외부 조인이 있습니다.

 

 

기존 조인은 드라이빙과 대상 테이블 두 군데 (+)를 붙일 수 없습니다.

두 번째 쿼리는 오류가 납니다.

왜 붙여야 하냐면..

만약 양쪽 테이블 정보를 서로 누락 없이 빈 곳은 NULL을 채워서

전부 보여주고 싶은 경우가 있을 겁니다.

기존 조인의 경우는 따로 조회해서 합쳐야 하는 번거로움이 있지만

ANSI를 사용하면 FULL OUTER JOIN으로 간단히 해결됩니다.

 

잘못된 정보나 수정이 필요하면 댓글 주세요.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형
반응형

안녕하세요. 신기한 연구소입니다.

쿼리를 만들다 보면 다양한 join을 만나게 되는데요.

사실 기본 INNER JOIN과 OUTER JOIN을 많이 사용합니다.

그 외에도 NATURAL JOIN과 CROSS JOIN이 있는데..

어떤 의미이며 어떻게 사용하는지 그 방법에 대해 알아봅니다.

 

 

조인에 대해 명시를 하는 INNER, OUTER, NATURAL, CROSS 등을 표준 조인

또는 ANSI 조인이라고 합니다.

그럼 NATURAL JOIN에 대해 살펴봅니다.

이 조인의 특징은 바로 두 테이블 간 공통된 컬럼을 자동으로 인식하는 겁니다.

그 말은 연결 고리를 표시할 필요가 없다는 의미입니다.

 

 

위 쿼리를 보면 NATURAL INNER JOIN 과 NATURAL JOIN 두 가지로 사용되었는데

같은 의미입니다.

INNER는 생략이 가능합니다.

그러고 보니 저번에 INNER JOIN을 포스팅했었는데요.

INNER JOIN은 EQUI(등가) 조인으로 양 쪽 테이블에 같은 값을 가지는 컬럼을 묶어서

연결하는 구조였습니다.

NATURAL JOIN도 INNER JOIN이라면 같은 의미겠지요?

다른 점은 연결 컬럼인 DEPTNO를 명시적으로 표현하지 않았고 알아서 자동으로 연결된다는

점입니다.

그래서 ON, USING, WHERE절의 조인 방식을 사용할 수 없습니다.

또한 연결한 두 테이블의 컬럼은 같은 이름, 같은 데이터 유형이어야 합니다.

또한 별칭(ALIAS)을 사용할 수도 없어요.

또 다른 점은 결과 조회인데요.

INNER JOIN은 *로 조회하면 두 개의 테이블에 존재하는 같은 컬럼이 각각 표시됩니다.

NATURAL JOIN은 한 개만 조회됩니다.

INNER JOIN은 *로 조회하면 두 개의 테이블 전체 컬럼을 순서대로 출력합니다.

NATURAL JOIN은 한 개만 조회된다고 했는데 제일 앞 컬럼에 나옵니다.

그럼 어떤 컬럼으로 조인되었는지 확인이 가능하겠네요.

 

 

위 쿼리와 이번 쿼리와 결과를 비교해 보세요. 이해하기 쉬울 겁니다.

 

다음은 CORSS JOIN 또는 CARTESIAN PRODUCT에 대해 알아봅니다.

사실 조인이라 해야 할지 모르겠네요.

이유는 조인인데 조인 조건이 없습니다.

그냥 두 개 테이블을 M*N으로 곱해서 조회하는 구조거든요.

A 테이블이 10건, B 테이블이 5건이면 10*5 = 50건의 조합으로 데이터가 조회됩니다.

 

 

 

먼저 두 테이블의 각각 건수를 확인합니다.

12건과 5건이 나오네요.

 

이제 CROSS JOIN을 시도합니다.

ANSI 가 아닌 일반적으로 사용할 때는 두 테이블을 FROM절에 콤마(,)로 나열하고

조인 조건을 설정하지 않으면 됩니다.

ANSI로 작성하는 경우는 CROSS JOIN을 사용하고 ON과 USING을 사용하지 않아야 한다.

 

 

이렇게 쿼리를 작성하고 조회하면

12*5 = 60건의 결과가 조회됩니다.

 

중간생략~~

 

사실 일반적인 상황에서 이렇게 조회하지는 않습니다.

그냥 참고로 알고 있으면 되고 대용량 테이블에서 연습 삼아 돌리면 아마 멈출 겁니다. ㅎㅎ

 

잘못된 내용이나 수정이 필요하면 댓글 주세요.

아래 하트(공감) 버튼을 눌러서 더 다양한 글을 쓸 수 있게 응원 부탁드립니다. 감사합니다.

반응형