일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- docker
- manytomanyfield
- javascript
- 트랜잭션
- 호이스팅
- 장고초기세팅
- Jest
- 노드
- status code
- 스코프
- nodeJS
- on_delete
- CORS
- node
- JWT
- 자바스크립트
- Django
- 실행 컨텍스트
- crud2
- pm2
- wecode
- typescript
- async/await
- django westagram
- 프로미스
- OSI7계층
- westagram
- rebase
- TypeError: this.boardRepository.createBoard is not a function
- bcrypt
- Today
- Total
될때까지
SQL Inner join vs Left join vs Outer join 본문
노드 ORM을 사용하지 않고 raw query만 사용해 쿼리를 작성하다 보니 SQL도 공부하고 있다. 자라홈 프로젝트에서 상품 테이블이 있었고, 상품 옵션 테이블이 다대다 관계로 존재했고, 옵션 테이블에 옵션에 대한 정보가 있었다.
INNER JOIN
- 기준 테이블과 조인 테이블 모두의 데이터가 존재해야 쿼리 결과값으로 반환된다. 교집합느낌?
위에 캡처한 테이블에서 쿼리를 아래와 같이 작성했다.
select po.price, s.name
from products_options as po
inner join sizes as s on po.size_id = s.id;
결과를 예측해보자. 현재 products_options 테이블을 기준테이블로 잡았으니까 po테이블에 있는 데이터의 값과 조인 테이블인 size 테이블의 데이터가 양측 모두 있는 데이터만 조회가 될 것이다. 예를 들어 size테이블의 id 13번 free같은 경우는 조회되지 않는다.
LEFT JOIN
- 왼쪽 테이블을 기준으로 붙인다. 존재하지 않는 값은 null값으로 조회된다.
LEFT JOIN을 사용해서 쿼리를 작성해보자.
select *
from sizes as s
left join products_options as po on po.size_id = s.id;
결과가 어떻게 나올까? sizes테이블을 기준으로 잡았으니 sizes테이블에 존재하는 데이터는 모두 출력이 될테고 po에 없는 size의 값 즉 스몰,미디엄은 null값이 붙어서 조회될 것 같다.
OUTER JOIN
- 조인 테이블에 데이터가 없어도 기준 테이블의 모든 데이터가 조회된다. 존재하지 않는 값은 null값으로 조회된다.
현재 products_options테이블에 없는 size_id가 sizes 테이블에 존재한다. sizes테이블을 기준 테이블로 잡아서 쿼리를 작성해보자.
select s.name, po.price
from sizes as s
left outer join products_options as po on po.size_id = s.id;
이 역시 결과를 예측해보자면.. sizes테이블을 기준테이블로 잡았으니까 free사이즈, 스몰, 미디움 같은 사이즈의 이름은 모두 출력이 되야한다. sizes테이블에 있는 값들은 조인 테이블 po에서 가져와 데이터를 붙이고, 조인 테이블 po에 없는 값들은 null값이 붙여 출력될 것 같다.
예스 오케바리!! 정리해보자
inner join은 양쪽 테이블 모두에 데이터가 존재하는 결과값만 출력해야할 때 사용한다. (상품의 카테고리같은 경우 카테고리는 없을 수 없다. 유튜브의 영상같은 경우 게시글과 영상은 inner join이다. 인스타그램의 팔로우 목록? 내가 팔로우한 사람만 나온다.)
left join은 기준 테이블의 모든 값을 출력해야할 때 사용한다.(피드의 좋아요 기능? 일단 게시글은 내가 좋아요하지 않는 게시글도 나오고 좋아요를 누른 게시글도 나온다.)
outer join은 모든 데이터를 출력하며 기준 테이블에 없는 참조 테이블의 데이터는 null값이 들어간다! 모든 데이터를 가져오니 성능이 안좋을 것 같다. 실질적으로 예시가 뭐가 있을까 생각해봤지만 아직 모르겠다.. 알아내면 추가로 정리하도록 하자!