SQL 심화...

날짜, 시간

  • DATE : 년-월-일
  • TIME :시간:분:초
  • DATETIME : 년-월-일 시간:분:초
  • TIMESTAMP 년-월-일 시간:분:초 UTC

UTC : 시간대(타임존)

문자날짜

  • 'YYYY-MM-DD' 의 형식이라면
    • DATE(컬럼)
  • 그 외의 형식이라면
    • PARSE_DATE(날짜형태, 컬럼명)

      예시 : 20210912
      
      →PARSE_DATE('%Y%m%d','20210912)
      
      [날짜 PARSE_DATE표시법](https://www.notion.so/a241847fdee74c7aa71a2defbbfc8ce7)

      날짜에서 정보 뽑기

    • EXTRACT (정보 FROM 컬럼)
      - YEAR
      - MONTH
      - DAY
      - DAYOFWEEK —(1~7, 일요일~토요일)
      - WEEK (0~53, 일요일 시작)
      - WEEK(MONDAY) (0~53, 월요일 시작, MONDAY를 바꿔서 다른요일로 설정 가능)
      - QUARTER

      날짜 연산하기

    • 더하기 : DATE_ADD(컬럼, INTERVAL 기간)

    • 빼기 : DATE_SUB(컬럼, INTERVAL 기간)

      ```sql
      DATE_ADD(컬럼, INTERVAL 5 day)
      DATE_ADD(컬럼, INTERVAL 1 month)
      DATE_ADD(컬럼, INTERVAL 2 week)
      DATE_ADD(컬럼, INTERVAL 5 quater)
      DATE_ADD(컬럼, INTERVAL 1 year)
      ```

      날짜 차이 구하기

    • DATE_DIFF(컬럼1, 컬럼2, 단위)

      • 컬럼1이 더 최근이어야함 (컬럼1 - 컬럼2)
      • 단위 (YEAR,MONTH,DAY...)

CASE WHEN

  • 엑셀의 IF와 비슷함...
CASE WHEN 조건1 THEN 결과1
		WHEN 조건2 THEN 결과2
...
		WHEN 조건N THEN 결과N ELSE 만약아무것도아니라면 END
CASE WHEN 조건1 THEN 0_결과1
		WHEN 조건2 THEN 1_결과2
...
		WHEN 조건N THEN N_결과N ELSE 만약아무것도아니라면 END

SUB QUERY

쿼리 속의 쿼리

  • 가장 최근 주문일 데이터를 뽑는 쿼리
    1. 가장 최근 주문일을 구하기
    2. 가장 최근 주문일에 해당하는 데이터 필터링 하기
SELECT MAX(order_date) AS max_order_date
FROM 오더데이터
---가장 최근 주문일자를 구함 sub query

SELECT *
FROM 오더데이터
WHERE order_date = (SELECT MAX(order_date) AS max_order_date FROM 오더데이터)
  • 구매 경험이 있는 고객 리스트만 구하고 싶을때
    1. 주문 테이블에 있는 고객 리스트 구하기
    2. 유저테이블에서 주문 테이블에 있는 고객 필터링하기
SELECT customer_id
FROM 오더데이터
--- 오더 데이터에서 고객id를 구함 

SELECT *
FROM 고객데이터
WHERE customer_id IN (SELECT customer_id FROM 오더데이터)
  • 특정 지역의 일평균 판매량
    1. 지역 별 일별 판매량 구하기

    2. 지역 별 일별 판매량 평균 구하기

      SELECT U.지역, O.주문일, SUM(판매량) AS 일별판매량
      FROM 오더데이터 O
      LEFT JOIN 고객데이터 U
      ON O.custmer_id = U.customer_id
      GROUP BY U.지역,O.주문일
      --- 지역 별 일별 판매량
      
      SELECT state, AVG(일별판매량) AS 평균판매량
      	**FROM**(
      		****SELECT U.지역, O.주문일, SUM(판매량) AS 일별판매량
      		FROM 오더데이터 O
      		LEFT JOIN 고객데이터 U
      		ON O.custmer_id = U.customer_id
      		GROUP BY U.지역,O.주문일
      **)**
      GROUP BY 지역

      WITH

      써브쿼리에 이름을 붙여 임시테이블로 만들어 준다고 생각하면 편함

      WITH 임시테이블이름 AS 
      (
      서브쿼리
      )
      
      SELECT *
      FROM 임시테이블 ......

      WITH vs SUBQUERY

      Subquery 결과가 값이나 컬럼 한개일 때 → 그대로

      Subquery 가 길어지고 복잡해지면 → WITH

      한 Query 에서 같은 Subquery가 여러번 반복되면 → WITH

      → subquery도 query이기 때문에 많이 반복하면 연산이 많아 성능 저하가 올 수 있음...

조금 더 생각해보기...

에러 메시지 ??!?

  • 컴퓨터는 잘못이 없어용
  • 구글에게 물어보세용

공식 문서를 보는법, 스택오버플로우를 보는법 등을 알려주셨다.... 정말 초보를 위한 강의구나 !

좋은 웹페이지 즐겨찾기