본문 바로가기
백엔드 개발/백엔드 일기

#008. 백엔드 성장일기: SQL 사용법( INNER OUTER JOIN 등)

by iamjoy 2022. 5. 2.

이번주 프로젝트를 하면서 SQL문 사용법을 몇가지 배우게 되어서 정리하려고 한다.

 


아래 이미지 중에서 자주 사용하는 개념은 두 원이 겹치는 부분인 INNER JOIN왼쪽 초승달 모양 부분의 LEFT OUTER JOIN이다. 

 

 

[INNER JOIN]

INNER JOIN은 조인 하는 컬럼을 기준으로 두 테이블에 모두 존재하는 데이터를 가지고 와서 합친다.

예를 들어서 아래와 같은 경우 school 과 church 에 동시에 존재하는 user를 기준으로 JOIN을 하기 때문에 학교와 교회에 동시에 존재하는 사람들의 id와 name을 조회한다.

INNER JOIN을 여러번 겹칠 수도 있다. 아래의 경우 학교, 교회, 동아리에 동시에 소속되어 있는 사람을 조회한다.

 

 

[LEFT OUTER JOIN]

위와 달리 존재하지 않는, 부정 조건을 넣어서 조회하고 싶을 수도 있다. 예를 들어 학교에는 소속되어 있지만 교회에는 소속되어있지 않은 사람을 검색하려면 학교 테이블에서 교회 테이블과 중복되는 데이터를 제외한 나머지를 선택해야한다. 다이어그램에서 초승달 모양을 나타낸다.

 

아래의 세번째 줄을 보면 school 과 church 가 left (outer) join으로 join 되어 있으므로 school 테이블 전체를 가르키게 된다.

그런데 그 다음 줄에 WHERE c(church).id IS NULL에서 c.id가 있는(공통된 부분) 을 제외하게 되므로 school 테이블 중 church와 겹치는 것이 없는 초승달 모양을 의미하게 된다.

여기서 한 걸음 더 나아가 단순 테이블이 아니라 조건이 걸린 부분을 제외하고 싶을 때가 있다. 예를 들어서 school 테이블에서 교회를 다니는 사람 중 나이는 15살 이하이고 남학생인 경우만 제외하고 싶을 수 있다. 이럴 땐 아래와 같이 ON 이후 WHERE 없이 AND 로 LEFT JOIN 하는 테이블에 조건을 걸어 줄 수 있다.

 

마지막으로 조인을 하려고 하는 테이블에 PK 가 없는 경우 데이터의 중복이 있을 수 있기 때문에  Primary Key 가 없는 데 JOIN을 할 수 없다. 

 

[DISTINCT]

데이터의 중복 없이 가지고 올 때 사용할 수 있다. 다만 DISTINCT를 사용하면 쿼리 속도가 느려질 수 있기 때문에 함수를 만들어서 중복을 제외하는 경우도 고려해볼 수 있다.

 

 

[alias 에러]

missing FROM-clause entry for table

FROM 절에 적힌 table에 접근하지 못한다는 의미로 혹시 alias 설정을 하고 다른 이름으로 테이블을 부르고 있지는 않은 지 확인해봐야한다.

 

 

[현재 시각을 찍는 now()]

SQL 문에 now()를 사용하면 SQL문이 호출되는 시점을 찍기 때문에 미묘한 차이로 하루가 넘어가는 등의 에러가 발생할 수 있다. 따라서 now()는 모든 쿼리가 공통적으로 접근할 수 있는 router에 설정해서 모든 now()가 찍는 시간이 일정하도록 설정한다.

 

 


https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/

 

깔끔하게 정리되어 있어서 참고하기 좋은 사이트:

 

 

SQL 기본 문법: JOIN(INNER, OUTER, CROSS, SELF JOIN)

조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다. INNER JOIN(내부 조인)은 두 테이블을 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 있어야 한다.OUTER JOIN(외부

hongong.hanbit.co.kr