💻 프로그래머스 SQL : 어린 동물 찾기
상단에 회고를 적는 건 처음이지만, 문제를 꼼꼼히 읽지 않은 실수가 있었다. '이 때 결과는 아이디 순으로 조회해주세요' 이 부분을 까마득하게 잊고 ORDER BY ..와 ASC를 사용하지않아 뒤늦게 다시 추가했다. 매번 문제를 제대로 안읽는 등의 같은 실수를 반복해서 어떻게 해야할지 살짝 걱정스럽다.
ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS
테이블 구조는 다음과 같으며, ANIMAL_ID
, ANIMAL_TYPE
, DATETIME
, INTAKE_CONDITION
, NAME
, SEX_UPON_INTAKE
는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
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 |
동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.
눈에 보이는대로, 동물의 아이디와 이름을 볼 수 있도록 SELECT에 입력하고
FROM에는 테이블명을, WHERE에는 NOT을 사용하면 직관적일 것이라는 생각을 했다.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NOT INTAKE_CONDITION = 'Aged'
첫번째 시도로 채점을 해도 정답이다. 하지만 문제에서 요구한 항목이 모두 이루어지지 않았다. 아이디순으로 조회를 해야한다는 것이다. 그래서 ORDER BY ANIMAL_ID ASC 를 추가했다.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NOT INTAKE_CONDITION = 'Aged'
ORDER BY ANIMAL_ID ASC
두번째 시도의 코드를 실행하고 실행결과를 보면 동물 아이디가 작은 순부터 차례대로 출력되는 것을 확인할 수 있다.
내가 사용한 방법도 정답이지만, NOT을 사용하지 않고 만들 수 있는 방법이 몇가지 더 있어서 남겨보려고 한다.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION NOT IN ('Aged')
ORDER BY ANIMAL_ID ASC
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID ASC
조건을 하나만 명시할 경우에는 !=를 사용한다는 의견이 있었다.
조건이 여러개일 경우에는 OR을 사용하는데 OR의 비교가 선형적이라 조건이 많아질수록 효율이 떨어지기 때문에 조건이 많을 때에는 IN을 사용한다고 한다. IN에 명시한 값들을 정렬하고 이진 탐색으로 값을 찾기 때문에 효율이 좋다고 한다. 또한, 가독성 측면에서도 IN을 사용하는게 나으면서도 IN 내부에 서브 쿼리를 작성할 수 있다는 장점도 있다고 한다.
아직 무슨 말인지 100% 이해는 안되지만 기억해두면 좋은 정보인 것 같아 적어두었다.
조금 천천히 풀더라도 확실하게 이해하는 편이 좋은 것 같다.