일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 정리
- Docker
- http
- 컴퓨터 네트워크
- airflow
- linux
- 데이터 엔지니어링
- TCP
- 운영체제
- 데이터베이스
- dockerfile
- S3
- 종류
- HADOOP
- 데이터엔지니어링
- 파이썬
- Django
- sql
- Go
- 자료구조
- redshift
- 데이터 웨어하우스
- PYTHON
- TIL
- 가상환경
- AWS
- 데이터 파이프라인
- 데브코스
- 컴퓨터네트워크
- airflow.cfg
- Today
- Total
홍카나의 공부방
SQL 연습 - 프로그래머스 SQL 문제풀이 (1) 본문
(1) 3월에 태어난 여성 회원 목록 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/131120
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
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
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
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
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;
'Data Engineering > Database' 카테고리의 다른 글
[SQL] NULL 처리법 (0) | 2023.06.14 |
---|---|
SELECT 문의 실행 순서 (0) | 2023.06.12 |
[SQL] MySQL : 연월일 중 월을 표현하고 싶을 때 (DATE_FORMAT) (0) | 2023.05.28 |
[데이터베이스] 정규화, 함수 종속 관계, 정규형 (0) | 2023.05.27 |
[데이터베이스] 트랜잭션 - 장애와 회복, 로그 회복 기법 (0) | 2023.05.26 |