본문 바로가기

SQL - Mysql & Oracle/SQL 실전 코딩 테스트

[SQL] 프로그래머스 - 보호소에서 중성화한 동물(inner join 기출)

반응형

 

 

1. 문제의 출처 - 프로그래머스

 

오늘은 프로그래머스 SQL 고득점키트 중 "join"에 대해서 풀어볼 것이다.

 

Join문제에는 4개가 있는데 그중에서 "보호소에서 중성화한 동물" 문제에 대한 해설을 해보고자 한다. 

 

여기서 문제의 핵심은 Join을 활용하여 상태값이 어떻게 다른지 비교할 수 있는 것이 핵심이다. 

 

문제 URL 

 

코딩테스트 연습 - 보호소에서 중성화한 동물

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr


 

2. 문제의 설명 및 핵심 요약

 

문제의 요구사항은 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 "ID", "Type", 그리고 "Name"을 제시하는 것이다. 

 

이때 성별 Data의 제시사항을 잘 파악하는 것이 매우 중요한 문제이다. 

  • 중성화를 거치지 않은 동물 - "inact" 키워드 포함
  • 중성화를 거친 동물 - Spayed 또는 Neutered 키워드 포함

 

 

Table은 2개이며, 그 둘의 관계 및 문제의 숨은 조건을 정리해봤다. 

 

그림에서 보는 바와 같이, Join 문제에서는 항상 중요한 사항이 3가지 있다.

  • 첫 번째. 어떤 Column을 기준으로 Join을 할 것인가
  • 두 번째. Join 중에서도 어떤 방식을 채택할 것인가 - 여기서는 Inner Join
  • 세 번째. 결과를 솎아 내기 위한 기준은 무엇인가 - Where문의 활용

 

반응형

3. 정답 코드 및 해설

 

1
2
3
4
5
6
7
8
9
## 기초 문제 풀이
SELECT ao.animal_id
    , ao.animal_type
    , ao.name
FROM animal_outs AS ao
INNER JOiN animal_ins AS ai  on ai.animal_id = ao.animal_id
WHERE 1 = 1
    and ai.sex_upon_intake LIKE 'Intact%'
    and ao.sex_upon_outcome NOT LIKE 'Intact%'
cs

 

(1) Inner Join의 개념 및 해설

  • Inner Join은 수학으로 치면 교집합의 개념이다.
    • 여기서는 두 테이블 모두 존재해야 하기 때문에 Inner Join의 L7ogic이 가장 적절하다
  • Inner Join의 작성 문법
    • Inner Join [원하는 테이블 이름] AS [테이블 별칭] ON [원하는 조건]
      • 참고로 as는 생략이 가능하다. 
    • 두 테이블의 Join Key 값은 그림에 나와있듯, [animal_id]가 되야 한다. 

위의 논리만 차근차근 따라가다보면 Join문을 이해하는데는 큰 어려움이 없을 것이다. 

 

 

(2) 조건문의 활용 - LIKE를 통한 상태값 조회

  • LIKE의 기본 개념 및 활용 방법
    • LIKE는 String 중에서 특정 문자를 포함하는가 아닌가를 판단하는 조건
    • "%"는 순서에 따라 굉장히 유용한 방법
      • "% 원하는 문자":  원하는 문자로 끝나는 String 검색
        예시) "%찌개" → 김치찌개, 된장찌개

      • "원하는 문자 %" : 원하는 문자로 시작하는 String 검색
        예시) "김치%" → 김치라면, 김치덮밥, 김치주세요

      • "% 원하는 문자 %": 원하는 문자를 포함하는 String 검색
        예시) "%와우%" → 와우할사람, 나는 호드때문에 와우 한다, 하하호호 와우 호호

 

  • 정답의 해설
    • ai.sex_upon_intake LIKE 'Intact%'
      : 들어올 때는 중성화가 안 되어있어야 하기 때문에 
    • ao.sex_upon_outcome NOT LIKE 'Intact%'
      : 나갈 때는 중성화가 되어있어야 했기 때문에 

 

물론 뒤에 LIKE 문을 다르게 처리할 수도 있지만, 가장 논리적이고 정확한 방법을 사용하려고 했다. 

반응형