이번주 코드스테이츠에서 진행했던 Database 스프린트를 마무리 할 겸, 가장 헷갈렸던 개념들을 정리하려고 한다. 내가 헷갈렸던 부분은 조회(select)쿼리 중 Join을 해서 데이터를 조회하는 방식에서였다. 그냥 join을 쓰면 관련되어 있는 두 테이블의 교집합인 데이터를 가져오는 것은 이해를 했는데, Outer join, left outer join, right outer join등 Outer와 관련된 join에서 기존 그냥 썼던 join과 어떤 차이가 있는지 구분하기 힘들었다. 여러 자료를 찾아보고, 나만의 테스트를 진행해본뒤 내가 이해한데로 정리를 해보려고 한다.
위 테이블로, 각각의 join을 정리하겠다.
Inner join
Inner join은 두 테이블의 교집합이 되는 데이터를 조회할 때 사용한다. Inner join은 내가 처음에 그냥 썼던 join과 같은 개념이었다. 그냥 join이라고 입력하면, Inner라는 말이 생략된다.
select * from A join B from on A.id = B.StackId;
select * from A inner join B from on A.id = B.StackId;
위 두 쿼리의 결과는 같다.
select * from A join B on A.id = B.StackId;
쿼리 결과는 다음과 같다.
id | StackId | name | Stack |
1 | 4 | Tim | php |
2 | 3 | Mike | react |
3 | 2 | Phill | node.js |
4 | 1 | Casu | js |
Outer join
Outer join은 join하려는 테이블에서 한 테이블을 기준으로, 기준 테이블에서 다른 테이블과 매치되지 않은 row(행)까지 모두 출력하는 join을 말한다. Outer join은 left outer join와 right outer join 두 종류로 구성된다. left outer join은 left join과 같은 말이고, right outer join은 right join과 같은 말이다.
tableA left join tableB : tableA가 기준테이블, tableB와 매치되지 않는(공통되지 않는) tableA의 row까지 포함해서 출력한다. 매치 되지 않는 부분은 null로 표시된다. 이는 tableB right join tableA와 같은 결과를 출력한다.
tableA right join tableB : tableB가 기준테이블, tableA와 매치되지 않는(공통되지 않는) tableB의 row까지 포함해서 출력한다. 매치 되지 않는 부분은 null로 표시된다. 이는 tableB left join tableA와 같은 결과를 출력한다
(Left join 예시)
select * from A left join B on A.id = B.stackId;
id | stackId | name | stack |
1 | 1 | Casu | js |
2 | 2 | Phill | node.js |
3 | 3 | Mike | react |
4 | 4 | Tim | php |
5 | null | null | java |
6 | null | null | spring |
A 테이블이 기준이기 때문에, A 테이블의 모든 row를 출력한다. B테이블과 매치되지 않는 stackId와 name은 null처리가 되었다. B테이블에는 stackId 5번과 6번이 없기 때문이다.
(Right join 예시)
select * from A right join B on A.id = B.stackId;
id | stackId | name | stack |
1 | 4 | Tim | php |
2 | 3 | Mike | react |
3 | 2 | phill | node.js |
4 | 1 | Casu | js |
마찬가지로 B테이블이 기준이고, B 테이블의 모든 row를 출력한다.
'기술들 > Database' 카테고리의 다른 글
Database개념 (feat. Mysql) (0) | 2020.12.02 |
---|