본문 바로가기
  • 공부 기록 인생 기록
SQL/코테

프로그래머스 SQL Lv 3. ~ 5 정주행

by 티권 2024. 1. 2.

문제 풀면서 느낀점들, 알게 된 것들, 나중에 리마인드하면 좋은 것들을 기록해두고자 한다

제가 보려고 적는 거라서 편하게 적어보겠습니다

 

DATEDIFF(END, START)
datediff(단위,시작,끝)
+1 해줘야되는 경우 있음

DATE_FORMAT(날짜, '%Y-%m-%d')

2022년 9월 데이터를 찾는다면?
year(date) , month(date) 하지말고
date like '2022-09%' 
아니면
SUBSTR(ING)(DATE,1,7) = '2022-09'

group 전 조건은 where
group 후 조건은 having

A테이블에서 B테이블에 없는 애들 추출
A 기준으로 left조인 후, B테이블의 컬럼 값이 null인 거 찾으면 됨

테이블 합치기는 무조건 JOIN? no. 
union 쓸 때도 있음. 
union, union all(빠른 처리, 중복 제거 X, 권장)
UNION 된 거에 WHERE 적용 안됨
각각 WHERE 적용해서 UNION해야됨

COUNT(*) - NULL 여부 관계 없이 검색된 행 수의 카운트
COUNT(열이름) - NULL 제외하고 카운트. 속도 느림

ORDER BY
SELECT로 조회하는 컬럼이 아니어도 가져온 테이블 내에 존재하는 컬럼이면, 그 컬럼을 기준으로 정렬 가능

BETWEEN A AND B : A이상 B이하

NULLIF, IFNULL, COALESCE

문자열 합치기 함수 CONCAT

SUBSTR(문자,시작위치,얼마나자를건지)

SELECT 에서 알리아스로 불러온 칼럼
알리아스로 SELECT에서 바로 연산하는 거 안됨

CASE
WHEN 조건 TEHN 값
END AS ..
이거 말고
IF(조건,참값,거짓값) 으로 할 수 있음

두가지 컬럼으로 그룹바이하는 경우도 생각

일단 문제를 완벽히 이해
- 실제 데이터 예시를 보고 이해
- 조건 정확히 파악

NAME LIKE '%EL%' -> 대소문자 구분 없이 다 됨 el 포함된 거도 추출됨

name이 a,b,c인 거 추출해라! or로 길게 말고 in 쓰면 됨
name in ('a', 'b', 'c')

문제 : 가격대 별 상품 개수 구하기

문제 : 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
max 
- 문자열에도 사용 가능
- 가나다 순
- 같은 문자면 나중에 등록된 레코드 출력
이 문제에서는 대여중, 대여가능 두가지 문자열이 있는데 MAX하면 대여중이 나옴
CAR_ID에 대여중이 하나라도 존재하면 대여중이 나오게 하는 게 포인트
결국 이 포인트를 몰라서 못풀었던 것. 테이블과 문제를 보면서 확실히 문제가 요구하는 걸 파악해야함 

문제
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

8~10월에 총 대여횟수가 5회 이상인 CAR id를 추출하는 서브쿼리를 통해 조건 설정
하지만 이 조건은 CAR_ID만 추출하는 것이지 8~10월 데이터만 남도록 필터링 하는 것이 아님!
만약 CAR ID가 8~10월이 아닌 다른 월에도 존재할 수 있기 때문에 추가적으로 필터링을 해줘야함

데이터 타입 바꾸기
CAST(expression AS data_type)
or
::

날짜 크기 비교할 때는 따옴표 꼭 붙여줘야함
DATE_FORMAT(OUT_DATE,'%Y-%m-%d') <= '2022-05-01'

GROUP BY 후
HAVING에 조건을 준다는 건
그룹화 하여 컬럼을 SELECT 한 결과물에 조건을 준다는 의미. 따라서 SELECT하지 않은 컬럼에 대해 HAVING에 조건을 준다면 오류 발생. 

문제 즐겨찾기가 가장 많은 식당 정보 출력하기

group by를 하면 집계함수 결과는 결과대로 나오고, 집계함수도 아니고 group by의 기준도 아닌 컬럼이 select문에 존재한다면 그냥 가장 상단에 있는 데이터들을 임의로 가져옴

join 하고 on으로 기준을 잡을 때 두가지 기준을 사용할 수 있음. 이럴 땐 그냥 on ~~~ and ~~~ 로 작성하면 됨.

쿼리 실행 순서
https://monawa.tistory.com/125

특정 지표를 기준으로 정렬하고 싶을 때
SELECT에 없어도 ORDER BY문에 지표를 정의해서 활용하면 됨.

HAVING에는 GROUP BY에 쓰인 컬럼 혹은, 집계함수만 쓸 수 있다.
https://www.codeit.kr/community/questions/UXVlc3Rpb246NjI4OWM0ZWU5ZmNmMDYzMTdlMjU0NTAz

입양 시각 구하기(2)
with recursive 구문
https://velog.io/@cyanred9/SQL-Recursive
변수
https://jaaamj.tistory.com/155

조인 하고 ON 까먹지 말기
총매출 구할 땐 상품별로 그룹바이 한 후
SUM(PRICE*AMOUNT)

COUNT() 할 때 DISTINCT 처리 하고 COUNT할지 고민해보기

3개 테이블 INNER JOIN
FROM A JOIN B ON A. = B.  JOIN C ON A. = C.
여기서 두번쨰 ON에서 A랑 C를 비교해도 되고 B랑 C를 비교해도됨. INNER JOIN 이니까
3개 이상 테이블 JOIN 할 때는 ON에 넣어줄 테이블만 잘 적어주면 됨

그룹별 조건에 맞는 식당 목록 출력하기
LIMIT 1 말고 3인 애들 세개 다 해야되는 거 아닌가?

프로시져

IS DISTINCT FROM
null = null 도 true가 됨