Programmers: MySQL Lv. 1

김소정·2022년 7월 21일
0

Problem Solving (SQL)

목록 보기
1/6

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


#1 모든 레코드 조회하기

동물 보호소에 들어온 모든 동물의 정보를 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

풀이

SELECT * FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

*은 모든 열을 확인할 수 있도록 해주고, ORDER BY는 뒤에 오는 열을 기준으로 정렬을 도와준다. 오름차순 ASC와 내림차순DESC 정렬이 가능한데, 기본값은 ASC이다.


#2 최댓값 구하기

가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

가장 늦게 들어온 동물은 Anna이고, Anna는 2013-11-18 17:03:00에 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

풀이

SELECT MAX(DATETIME) FROM ANIMAL_INS;

답은 매우 간단하다. ANIMAL_INS 테이블에서 DATETIME(보호 시작일)이 가장 큰 값을 출력하도록 MAX 함수를 적용해주면 된다.


#3 이름이 없는 동물의 아이디

동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

이름이 없는 채로 들어온 동물의 ID는 A368930입니다. 따라서 SQL을 실행하면 다음과 같이 출력되어야 합니다.

풀이

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID;

예시에서 알 수 있듯이, 이름이 없는 채로 들어온 동물은 NAMENULL 값이 할당되어 있다. 따라서 WHERE 절을 이용해 NAMENULL인 동물들만 조회하도록 조건을 주면 된다.

또한 ORDER BY를 이용해 ID로 오름차순 정렬을 해준다. (사실 이 문제의 경우 조회되는 값이 하나뿐이라 정렬이 필요없지만, 문제에서 요구했으므로 작성해주는 게 좋다.)


#4 역순 정렬하기

동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

풀이

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

2개 이상의 열을 조회하고 싶을 때는 ,을 이용해 연결해주면 된다. 또한 문제에서 ID를 역순으로 보여달라고 했으므로 ORDER BY 구문에 DESC를 붙여 내림차순으로 정렬해주었다.


#5 이름이 있는 동물의 아이디

동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

이름이 있는 동물의 ID는 A524634와 A465637입니다. 따라서 SQL을 실행하면 다음과 같이 출력되어야 합니다.

풀이

SELECT ANIMAL_ID FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;

#3 이름이 없는 동물의 아이디 문제와 유사한데, 다른 점은 이름이 있는 동물의 아이디를 조회한다는 것이다. 따라서 이름이 없는 동물을 조회할 때는 NAMENULL 값이라는 조건을 준 반면에, 해당 문제에서는 NAMENULL 값이 아니라는 조건을 주면 된다.

따라서 IS NOT NULL라는 부정 연산자를 이용해 SQL 문을 작성하였다.


#6 아픈 동물 찾기

동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

이 중 아픈 동물은 Miller와 Cherokee입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

풀이

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'SICK'
ORDER BY ANIMAL_ID;

아픈 동물을 찾기 위해서는 INTAKE_CONDITIONSICK인 동물을 조회하면 된다. 따라서 해당 조건에 부합하는 데이터만 조회하기 위해 WHERE 절에 INTAKE_CONDITION = 'SICK'라는 조건을 설정했다.


#7 어린 동물 찾기

동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

이 중 젊은 동물은 Diablo, Miller, Cherokee입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

풀이

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION NOT IN ('Aged')
ORDER BY ANIMAL_ID;

해당 문제는 어린 동물의 아이디와 이름을 조회하는 쿼리문을 작성하는 것을 요구한다. ANIMAL_INS 테이블에서 어린 동물을 찾기 위해서는 INTAKE_CONDITIONAGED인 동물을 제외하고 조회하면 된다.

따라서 WHERE 조건절에 사용할 수 있는 부정 연산자 !=를 이용하여 AGED가 아닌 동물들만 조회하도록 쿼리문을 작성하였다.

SELECT ANIMAL_ID, NAME FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID;

또한 !=를 사용하지 않고도, NOT IN 구문을 이용하여 위와 같이 쿼리문을 작성할 수 있다. 해당 문제와 달리 하나의 조건이 주어지지 않고 여러 조건이 주어졌을 때는 IN 또는 NOT IN 구문을 사용하는 것이 직관적이고 간편하다.


#8 동물의 아이디와 이름

동물 보호소에 들어온 모든 동물의 아이디와 이름을 ANIMAL_ID순으로 조회하는 SQL문을 작성해주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

풀이

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

#4 역순 정렬하기 문제에서 언급했던 것과 마찬가지로, 2개 이상의 열을 조회하고 싶을 때는 ,을 이용해 연결해주면 된다.


#9 여러 기준으로 정렬하기

동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

  1. 이름을 사전 순으로 정렬하면 다음과 같으며, 'Jewel', 'Raven', 'Sugar'
  2. 'Raven'이라는 이름을 가진 개와 고양이가 있으므로, 이 중에서는 보호를 나중에 시작한 개를 먼저 조회합니다.

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

풀이

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC;

두개 이상의 기준으로 다중정렬을 하고 싶을 때는, ORDER BY 구문을 작성할 때 우선순위부터 순서대로 나열해주어야 한다.

오름차순 정렬은 기본값이기 때문에 ASC을 따로 작성해주지 않아도 되지만, 내림차순 정렬이 필요할 때는 열 이름 뒤에 DESC을 붙여주어야 한다.

따라서 위 쿼리문은 NAME을 기준으로 오름차순 정렬을 한 뒤, 이름이 같은 동물이 2마리 이상 있을 때는 DATETIME을 기준으로 내림차순 정렬한다.


#10 상위 n개 레코드

동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

이 중 가장 보호소에 먼저 들어온 동물은 Jack입니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

풀이

SELECT NAME FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

보호소에 가장 먼저 들어온 동물의 이름을 조회하기 위해서는 보호 시작일인 DATETIME을 기준으로 오름차순 정렬을 해준 뒤, 상위 1개 데이터의 NAME을 조회해야 한다.

따라서 ORDER BY를 이용해 보호 시작일을 기준으로 정렬을 해준 뒤, LIMIT를 이용해 상위 1개의 데이터를 선택해 주었다.


Reference

https://school.programmers.co.kr/learn/challenges

profile
Yonsei University, Applied Statistics

0개의 댓글