Skip to main content

Command Palette

Search for a command to run...

[database] JOIN

Published
5 min readView as Markdown

JOIN

JOIN이란?

둘 이상의 릴레이션에 흩어져 있는 튜플들을 특정 조건으로 조합하여 하나의 릴레이션을 구성하도록 검색(SELECT)하는 방법. 조인은 릴레이션들의 공통 속성을 기준으로 하므로 테이블들간에 최소한 하나의 속성을 공유하고 있어야 한다.

여러가지 조인 조건에 따라 검색 결과를 다르게 할 수 있다.

아래는 업데이트된 과목, 수강 테이블.

과목번호과목명강의 교수
001컴퓨터구조장성태
002정보보호개론양수미
003디지털논리설계장성태
004네트워크보안양수미
학번과목번호학점
180001B
181002B+
180003A+
181004A

크로스 조인(CROSS JOIN)

테이블 행들 사이의 모든 조합을 행으로 갖는 하나의 통합 테이블을 만들어낸다. 조인 조건식 없이 이루어진다. (관계 대수의 카티션 프로덕트 연산, 곱집합의 결과.)

대부분의 행이 의미 없는 결합인 경우가 많다.

SELECT * FROM 학생, 수강;
SELECT * FROM 학생 
    CROSS JOIN 수강;
학번이름주전공_ID복수전공_ID학번과목번호학점
180영두92180001B
181성욱1NULL180001B
180영두92181002B+
181성욱1NULL181002B+
180영두92180003A+
181성욱1NULL180003A+
180영두92181004A
181성욱1NULL181004A

내부 조인(INNER JOIN)

교집합. 두 테이블 모두에서 조건을 만족하는 튜플을 가져온다.

크로스조인과는 달리 조건이 있기 때문에 의미 있는 조합만을 검색할 수 있다.

SELECT * FROM 학생 
    INNER JOIN 수강 ON 학생.학번 = 수강.학번;
SELECT * FROM 학생, 수강 
    WHERE 학생.학번 = 수강.학번;
학번이름주전공_ID복수전공_ID학번과목번호학점
180영두92180001B
181성욱1NULL181002B+
180영두92180003A+
181성욱1NULL181004A

셀프 조인(SELF JOIN)

같은 테이블에 속하는 행들끼리 하는 조인.

자신이 갖고 있는 속성을 다양하게 변형시켜 활용할 때 쓰인다. (e.g. 쌍 만들기 )

SELECT c1.과목명, c2.과목명
    FROM 과목 c1 JOIN 과목 c2 ON c1.강의교수 = c2.강의교수
    WHERE c1.과목번호 < c2.과목번호
과목번호과목명강의 교수
001컴퓨터구조장성태
002정보보호개론양수미
003디지털논리설계장성태
004네트워크보안양수미
005졸업프로젝트장성태
과목명과목명
컴퓨터구조디지털논리설계
디지털논리설계네트워크보안

OUTER JOIN이란?

일반적인 조인인 내부 조인을 하게 되면 조인 조건을 만족하는 행들만 결과에 포함된다.

때로는 조인 대상 테이블의 모든 행들이 결과에 포함되기를 원하는 경우도 있다. 그럴 때 외부 조인(OUTER JOIN)을 사용한다.

외부조인의 결과로 몇몇 매칭되지 않는 컬럼에서는 NULL 값을 가질 수 있다.

조인 결과에 포함되기를 원하는 릴레이션의 대상에 따라 OUTER JOIN은 3가지(LEFT, RIGHT, FULL)로 분류한다.

LEFT OUTER JOIN

JOIN 연산자의 왼쪽 테이블의 모든 행들이 빠짐없이 결과에 포함된다.

Student 릴레이션에 아무 과목을 듣지 않는 두 학생이 추가됐다고 가정해보자.

학번이름
180영두
181성욱
182진욱
183원석
SELECT 학생.학번, 이름, 학점 FROM 학생 
    LEFT JOIN 수강 ON 학생.학번 = 수강.학번;
학번이름학점
180영두B
181성욱B+
180영두A+
181성욱A
182진욱NULL
183원석NULL

RIGHT OUTER JOIN

JOIN 연산자의 오른쪽 테이블의 모든 행들이 빠짐없이 결과에 포함됨.

Student 릴레이션에 수업을 들었던 두 학생이 삭제됐다고 가정해보자.

SELECT 학생.학번, 이름, 학점 FROM 학생 
    RIGHT JOIN 수강 ON 학생.학번 = 수강.학번;
학번이름학점
NULLNULLB
NULLNULLB+
NULLNULLA+
NULLNULLA

FULL OUTER JOIN

합집합. 두 테이블의 모든 데이터가 검색된다. LEFT JOIN과 RIGHT JOIN의 결과를 합친 것과 같다.

학번이름학점
NULLNULLB
NULLNULLB+
NULLNULLA+
NULLNULLA
182진욱NULL
183원석NULL

참고

More from this blog

[JPA] 엔티티 equals 오버라이딩 괜찮을까?

최근에 한 딜레마에 빠졌다. 레포지토리에 대한 테스트 코드를 짜고 있었는데, 확실한 DB 조회 확인을 위해 영속성 컨텍스트를 초기화(em.clear)하면서 문제가 생겼다. 테스트에서 em.clear()을 했을 때의 예시 @BeforeEach 에서 먼저 필드에 더미 데이터를 넣어준다. 추후의 테스트를 편리하게 할 목적의 필드이다. // ... public class MemberRepositoryTest { // ... ...

Oct 26, 20233 min read

[network] JWT

왜 필요한데? 보안 문제 만약 서버와 클라이언트가 서로 유저 정보를 순수 JSON으로 보내게 되면, 이게 유효한 정보인지 확인할 방법이 없다. 만약 악의를 가진 공격자가 유저 ID를 바꿔서 요청을 했을 경우, 서버에선 무슨 일이 일어난 건지 알 방법이 없다. 그래서 유저를 식별할 수 있는 중요한 데이터를 토큰화시켜 주고받게 된다. HTTP의 특징 기본적으로 HTTP 통신은 무상태(Stateless)이다. 매번 사용자가 로그인...

Feb 28, 20234 min read

[network] HTTP & HTTPS

HTTP(Hypertext Transfer Protocol)란? HTTP는 인터넷에서 하이퍼텍스트를 교환하기 위한 통신 규약이다. 대표적으로 주고 받는 데이터 형태는 HTML이다. OSI 7계층중 응용계층에 속하는 프로토콜 TCP/IP 위에서 작동 Request와 Response로 통신 비연결지향(Connectionless) HTTP는 클라이언트가 요청(Request)을 서버에 보내고, 서버는 클라이언트에게 적절한 응답(Response)을 ...

Feb 26, 20233 min read

[database] 트랜잭션

트랜잭션 트랜잭션(transaction)이란? 한 묶음으로 처리되도록 만든 SQL 명령문들을 묶은 작업 단위 대부분의 의미 있는 서비스 처리를 하려면 SQL 명령문 한번 (SELECT, UPDATE, …)만으로는 어렵다. 계좌이체라는 작업을 예시로 들어보자. 만약 X의 돈을 100 감소시키는 UPDATE 문 직후에 서버가 다운되면 어떻게 될까? 더 이상 서버에선 쿼리문을 날리지 못하니, Y에겐 100만큼의 돈이 가지 않고 회사가 X의 돈을 ...

Feb 21, 20232 min read

wonslee

15 posts