JOIN 간단 정리

genie_h·2021년 12월 13일
0

TIL

목록 보기
5/5
post-thumbnail

테이블 간의 연결을 하는 JOIN 쿼리

JOIN

  • 2개 이상의 테이블을 같은 컬럼명을 primary key로 기준삼아 하나의 테이블로 만드는 것
  • 즉, 여러개의 테이블을 옆으로 붙인다고 생각하면 쉽다 (컬럼이 늘어나는 것)
  • 옆으로 계속 컬럼을 붙이다보면 그 수가 많아져 동일한 컬럼명이 생길 수 있으므로 테이블명.컬럼명으로 작성하는 것이 좋음
  • 3개 이상 테이블을 연결하는 경우 앞의 2개 테이블 먼저 join, 결과에 남은 한 테이블을 join하는 형태
  • 다양한 컬럼값을 한번에 검색할 수 있다는 장점

JOIN 종류

1. INNER JOIN

select ~
from table1 inner join table2 on table1.col1 = table2.col1
  • col1이 공통되는 경우의 row만 찾아 양쪽 테이블을 연결시킴
  • 결국 공통적으로 있는 값만 검색되는 것

2. OUTER JOIN (LEFT, RIGHT, FULL)

  • JOIN을 중심으로 기준 테이블의 위치에 따라 LEFT, RIGHT, FULL로 나뉨

<예시>

-- 왼쪽 table1의 col1은 무조건 출력됨
select ~
from table1 as a left join table2 as b on a.col1 = b.table2.col1

-- 오른쪽 table2의 col1은 무조건 출력됨
select ~
from table1 as a right join table2 as b on a.col1 = b.table2.col1

-- 양쪽 모두인 경우 양쪽 테이블의 col1이 모두 검색
select ~
from table1 as a full join table2 as b on a.col1 = b.table2.col1
  • 보통 LEFT JOIN이 많이 쓰인다

프로그래머스 JOIN 문제 (난이도 하)

animal_ins 테이블 정보 → 동물 보호소에 들어온 동물의 정보

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

animal_out 테이블 정보 → 동물 보호소에서 입양 보낸 동물의 정보

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_OUTCOMEVARCHAR(N)FALSE

📌 문제 1)

천재지변으로 인해 일부 데이터 유실. 입양간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문 작성하기.

-- 보호소에 들어온 기록이 없다? animal_ins의 ID가 null이어야 함

select a.animal_id, a.name
from animal_outs as a left join animal_ins as b
on a.animal_id = b.animal_id
where b.animal_id is null 
order by 1;

📌 문제 2)

관리자의 실수로 일부 동물 입양일이 잘못 입력. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문 작성하기. 이때 결과는 보호 시작일이 빠른 순으로 조회해야 함.

-- 1. 기본적인 조인 쿼리문으로 작성하는 경우
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS AS A LEFT JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME -- 보호시작일 > 입양일
ORDER BY A.DATETIME ASC;


-- 2. 서브쿼리를 이용해 조인한 결과를 임시 테이블로 만들어 사용하는 경우 
SELECT ANIMAL_ID, NAME
FROM (
SELECT A.DATETIME AS D1, B.DATETIME AS D2, A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS AS A
LEFT JOIN ANIMAL_OUTS AS B
ON A.ANIMAL_ID = B.ANIMAL_ID) AS C
WHERE D1 > D2
ORDER BY D1 ASC;

-- 둘 다 결과는 같다
profile
데이터 분석에 관심 많은 취준생

0개의 댓글