홍카나의 공부방

SQL 연습 - 프로그래머스 SQL 문제풀이 (1) 본문

Data Engineering/Database

SQL 연습 - 프로그래머스 SQL 문제풀이 (1)

홍문관카페나무 2023. 6. 12. 21:25

(1) 3월에 태어난 여성 회원 목록 출력하기

https://school.programmers.co.kr/learn/courses/30/lessons/131120

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

LV.2의 SQL문제다.

문제 조건에 요구하는 것이 많으므로 꼼꼼하게 읽어봐야한다.

또한 조건문에서 NULL을 비교할 때는 IS NULL 또는 IS NOT NULL을 사용해야 함을 인지하자.

( != 혹은 = 등으로 수행하지 말것)

또한 DATE_FORMAT 함수에 익숙해져서 DATE 자료형이 나올 때 당황하지 않도록 하자.

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, '%Y-%m-%d')
FROM MEMBER_PROFILE
WHERE MONTH(DATE_OF_BIRTH) = 3 AND TLNO IS NOT NULL AND GENDER = 'W';

 


 

(2) 재구매가 일어난 상품과 회원 리스트 구하기

https://school.programmers.co.kr/learn/courses/30/lessons/131536

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

Lv.2의 SQL문제다.

문제 예시를 보면 GROUP BY를 이용해야 한다.

그리고 USER_ID와 PRODUCT_ID를 그룹으로 묶어 COUNT를 사용하면 재구매가 발생했는지 여부를 확인할 수 있다.

이때, COUNT(1) > 1의 조건은 WHERE이 아닌, HAVING으로 걸어줘야 한다.

그롭화 되기 이전에 조건을 체킹하는 것이 아니라, 그룹화 이후 조건을 체크하는 것이기 때문이다.

 

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(1) > 1
ORDER BY USER_ID ASC, PRODUCT_ID DESC;

 


(3) 조건에 부합하는 중고거래 댓글 조회하기

https://school.programmers.co.kr/learn/courses/30/lessons/164673

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Lv.1의 JOIN 문제다.

SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, '%Y-%m-%d') as 'CREATED_DATE'
FROM USED_GOODS_BOARD B
INNER JOIN USED_GOODS_REPLY R ON B.BOARD_ID = R.BOARD_ID
WHERE YEAR(B.CREATED_DATE) = '2022' AND MONTH(B.CREATED_DATE) = '10'
ORDER BY CREATED_DATE ASC, B.TITLE ASC;

 


(4) 있었는데요 없었습니다

https://school.programmers.co.kr/learn/courses/30/lessons/59043

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Lv.3의 JOIN 문제다.

문제의 조건을 보니 INNER JOIN을 쓰면 된다.

아니 보니까 위의 레벨1짜리 JOIN이랑 그렇게 난이도가 dramatic하게 차이나지도 않는데 왜 이거는 레벨3인가..?

결과를 보호 시작일이 빠른 순으로 조회해야 한다는 것을 유념해야 한다.

 

SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A
JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE A.DATETIME > B.DATETIME
ORDER BY A.DATETIME;

 


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

https://school.programmers.co.kr/learn/courses/30/lessons/59044

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

Lv.3의 JOIN 문제다.

교집합을 제외한 LEFT JOIN을 구하는 것이 핵심이다.

그래도 JOIN을 한 번만 하는 쿼리는 익숙해지면 쉽게 풀수 있다. 많이 풀어보자.

JOIN은 머릿속에서 테이블을 상상하면서 풀면 도움이 된다.

문제 조건에 따라 동물 3마리만 추려내는 것에 유의한다.

 

SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A
LEFT JOIN ANIMAL_OUTS B ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME
LIMIT 3;

 

반응형