MySQL (5) - SQL JOINS

HoDu PyTHON·2023년 1월 7일
1

MySQL

목록 보기
5/5
post-thumbnail

MySQL의 여러가지 JOIN들

JOIN은 관계형 SQL에서 중요한 개념이다. 두 테이블들의 데이터를 특정한 조건을 통해 연결해 마치 하나의 테이블로서 활용하는 방법이다.

SQL JOINS img
위의 그림을 보면 JOIN들에 대한 시각화를 보여준다.
처음 이 그림을 보고는 잘 이해가 되지 않았으나 꼭 숙지해야하는 개념이므로 확실히 이해해보도록 하자.
JOIN은 내가 어떤 데이터들이 필요한지 아는 것이 중요하다고 한다. 그 이후에 다시 이 그림을 본다면 LEFT JOIN을 사용할지, INNER JOIN을 사용할지 결정할 수 있게된다.

뿐만아니라 여기에서 두 개의 테이블을 벤 다이어그램으로 시각화된 SQL의 여러 JOIN들을 보여준다.


LEFT JOIN

LEFT JOINLEFT OUTER JOIN이라고도 하며 이때 OUTER는 합집합으로 생각하면 이해가 쉽다.
Table A와 B에 공동으로 존재하는 (조건에 맞는) 데이터를 JOIN해준다. 이때 Table A에 존재하는 데이터는 모두 가져오고 A에만 존재하며, B에는 존재하지 않는 데이터에 대해서는 NULL 값을 가지게 된다.

LEFT JOIN CODE

LEFT JOIN 코드는 다음과 같다.

SELECT * 
FROM TableA A
	LEFT JOIN TableB B 
    ON A.key = B.key

예시를 확인하기 위해서 프로그래머스 문제에서 제공되는 테이블 두개에 대해서 코드를 돌려보였다. 문제정답은 아니다

LEFT JOIN CODE EXAMPLE

SELECT * 
FROM ANIMAL_OUTS A
    LEFT JOIN ANIMAL_INS B 
    ON A.ANIMAL_ID = B.ANIMAL_ID 

위의 예시 코드를 돌리면 아래와 같은 결과를 얻을 수 있는데 Table A (ANIMAL_OUTS)에는 존재하지만 Table B (ANIMAL_OUTS)에는 존재하지 않는 데이터는 NULL로 빈칸이 채워진걸 볼 수 있다.
A와 B에 모두 존재하는 데이터는 잘 JOIN되어 표시되어있다.


INNER JOIN

이번에는 LEFT JOIN만큼 많이 사용된다고하는 INNER JOIN에 대해서 알아보자. INNER JOIN은 합쳐진 두 Table A와 Table B에 공동으로 존재하는 값들을 나타낸다. 즉, 벤 다이어그램 상에 A와 B의 교집합 영역을 의미한다.

INNER JOIN CODE

INNER JOIN 코드는 다음과 같다.

SELECT * 
FROM TableA A
	INNER JOIN TableB B 
    ON A.key = B.key

INNER JOIN CODE EXAMPLE

예시를 위해서 마찬가지로 위에서 사용한 프로그래머스 문제를 통해 확인해보자.

SELECT * 
FROM ANIMAL_OUTS A
    INNER JOIN ANIMAL_INS B 
    ON A.ANIMAL_ID = B.ANIMAL_ID;

위의 예시 코드를 돌리면 아래와 같은 결과를 얻을 수 있다. 위에서 먼저 확인한 LEFT JOIN에서 Table A (ANIMAL_OUTS)에만 존재하는 데이터(NULL로 표시되었던..)는 표시되지 않아야한다. 즉, A와 B에 모두 존재하는 데이터만 나타나야하면 아래 결과에 보이듯 ANIMAL_IDA349990인 고양이부터 잘 나왔다.


LEFT JOIN - INNER JOIN

이제 LEFT JOIN도 알았고 INNER JOIN도 알았다. 그럼 벤 다이어그램 상에서 표현되는 A-B 영역은 어떻게 나타낼수 있을까?
이 영역은 A에만 존재하는 데이터를 의미한다. 해법은 NULL을 이용하는 것이다.

우선 LEFT JOIN을 통해서 Table A와 Table B를 합쳐준다. 그 이후 A에만 존재하는 데이터는 B에서는 NULL로 표현되었다. 따라서 B에서는 NULL이라면 A에만 존재하는 데이터이므로 WHERE로 B의 값이 NULL인지만 확인해주면 된다.

A-B CODE

SELECT * 
FROM TableA A
	LEFT JOIN TableB B 
    ON A.key = B.key WHERE B.key IS NULL;

코드는 위와 같다. A.key = B.key 조건으로 JOIN한 뒤 B.key가 NULL인 경우만 SELECT하면 된다.

A-B CODE EXAMPLE

드디어 예시를 확인하기 위해서 보았던 프로그래머스 문제에서 요구하는 개념이다.

Table A (ANIMAL_OUTS)에는 존재하지만 Table B (ANIMAL_INS)에는 존재하지 않는 데이터를 출력해야한다.

SELECT * 
FROM ANIMAL_OUTS A
    LEFT JOIN ANIMAL_INS B 
    ON A.ANIMAL_ID = B.ANIMAL_ID WHERE B.ANIMAL_ID IS NULL;

위의 코드를 돌리면 아래의 결과를 얻을 수 있다. 앞선 결과들과 비교해 A-B에 해당하는 데이터가 잘 출력되는 것을 볼수 있다.
위의 예시 코드를 문제에서 요구하는 조건에 맞추어 잘 출력하면 정답 판정을 받을 수 있다.


RIGHT JOIN & 그 외

위에서 설명한 JOIN 외에는 RIGHT JOIN이 있고 FULL OUTER JOIN이 있다. RIGHT JOINLEFT JOIN으로 환원하여 사용할 수 있으므로 잘 사용할것 같지 않다.
FULL OUTER JOIN 역시 아직은 언제 사용될지 모르겠지만 어떤 의미를 가지는지 알고 있다면 나중에 찾아서 사용하면 될것 같다.

몇가지 예시 코드들을 첨부한다.

RIGHT JOIN CODE

SELECT * 
FROM TableA A
	RIGHT JOIN TableB B 
    ON A.key = B.key;

SELECT * 
FROM TableA A
	RIGHT JOIN TableB B 
    ON A.key = B.key WHERE A.key IS NULL;

FULL OUTER JOIN CODE

SELECT * 
FROM TableA A
	FULL OUTER JOIN TableB B 
	ON A.key = B.key;
    
SELECT * 
FROM TableA A
	FULL OUTER JOIN TableB B 
    ON A.key = B.key 
    WHERE A.key IS NULL OR B.key IS NULL;

계속 살펴봤던 벤 다이어그램을 통해서 A에만 있는 정보인지, B에만 있는 정보인지, 혹은 둘다 가지고 있는 정보인지, 원하는 조건이 무엇인지 구분할 수 있다면 JOIN을 이용한 문제들을 잘 해결할 수 있을 것이다.

profile
나는야 척척'박사' & ML/DL & Coffee

0개의 댓글