[Programmers] SQL 고득점 Kit
CODE/SQL

[Programmers] SQL 고득점 Kit

728x90
해당 글은 프로그래머스 SQL 고득점 Kit를 바탕으로 작성됐음을 밝힙니다.
코딩테스트 연습 | 프로그래머스 (programmers.co.kr) - https://programmers.co.kr/learn/challenges

풀이 현황

SQL 고득점 Kit에는 SELECT, AGGREGATE(SUM, MAX, MIN), GROUP BY, IS NULL, JOIN, String, Date와 관련된 문제들로 구성되어 있습니다. 오늘은 각 주제에서 Level2까지의 SQL 문제들을 풀어보는 것을 목표로 잡았습니다. 다음주에 Level3, Level4 문제를 풀어볼 계획입니다. 

SELECT

# 문제명: 모듬 레코드 조회하기
# 모든 레코드 조회
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

# 문제명: 역순 정렬하기
# 역순(내림차순) 정렬
SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

# 문제명: 아픈 동물 찾기
# 특정 문자열을 가지는 컬럼 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"
ORDER BY ANIMAL_ID

# 문제명: 어린 동물 찾기
# 특정 문자열을 가지지 않는 컬럼 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION <> "Aged"

# 문제명: 동물의 아이디와 이름
# 오름차순 정렬
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

# 문제명: 여러 기준으로 정렬하기
# 다중 정렬 조건
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME ASC, DATETIME DESC

# 문제명: 상위 n개 레코드
# 정렬 후 순서에 따른 레코드 읽어오기
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

 

SUM, MAX, MIN

# 문제명: 최댓값 구하기
# MAX를 사용한 최댓값
SELECT MAX(DATETIME) AS '시간'
FROM ANIMAL_INS

# LIMIT, ORDER BY 사용한 최댓값
SELECT DATETIME AS 시간
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1

# 문제명: 최솟값 구하기
# MIN을 사용한 최솟값
SELECT MIN(DATETIME) As 시간 
FROM ANIMAL_INS

# LIMIT, ORDER BY 사용한 최솟값
SELECT DATETIME As 시간 
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

# 문제명: 동물 수 구하기
SELECT COUNT(*) AS count
FROM ANIMAL_INS

# 문제명: 중복 제거하기
SELECT COUNT(DISTINCT NAME) AS 'count' # DISTINCT에 WHERE IS NOT NULL 기능 포함
FROM ANIMAL_INS

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

프로그래머스에는 자주 쓰이는 SUM, MAX, MIN과 관련된 문제만 나왔지만, SQL 집계함수(aggregate function)에는 COUNT, SUM, MAX, MIN, AVG, ROUND, STDDEV, VARIANT 등 더 많은 집계 함수가 존재합니다. 

 

IS NULL

# 문제명: 이름이 없는 동물의 아이디
# NULL 값 찾기
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID ASC

# 문제명: 이름이 있는 동물의 아이디
# NULL 아닌 값 찾기
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID ASC

# 문제명: NULL 처리하기
# NULL을 다른 값으로 대체하기
SELECT ANIMAL_TYPE, IFNULL(NAME, "No name"), SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

String, Date

# 문제명: 루시와 엘라 찾기
# 다중 문자열 찾기
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME = "Lucy" OR NAME = "Ella" OR NAME = "Pickle" OR NAME = "Rogan" OR NAME = "Sabrina" OR NAME = "Mitty"

# IN을 사용한 다중 문자열 찾기
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ("Lucy", "Ella", "Pickle", "Rogan", "Sabrina", "Mitty")

# 문제명: 이름에 el이 들어가는 동물 찾기
# 특정 문자열을 포함하는 컬럼 찾기
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE NAME LIKE '%el%' AND ANIMAL_TYPE = "Dog"
ORDER BY NAME

# 문제명: 중성화 여부 파악하기
# 조건에 따라 특정 문자열을 치환(대체)하기
SELECT  ANIMAL_ID, 
        NAME, 
        IF(SEX_UPON_INTAKE REGEXP 'Neutered|Spayed', 'O', 'X') AS '중성화'
FROM    ANIMAL_INS  
ORDER BY ANIMAL_ID

# 문제명: 오랜 기간 보호한 동물(2)
# 두개의 테이블을 JOIN 후, 특정값을 기준으로 ORDER BY하기
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME #, ANIMAL_OUTS.DATETIME
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로 형 변환
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') As '날짜'
FROM ANIMAL_INS 
ORDER BY ANIMAL_ID

 

GROUP BY

# 문제명: 고양이와 개는 몇 마리 있을까
# 특정 컬럼에 대한 집계함수 적용하기
SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE

# 문제명: 동명 동물 수 찾기
# HAVING과 GROUP BY 사용
SELECT NAME, COUNT(NAME) As COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME

# 문제명: 입양 시각 구하기(1)
# WHERE과 GROUP BY 사용
SELECT HOUR(DATETIME) As HOUR, COUNT(DATETIME) As COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME)

# 문제명: 입양 시각 구하기(2)
# LEVEL4 다음주에 도전..!

 

JOIN

# 문제명: 없어진 기록 찾기
# RIGHT JOIN 사용
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_INS
RIGHT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_OUTS.ANIMAL_ID

# 문제명: 있었는데요 없었습니다
# 문제명: 오랜 기간 보호한 동물(1)
# 문제명: 보호소에서 중성화한 동물
# 다음주에 모두모두 도전..!
728x90