테이블 사이의 복잡한 관계를 파악해보아요.
🔗 JOIN 개념과 기본 코드는 여기 참고하기
🔗 문제 바로가기
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름ANIMAL_INS
→ SEX_UPON_INTAKE
ANIMAL_OUTS
→ SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
일부 데이터가 유실되어 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID순으로 조회하는 SQL문을 작성하라.
DATETIME
정보가 ANIMAL_OUTS
에만 있는 레코드를 원한다.LEFT JOIN
을 이용해야 한다.RIGHT JOIN
도 당연히 가능!)ANIMAL_OUTS
의 ANIMAL_ID
와 ANIMAL_INS
의 ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_INS
에도 DATETIME
정보가 있으므로 ANIMAL_INS
의 DATETIME
정보가 없는 것을 가져오기 위해서는 NULL인 값만 가져와야 한다
는 조건을 추가해야 한다.ANIMAL_ID
순으로 조회해야 한다.SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
ANIMAL_ID
와 NAME
필드값을 조회한다.FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
LEFT JOIN
을 이용하여 ANIMAL_OUTS
테이블을 기준으로 ANIMAL_INS
테이블을 조합한다.ANIMAL_OUTS.ANIMAL_ID
와 ANIMAL_INS.ANIMAL_ID
가 같은 값만 가져온다.WHERE ANIMAL_INS.DATETIME IS NULL
ANIMAL_INS.DATETIME
정보가 없는, 즉 NULL
인 값만 가져온다.ORDER BY ANIMAL_OUTS.ANIMAL_ID
ANIMAL_OUTS.ANIMAL_ID
필드값을 기준으로 오름차순으로 정렬한다.SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_INS.DATETIME IS NULL
ORDER BY ANIMAL_OUTS.ANIMAL_ID
🔗 문제 바로가기
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름ANIMAL_INS
→ SEX_UPON_INTAKE
ANIMAL_OUTS
→ SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
관리자의 실수로 일부 동물의 입양일이 잘못 입력되었다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성하라. 이때 결과는 보호 시작일이 빠른 순으로 조회해야 한다.
ANIMAL_OUTS.DATETIME
값 중 잘못된 값이 있다. 그러므로 ANIMAL_INS.DATETIME
값을 가져와야 한다.RIGHT JOIN
이용!ANIMAL_OUTS
의 ANIMAL_ID
와 ANIMAL_INS
의 ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_OUTS.DATETIME
값이 ANIMAL_INS.DATETIME
값보다 큰 레코드를 가져와야 한다. ANIMAL_INS.DATETIME
값을 기준으로 오름차순으로 조회해야 한다.SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
ANIMAL_ID
와 NAME
필드값을 조회한다.FROM ANIMAL_OUTS
RIGHT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
RIGHT JOIN
을 이용하여 ANIMAL_INS
테이블을 기준으로 ANIMAL_OUTS
테이블을 조합한다.ANIMAL_OUTS.ANIMAL_ID
와 ANIMAL_INS.ANIMAL_ID
가 값은 값만 가져온다.WHERE ANIMAL_OUTS.DATETIME < ANIMAL_INS.DATETIME
ANIMAL_OUTS.DATETIME
값이 ANIMAL_INS.DATETIME
보다 작은 값만 가져온다.ORDER BY ANIMAL_INS.DATETIME
ANIMAL_INS.DATETIME
값을 기준으로 오름차순으로 정렬한다.SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_OUTS
RIGHT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_OUTS.DATETIME < ANIMAL_INS.DATETIME
ORDER BY ANIMAL_INS.DATETIME
🔗 문제 바로가기
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름ANIMAL_INS
→ SEX_UPON_INTAKE
ANIMAL_OUTS
→ SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성하라. 이때 결과는 보호 시작일 순으로 조회해야 한다.
DATETIME
정보가 ANIMAL_INS
에만 있는 레코드를 원한다.LEFT JOIN
이용!ANIMAL_OUTS
의 ANIMAL_ID
와 ANIMAL_INS
의 ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_OUTS
에도 DATETIME
정보가 있으므로 ANIMAL_OUTS
의 DATETIME
정보가 없는 것을 가져오기 위해서는 NULL인 값만 가져와야 한다
는 조건을 추가해야 한다.ANIMAL_INS.DATETIME
값을 기준으로 오름차순으로 조회해야 한다.SELECT INS.NAME, INS.DATETIME
NAME
과 DATETIME
필드값을 조회한다.FROM ANIMAL_INS AS INS
LEFT JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
LEFT JOIN
을 이용하여 ANIMAL_INS
테이블을 기준으로 ANIMAL_OUTS
테이블을 조합한다.ANIMAL_OUTS.ANIMAL_ID
와 ANIMAL_INS.ANIMAL_ID
가 같은 값만 가져온다.AS
키워드를 이용하여 별칭을 부여하여 사용하였다.WHERE OUTS.DATETIME IS NULL
OUTS.DATETIME
정보가 없는, 즉 NULL
인 값만 가져온다.ORDER BY INS.DATETIME
LIMIT 3
INS.DATETIME
값을 기준으로 오름차순으로 정렬한 뒤, 3
개만 가져온다.SELECT INS.NAME, INS.DATETIME
FROM ANIMAL_INS AS INS
LEFT JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE OUTS.DATETIME IS NULL
ORDER BY INS.DATETIME
LIMIT 3
ANIMAL_INS
: 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
: 동물 보호소에 입양 보낸 동물의 정보를 담은 테이블ANIMAL_ID
: 동물의 아이디ANIMAL_TYPE
: 생물 종DATETIME
ANIMAL_INS
→ 보호 시작일ANIMAL_OUTS
→ 입양일INTAKE_CONDITION
: 보호 시작 시 상태NAME
: 이름ANIMAL_INS
→ SEX_UPON_INTAKE
ANIMAL_OUTS
→ SEX_UPON_OUTCOME
ANIMAL_OUTS
테이블의ANIMAL_ID
는ANIMAL_INS
의ANIMAL_ID
의 외래 키이다.
보호소에서 중성화 수술을 거친 동물 정보를 알아보려고 한다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성하라.
- 중성화를 거치지 않은 동물은
Intact
, 중성화를 거친 동물은Spayed
또는Neutered
라고 표시되어 있다.
ANIMAL_OUTS
, ANIMAL_INS
테이블에 모두 있는 데이터를 가져와야 하므로 INNER JOIN
을 사용한다.ANIMAL_OUTS
의 ANIMAL_ID
와 ANIMAL_INS
의 ANIMAL_ID
가 같은 것을 기준으로 JOIN 해야한다.ANIMAL_INS.SEX_UPON_INTAKE
값은 'Intact'
를 포함해야 하고, ANIMAL_OUTS.SEX_UPON_OUTCOME
값은 Spayed
또는 Neutered
를 포함해야 한다.ANIMAL_ID
순으로 조회해야 한다.SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
ANIMAL_ID
와 ANIMAL_TYPE
, NAME
필드값을 조회한다.FROM ANIMAL_INS AS INS
JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
INNER JOIN
을 이용하여 ANIMAL_INS
, ANIMAL_OUTS
테이블의 공통 부분을 가져온다.OUTS.ANIMAL_ID
와 INS.ANIMAL_ID
가 같은 값만 가져온다.WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND (SEX_UPON_OUTCOME LIKE "Spayed%"
OR SEX_UPON_OUTCOME LIKE "Neutered%")
ANIMAL_INS.SEX_UPON_INTAKE
값이 "Intact"
를 포함하고,ANIMAL_OUTS.SEX_UPON_OUTCOME
값이 "Spayed"
또는 "Neutered"
를 포함하는 값만 가져온다.NOT LIKE
이용WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND SEX_UPON_OUTCOME NOT LIKE "%Intact%"
NOT LIKE
을 이용하여 SEX_UPON_OUTCOME
이 "Intact"
를 포함하지 않을 경우에만 가져오면 된다.WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND SEX_UPON_INTAKE != SEX_UPON_OUTCOME
SEX_UPON_INTAKE
와 SEX_UPON_OUTCOME
의 값이 달라지므로 값이 다른 경우에만 가져오면 된다.ORDER BY INS.ANIMAL_ID
ANIMAL_ID
필드값을 기준으로 오름차순으로 정렬한다.SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME
FROM ANIMAL_INS AS INS
JOIN ANIMAL_OUTS AS OUTS
ON INS.ANIMAL_ID = OUTS.ANIMAL_ID
WHERE SEX_UPON_INTAKE LIKE "%Intact%"
AND SEX_UPON_INTAKE != SEX_UPON_OUTCOME
ORDER BY INS.ANIMAL_ID