본문 바로가기
DB/DB 이해하기

[DB] Left Join on과 Where의 차이

by 에르주 2021. 10. 10.
반응형

실무 프로젝트에서 백엔드 개발을 본격적으로 진행하면서 데이터 조회 간 Table간의 연관 관계 및 Join에 대한 쿼리를 작성하며 개발을 진행하였다.

 

하나의 SPRINT가 끝난 후 데이터의 정합성을 맞추고 쿼리 속도를 빠르게 개선하고자 기개발되어 있는 Table Join쿼리를 다시 점검하는 시간이 있었다. 

그 중 무분별하게 적용되어 있는 Left Join을 Inner Join으로 바꾸고 Left Join의 On과 Where를 혼합해서 사용하다보니 DB 조인에 대해 정리하고 다시 되돌아보는 시간이 필요하다고 느꼈다.

 

그래서 1편에 이은 2편으로 이번에 정리할 내용은 다음과 같다.

Left Join On과 Where의 결과 차이

 

 

각설 하고 실제 DB 조회를 진행해보자.

지난번 예시 Table을 다시 활용해보자. TEAM_ID값으로 2개의 테이블이 연관관계를 맺고 있으므로 TEAM_ID값으로 매핑을 시켜보면

SELECT * FROM "MEMBER" m LEFT JOIN TEAM t ON m.TEAM_ID  = t.TEAM_ID where 1=1;
SELECT * FROM "MEMBER" m LEFT JOIN TEAM t WHERE m.TEAM_ID  = t.TEAM_ID;

 

2개의 쿼리는 위의 사진과 같이 결과값을 보여준다.

CHEALSE  의 선수들을 조회하고 싶다

라는 조건을 추가했을 때에는 어떻게 진행해야 할까?

#1번 쿼리
SELECT * FROM "MEMBER" m LEFT JOIN TEAM t ON m.TEAM_ID  = t.TEAM_ID AND t.NAME ='CHEALSE' WHERE 1=1; 

#2번 쿼리
SELECT * FROM "MEMBER" m LEFT JOIN TEAM t WHERE m.TEAM_ID  = t.TEAM_ID AND t.NAME ='CHEALSE';

TEAM_ID 뿐만 아니라 NAME 조건으로 'CHEALSE'를 적용해보자.

 

1번 쿼리의 결과 값은 다음과 같다.

SELECT * FROM "MEMBER" m LEFT JOIN TEAM t ON m.TEAM_ID = t.TEAM_ID AND t.NAME ='CHEALSE' WHERE 1=1;

 

2번 쿼리의 결과 값은 다음과 같다.

SELECT * FROM "MEMBER" m LEFT JOIN TEAM t WHERE m.TEAM_ID = t.TEAM_ID AND t.NAME ='CHEALSE';

 

1번의 결과값은 MEMBER 테이블의 모든 칼럼들이 조회 되었고 NAME이 CHEALSE인 데이터들만 표시 되었고

2번의 결과값은 내가 원하는 NAME이 CHEALSE인 데이터들이 조회 되었다.

 

그럼 결과를 살펴보자.


 

1) 1번 쿼리

1번은 MEMBER 전체 테이블에 TEAM 테이블에서 NAME이 'CHEALSE'인 데이터를 붙이는 것이다.

 

SELECT * FROM MEMBER; SELECT * FROM TEAM WHERE NAME ='CHEALSE';

 

LEFT JOIN ON MEMBER.ID = TEAM.ID, 즉 LEFT JOIN 후 ID값으로 매핑한 결과는 다음과 같다.

LEFT JOIN ON MEMBER.ID = TEAM.ID

 

 

하지만 여기서 TEAM 테이블에서는 가져오는 데이터는 TEAM_ID가 2이고 NAME인 'CHEALSE' 인 값이다.

SELECT * FROM TEAM WHERE NAME ='CHEALSE';

 

즉 TEAM_ID값이 1, 3, 4 인 데이터는 없다. 결과값은 다음과 같이 나오는 것이다.

 

 

SELECT * FROM "MEMBER" m LEFT JOIN TEAM t ON m.TEAM_ID = t.TEAM_ID AND t.NAME ='CHEALSE' WHERE 1=1;

 


2) 2번 쿼리

2번은 TEAM 테이블을 Join 한 후 하나의 View 테이블을 만든다

 

SELECT * FROM "MEMBER" m LEFT JOIN TEAM t WHERE m.TEAM_ID = t.TEAM_ID;

 

LEFT JOIN ON MEMBER.ID = TEAM.ID

 

일단 TEAM 테이블의 모든 데이터를 가져오게 되므로 

LEFT JOIN 결과는 다음과 같다.

 

그  후 NAME = 'CHEALSE' 인 데이터를 뽑아 내는 것이다.

 

SELECT * FROM "MEMBER" m LEFT JOIN TEAM t WHERE m.TEAM_ID = t.TEAM_ID AND t.NAME ='CHEALSE';

 

 

테이블간의 연관 관계 및 연관 관계를 이용한 Join은 테이블 조회에 가장 기본중에 기본이다.

해당 내용을 다시 정리하고 실수하지 않도록 노력해야겠다.

 

끝.

반응형

댓글