[SQL] 프로그래머스 SQL 고득점 kit (8)

이정진·2021년 10월 20일
0

SQL

목록 보기
8/23
post-thumbnail

루시와 엘라 찾기

SQL 구분 : IN

IN 연산자는 조회 조건의 범위를 지정하는 데 사용한다. 괄호 내에 콤마를 통해 구분한 여러 값들 중에서 하나 이상과 일치하면 조건에 맞는 것으로 간주하여 데이터를 조회할 수 있다.

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.

문제 풀이

동물의 이름이 위와 같은 것을 찾으면 되므로, = 연산자를 활용한 뒤, OR문으로 묶어서 풀어도 되나, IN문을 활용할 경우, 더욱 효과적이게 조건에 맞게 조회할 수 있다. 처음에 이름의 앞 뒤로 %를 써서 조회가 되지 않았었는데, 이유는 와일드 카드는 LIKE문에서만 활용이 가능하기 때문이다. 이런 부분을 조심해야 할 것 같다.

SQL

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy','Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')

이름에 el이 들어가는 동물 찾기

SQL 구분 : LIKE

LIKE 연산자는 입력된 값을 포함하는 데이터들이 존재할 경우, 해당 데이터를 조회할 수 있도록 하는 연산자이다.

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.

문제 풀이

동물 이름에 "EL"이 들어간다고 하였으므로, LIKE문에 와일드카드를 활용하여 WHERE LIKE "%EL%"로 작성하면 된다. 여기서 개의 아이디와 이름을 조회하라고 하였기에 LIKE 연산자와 함께 AND 연산자로 ANIMAL_TYPE = 'Dog'을 묶어서 조회하면 된다.

SQL

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%EL%'
ORDER BY NAME ASC

중성화 여부 파악하기

SQL 구분 : CASE WHEN

조건문으로 CASE WHEN 조건 THEN 이 조건이 참일 때 사용할 값 ELSE 이 조건이 거짓일 때 사용할 값과 같이 활용하며, 모든 CASE를 작성 완료하였을 경우 맨 마지막에 END를 활용하여 작성 완료 여부를 보여준다.

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다

보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.

문제 풀이

중성화되었을 경우, 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' OR 'Spayed'이므로, CASE WHEN 연산자를 사용하여 SEX_UPON_INTAKE 컬럼에서 LIKE 연산자로 'Neutered' 또는 'Spayed'가 있으면, O를 출력하도록 하였으며, 그 외의 경우에 대해서는 X를 출력하도록 작성하면 된다.

SQL

SELECT ANIMAL_ID, NAME, 
(CASE WHEN SEX_UPON_INTAKE LIKE '%Neutered%' THEN 'O' 
WHEN SEX_UPON_INTAKE LIKE '%Spayed%' THEN 'O'
ELSE 'X' END) AS '중성화'
FROM ANIMAL_INS

오랜 기간 보호한 동물(2)

SQL 구분 : JOIN, ORDER BY

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. ANIMAL_OUTS 테이블의 ANIMAL_ID는 ANIMAL_INS의 AN

입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.

문제 풀이

ANIMAL_INS와 ANIMAL_OUTS를 JOIN 시킨 뒤, 입양 보낼 때의 날짜에서 보호소에 들어온 날짜를 뺀 뒤, 내림차순 정렬 후 가장 상위 두 개만 출력되도록 LIMIT 2를 작성해주면 된다.

SQL

SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
ORDER BY ANIMAL_OUTS.DATETIME - ANIMAL_INS.DATETIME DESC
LIMIT 2

DATETIME에서 DATE로 형 변환

SQL 구분 : DATE_FORMAT

DATE_FORMAT은 DATE의 형식을 바꾸어서 출력이 가능하도록 하는 연산자로, 사용 방식은 DATE_FORMAT(DATE, 형식)과 같이 사용할 수 있습니다. 이 때 형식에서 사용될 수 있는 표현식은 %Y (4자리 연도), %y (2자리 연도), %m (월), %d (일), %H (24시간), %h (12시간), %i (분), %s (초) 등이 있습니다.

문제

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

ANIMAL_INS 테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.

문제 풀이

SQL 구분에 설명해놓았듯이 DATE_FORMAT을 적절히 사용하며 풀어주면 되는 문제이다.

SQL

SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME,'%Y-%m-%d') AS '날짜'
FROM ANIMAL_INS

0개의 댓글