DataBase

[MySQL/MSSQL] 프로그래머스 SQL문제 풀이#1

코북 2022. 3. 2. 15:27

 

 안녕하세요 코북입니다. 오늘은 프로그래머스에서 SQL 기본 문제들을 풀어봤습니다. 쉬운 문제라도 실제로 생각하고 적으면서 풀어보는 것과 눈으로만 보는 것은 큰 차이가 있는 것 같습니다. 오랜만에 문제 풀면서 재밌고 유익한 시간이었습니다. 너무 쉬운 문제들은 가져오지 않았고, ★이 있는 문제들은 틀렸거나 놓친 부분이 있는 문제들이었습니다. 

 

1. SELECT

 

1-1. ★ 어린 동물 찾기, NOT IN 

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

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


1-2. 여러 기준으로 정렬하기

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

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


1-3. 상위 N개 레코드, LIMIT

 

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

 

MySQL

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

MSSQL

SELECT top 1 NAME
FROM ANIMAL_INS
ORDER BY DATETIME

 

2. SUM, MAX, MIN

 

2-1. ★ 최댓값 구하기, MAX

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

SELECT MAX(DATETIME) AS '시간'
FROM ANIMAL_INS


2-2. 최솟값 구하기, MIN 

동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

SELECT MIN(DATETIME) AS '시간'
FROM ANIMAL_INS


2-3. 중복 제거하기, DISTINCT


동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.

SELECT COUNT(DISTINCT NAME) AS 'count'
FROM ANIMAL_INS
WHERE NAME IS NOT NULL

 

3. GROUP BY

 

3-1. ★ 고양이와 개는 몇 마리 있을까

동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.

SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS 'count'
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN ('Cat','DoG')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

놓친 점 : IN을 사용하지 않고 풀었습니다. 문제를 꼼꼼하게 봐야겠습니다..


3-2. 동명 동물 수 찾기

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT >= 2
ORDER BY NAME


3-3. 입양 시각 구하기(1)

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

SELECT HOUR(DATETIME) AS HOUR, COUNT(HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR < 20
ORDER BY HOUR
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(HOUR(DATETIME)) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 
AND HOUR(DATETIME) < 20
GROUP BY HOUR
ORDER BY HOUR


3-4. ★★ 입양 시각 구하기(2), 재귀

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

WITH RECURSIVE TEMP_TABLE AS(
SELECT 0 AS H
UNION ALL
SELECT H+1 
FROM TEMP_TABLE 
WHERE H<23)

SELECT H, COUNT(ANIMAL_ID)
FROM TEMP_TABLE 
    LEFT JOIN ANIMAL_OUTS
    ON HOUR(DATETIME) = TEMP_TABLE.H
GROUP BY H
ORDER BY H