이번엔 JOIN에 대해서 알아보려고 한다.
JOIN이란?
둘 이상의 테이블을 연결해서 데이터를 검색하는 방법이다.
두 테이블을 연결하려면 테이블들이 적어도 하나의 컬럼을 공유하고 있어야하며 보통 이를 PK 또는 FK 값으로 사용한다.
JOIN을 이용하면 on을 사용하게 되는데,
이를 통해 JOIN을 할 범위를 고를 수 있게된다.
그럼 종류를 한 번 살펴보도록 하자.
JOIN의 종류로는 크게 내부조인(INNER JOIN)과 외부조인(OUTER JOIN)이 있다.
아래 데이터들을 가지고 조인을 살펴보자.
Member 테이블
Student 테이블
내부조인(INNER JOIN) - 두 테이블의 공통적인 부분만 Select가 된다.
내부조인은 두 테이블 안에서 공통적으로 데이터가 존재하는지 확인할 때 사용된다.
쿼리문과 함께 살펴보자.
select * from member m inner join student s on m.id = s.id;
member m // m 이라고 불리는 member 테이블과
student s // s 라고 불리는 student 테이블에서
on m.id = s.id // m의 id와 s의 id는 같으니
inner join // 그 중 공통적인 데이터만
새로운 문구들을 설명하자면 위와 같다.
문장으로 만들어보자면 "m이라고 불리는 member 테이블과 s라고 불리는 student 테이블에서 같은 컬럼인 member의 id와 student의 id를 가지고 공통적인 데이터만 조회하겠다" 이렇게 되는 것이다.
결과 값은 아래와 같다.
위 같은 내부조인을 동등조인이라고 부르는데,
관련하여서 좀 더 자세히 알아보자.
내부조인 안에서는 종류를 더 세부적으로 나눌 수 있다.
동등조인 (EQUI JOIN)
먼저 동등조인은 위 예시에서 보았듯이 =를 사용한 동등비교만을 동등조인으로 인정한다.
가장 기본적인 조인이며, 묵시적으로 WHERE문을 통해 사용하기도한다.
select * form member m, student s where m.id = s.id;
묵시적인 SQL문은 위와 같이 사용할 수 있다.
실제로 실행해보면 같은 값이 나오는 것을 볼 수 있다.
자연조인 (NATURAL JOIN)
다음으로는 자연조인이다.
동등조인과 매우 유사하지만 같은 컬럼명을 대상으로 조인을 수행하게되고, 중복된 컬럼은 한번만 출력하게 한다.
select * from member natural join student;
해당 SQL 문은 위와 같이 사용하게 된다.
교차조인 (CROSS JOIN) = 카티션 프로덕트 (Cartesian Product)
교차 조인은 조인에 참여한 테이블들의 모든 데이터가 합쳐져서 출력하게 된다.
모든 테이블 데이터의 곱연산이라고 생각하면된다.
select * from member m cross join student s; select * from member m, student s; // 생략 가능
위 사진에서 볼 수 있듯이 두 테이블의 모든 데이터가 서로 한번씩은 엮여있다.
아마 조인을 사용한다면 위와 같은 결과를 원하지는 않을 것이다.
위 같은 상황을 예방하기 위해서 조인조건을 꼭 명시해주는게 좋다.
셀프조인 (SELF JOIN) = 자가조인
마지막으로 셀프조인이다.
다른 말로는 자가조인이라고도 불리는데, 말 그대로 자기자신을 조인하는 경우이다.
select * from member m join member mem on m.id = mem.id;
자기 자신을 조인하되, 이름을 다르게 부여하여야만 한다.
결과 값은 위와 같다.
자기 자신을 조인하였기에 같은 데이터가 두번 나온 것을 볼 수 있다.
OUTER JOIN - 두 테이블의 공통적이지 않은 부분까지도 조회된다.
선택한 쪽 테이블의 데이터를 모두 조회하면서 조건에 맞지 않는 부분까지도 출력하고 싶을 때 사용된다.
OUTER JOIN의 종류를 살펴보자.
LEFT JOIN
먼저 LEFT JOIN에 대해서 살펴볼 것이다.
Left Join은 말그대로 왼쪽에 있는 테이블을 조회한다고 생각하면 된다.
예를 들어보자면
select * from member m left outer join student s on m.id = s.id; //[여기서 outer는 기본값이지만 써주는게 좋긴하다.]
위와 같은 쿼리문이 있을 때 member m left outer join student 에서 왼쪽 테이블을 조회한다고 생각하면 된다.
위도 문장으로 만들어보자면 "m이라고 불리는 member 테이블과 s라고 불리는 student 테이블 중 member 테이블을 기준으로 같은 컬럼인 id를 가지고 공통적인 데이터를 조회하겠다."가 될 것 같다.
결과 값은 위와 같다.
member 테이블을 기준으로 데이터가 조회 된 것을 볼 수 있다.
이를 약간 이용하여서 공통되지 않는 데이터만 조회하는 방법도 있다.
select * from member m left outer join student s on m.id = s.id where s.id is null;
위처럼 작성하면 "m이라고 불리는 member 테이블과 s라고 불리는 student 테이블 중 member 테이블을 기준으로 같은 컬럼인 id를 가지고 s.id가 null인 것만을 조회하겠다."가 될 것인데,
즉 m.id에는 있지만 s.id에는 없는 값을 조회하겠다는 뜻이라는 것이다.
결과 값은 위와 같다.
student 테이블에는 없는 2번과 4번 값이 조회된 것을 볼 수 있다.
Left Join을 이해했다면,
Right Join도 똑같은 원리이다.
RIGHT JOIN
select * from member m right outer join student s on m.id = s.id;
말그대로 join의 기준이 되는 테이블만 right(student)로 바뀌게 되는 것이다.
그리고 right join 또한 공통되지 않는 데이터를 조회할 수 있다.
위 사진도 똑같이 student 테이블을 기준으로 데이터가 조회 된 것을 볼 수 있다.
select * from member m right outer join student s on m.id = s.id where m.id is null;
결과 값은 위와 같다.
이 또한 member 테이블에는 없는 5번데이터가 조회된 것을 볼 수 있다.
FULL OUTER JOIN
마지막으로 FULL OUTER JOIN은 말 그대로 전체 조회이다.
select * from member m full outer join student s on m.id = s.id;
select * from member m left outer join student s on m.id = s.id
union
select * from member m right outer join student s on m.id = s.id;
참고로 Oracle에는 FULL OUTER JOIN이 있으나 mysql에서는 없어 LEFT JOIN의 결과와 RIGHT JOIN의 결과를 합쳐 사용해야한다.
결과 값은 위와 같다.
이렇게 JOIN에 대해서 알아보는 시간을 가져보았다.
내용이 헷갈리기 쉽고 어려운 내용이라 정리하는데 생각보다 시간이 오래걸렸다.
이 말고도 자격증 시험에서도 나오는 관계대수에 대한 정리가 필요할 것 같다는 생각이 든다.
관계형 데이터베이스에서 원하는 정보와 그 정보를 어떻게 유도하는가에 대한 구문을 작성할 때 쓰이는 요소인데,
이 때 SELECT, JOIN, 카티션 프로덕트 등의 요소들을 써서 구문을 작성하기 때문에 궁금하다면 찾아보는 것도 좋을 것 같다.
아니면 후에 자격증에 대해서 다뤄볼 일이 있을 것 같으니 그 때 한 번 정리해보도록 하겠다.
이런 내용들은 간단하진 않지만 중요한 내용인 만큼 잘 기억해두고 이해하는게 중요한 거 같다.
다음에는 DML의 다른 요소들에 대해서 정리해야겠다.
참고 -
'오늘의 공부 > DB, SQL' 카테고리의 다른 글
서브쿼리 (이중SQL) (0) | 2022.04.14 |
---|---|
[SQL] DML - DELETE (0) | 2022.03.23 |
[SQL] DML - UPDATE (0) | 2022.03.20 |
[SQL] DML - SELECT (0) | 2022.03.20 |
[SQL] DB와 SQL (0) | 2022.03.20 |