테이블 간의 연결을 하는 JOIN 쿼리
select ~
from table1 inner join table2 on table1.col1 = table2.col1
<예시>
-- 왼쪽 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
프로그래머스 JOIN 문제 (난이도 하)
animal_ins 테이블 정보 → 동물 보호소에 들어온 동물의 정보
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
animal_out 테이블 정보 → 동물 보호소에서 입양 보낸 동물의 정보
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_OUTCOME | VARCHAR(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;
-- 둘 다 결과는 같다