관계형 데이터베이스에서 Join이란?

코딩하는범이·2022년 7월 31일
0

Join이란?

Join의 개념에 대해서 알아보기 전에 관계형 데이터베이스가 무엇인지 짚고 넘어가려고 한다.

관계형 데이터베이스란?

  • 관계형 데이터베이스는 가장 많이 사용되는 데이터베이스의 한 종류이다.
  • 관계형 데이터베이스는 테이블로 이루어져 있으며 이 테이블은 키와 밸류의 관계를 나타낸다.
  • 데이터의 종속성을 관계로 표현하는 것이 관계형 데이터베이스의 특징이다.

관계형 데이터베이스의 특징

  • 데이터의 분류, 정렬, 탐색 속도가 빠르다.
  • 오랫동안 사용된 만큼 신뢰성이 높고, 어떤 상황에서도 데이터의 무결성을 보장해준다.
  • 기존에 작성된 스키마를 수정하기가 어렵다.
  • 데이터베이스의 부하를 분석하는 것이 어렵다.

의문점

  • 데이터의 분류, 정렬, 탐색 속도가 빠르다고 하지만, Nosql 보다 빠를까?...
  • 데이터베이스 부하를 분석이 어렵다고하는데 다른 데이터베이스는 쉬운건가?

Join의 개념

Join이라는 영어 뜻을 살펴보면 "가입하다", "참여하다", "어울리다" 라는 뜻을 가지고 있는데 관계형 데이터베이스에서 테이블 간의 결합을 이야기한다.

위키백과에서 정의 된 내용을 확인해 보자면 아래와 같다.

join(조인) 또는 결합 구문은 한 데이터베이스 내의 여러 테이블의 레코드를 조합하여 하나의 열로 표현한 것이다. 따라서 조인은 테이블로서 저장되거나, 그 자체로 이용할 수 있는 결과 셋을 만들어 낸다.

즉, Join이란 데이터베이스 내의 2개 이상의 테이블을 합쳐 Select 하는 방법 중 하나이다.

조인의 종류

INNER JOIN

두 테이블의 교집합, 두 테이블간 JOIN 조건을 만족하는 행을 반환한다.

INNER JOIN을 하는 방법은 두가지로 표현할 수 있다.

1) 명시적 조인 표현

테이블에 조인을 하라는 것을 지정하기 위해 'JOIN' 키워드를 사용하고 ON의 키워드를 조인에 대한 구문을 지정하는데 사용한다.

SELECT * 
FROM MEMBER member
INNER JOIN LOCKER locker
ON member.id = locker.member_id

2) 암시적 조인 표현

FROM 구문에 콤마(,)를 사용해서 하나가 아닌 여러 테이블의 정보를 가져온다.

SELECT *
FROM MEMBER member, LOCKER locker
WHERE member.id = locker.member_id

여기에서 ON 절에서 비교하는 것과, WHERE 절에서 조건을 걸어 비교하는 것은 똑같은 것일까? 싶어서 찾아봤다.

ON 과 WHERE 의 차이

SQL의 JOIN에서 ONWHERE의 차이점은 JOIN 하는 범위가 다르다.
위의 쿼리에서 ON은 member.id = locker.member_id 를 INNER JOIN 한 결과가 나오게 되고 WHERE 절은 member, locker 를 가져온 결과에서 member.id = locker.member_id 를 수행하게 된다.
즉 순서가 다른것인데, 위의 쿼리에서는 크게 결과값의 차이를 볼 수 없지만 OUTER JOIN에서는 차이가 있을 수 있다. 이 부분을 주의해서 사용해야 할 것 같다.

OUTER JOIN

OUTER JOIN이란 조인 조건에서 동일한 값이 없는 행도 반환할 때 사용을 한다.

OUTER JOIN의 종류

OUTER JOIN은 지정한 방향의 JOIN을 기준으로 값이 출력된다.

  • LEFT OUTER JOIN: 왼쪽 테이블의 모든 값이 출력되는 조인
  • RIGHT OUTER JOIN: 오른쪽 테이블의 모든 값이 출력되는 조인
  • FULL OUTER JOIN: 왼쪽 또는 오른쪽 테이블의 모든 값이 출력되는 조인

LEFT OUTER JOIN

조인문의 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 테이블을 매칭하고, 매칭되는 데이터가 없을 경우 NULL을 표시한다.

SELECT * 
FROM MEMBER member LEFT OUTER JOIN LOCKER locker
ON member.id = locker.member_id

위를 예로 들면, member에 있는 모든 값을 ON 조건에 맞게 가져오고 매칭 되는 데이터가 없는 경우 조건 값에 맞지 않는 결과 값은 NULL로 표시한다

RIGHT OUTER JOIN

조인문의 오른쪽에 있는 테이블의 모든 결과를 가져온 후 왼쪽 테이블의 테이블을 매칭하고, 매칭되는 데이터가 없을 경우 NULL을 표시한다. LEFT의 반대 버전이라 생각 하면 된다.

SELECT * 
FROM MEMBER member RIGHT OUTER JOIN LOCKER locker
ON member.id = locker.member_id

위와 유사하게 locker에 있는 모든 값을 ON 조건에 맞게 가져오고 매칭 되는 데이터가 없는 경우 조건 값에 맞지 않는 결과 값은 NULL로 표시한다.

FULL OUTER JOIN

LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합친 것으로, 양쪽 모두 조건이 일치하지 않는 것들까지 모두 결합하여 출력한다.

SELECT * 
FROM MEMBER member FULL OUTER JOIN LOCKER locker
ON member.id = locker.member_id

조건에 해당하는 매칭 되는 데이터가 없어도 모두 표시한다.

CROSS JOIN

CROSS JOIN은 두 테이블에 대한 곱집합에 대한 결과물을 반환한다.
예를 들어, A테이블의 3개의 데이터와 B테이블의 4개의 데이터가 있다고 가정 했을때 총 12개의 데이터를 반환한다.

SELECT *
FROM MEMBER 
CROSS JOIN LOCKER;

SELF JOIN

SELF JOIN은 한 테이블을 여러번 복사해서 조인을 한다.

SELECT *
FROM MEMBER member1, MEMBER member2

순환 관계 테이블 모델링에서 사용하기 좋아 보인다.

끝으로...

실무에서 SELF JOIN은 사용 할 수 있을 것으로 보이는데, CROSS JOIN은 사용할지 의문이다.

출처

https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

profile
기록 그리고 기억

0개의 댓글