데이터베이스

[프로그래머스] SQL Lv.1 요약

mygumi 2023. 5. 13. 20:20
반응형
이 글은 프로그래머스 코딩테스트 문제중 "SQL, Lv.1" 에 대한 내용이다.
문제에 대한 풀이가 아닌 팁들을 남기려고한다. (풀이는 아래 깃헙 링크를 참고)
문제 리스트 - https://school.programmers.co.kr/learn/challenges?order=recent&levels=1&page=1&languages=mysql 
풀이 코드 - https://github.com/hotehrud/acmicpc/tree/master/programmers/Lv.1

 

 

프로그래머스에서 제공하는 Lv.1 에 해당하는 SQL 문제를 풀어보았다. (MYSQL 기준)

쉬운 문제이더라도, 다른 사람의 풀이를 보면서 많은 팁들을 보게 된다.

그러한 내용들을 정리해보고자한다.

어떤 방식이 더 좋고 나쁘고를 말하고자 하는 것이 아니라는 것을 참고해주길 바란다.

 

년,월,일 각각의 기준으로 검색하기

SELECT
	BRITH_DATE
FROM USER
WHERE YEAR(BRITH_DATE) = '2021'
// WHERE MONTH(BRITH_DATE) = '12'
// WHERE DAY(BRITH_DATE) = '1'

 

NULL 유무에 따라 출력값 변경하기

SELECT
    CASE
        WHEN AGE is not null
        THEN AGE
        ELSE 'NONE'
    END
FROM USER

 

SELECT
    COALESCE(AGE, 'NONE')
FROM USER
SELECT
    IFNULL(AGE, 'NONE')
FROM USER

CASE, COALESCE, IFNULL 함수를 사용할 수 있다.

3가지 방식 모두 값이 존재하면 그대로 출력하고, NULL 이라면 "NONE" 출력한다.

 

최대값 조회하기

SELECT
    MAX(AGE) as MAX_AGE
FROM USER

 

COUNT 함수 응용

SELECT COUNT(*) as USERS
FROM USER
WHERE AGE IS null

SELECT COUNT(*) - COUNT(AGE) as USERS 
FROM USER

SELECT COUNT(IF(AGE IS NULL, USER_ID, NULL)) USERS
FROM USER;

AGE 가 존재하는 데이터 개수를 위와 같은 방식으로 조회할 수 있다.

 

날짜 구조 변환

SELECT
    DATE_FORMAT(START_DATE, '%Y-%m-%d') as START_DATE,
    DATE_FORMAT(END_DATE, '%Y-%m-%d') as END_DATE
FROM RENTAL_HISTORY

SELECT
    LEFT(START_DATE, 10) as START_DATE,
    LEFT(END_DATE, 10) as END_DATE
FROM RENTAL_HISTORY

DATE_FORMAT 을 활용할 수도 있고, LEFT 를 통해 문자열을 자를 수도 있다. ex) 2022-09-02 00:00:00

 

 

날짜 차이 구하기

SELECT
    CASE WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30
    THEN '장기 대여'
    ELSE '단기 대여'
    END
FROM RENTAL_HISTORY

2개의 날짜의 차이가 30일 이상이면 장기 대여, 그렇지 않으면 단기 대여로 출력할 수 있다.

 

날짜 범위 조회

SELECT
    END_DATE
FROM RENTAL_HISTORY
WHERE END_DATE BETWEEN '2022-10-01' AND '2022-10-31'

 

평균값 구한 후, 소수점 반올림하기

SELECT
    ROUND(AVG(DELAY_FEE))
FROM RENTAL_HISTORY
반응형