문제 풀면서 느낀점들, 알게 된 것들, 나중에 리마인드하면 좋은 것들을 기록해두고자 한다
제가 보려고 적는 거라서 편하게 적어보겠습니다
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가 됨
'SQL > 코테' 카테고리의 다른 글
| [프로그래머스] SQL lv4 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.01.08 |
|---|