220930 TIL SQL2

지구데이터·2022년 9월 30일
0
post-thumbnail

220930 금요일 TIL

데이터리안 유튜브

w3school

Hackerrank

리트코드

프로그래머스

<인프런 학습>

집계함수 : 데이터 요약하기

SELECT에서 대량의 데이터셋의 평균, 최솟값 같은 요약 통계를 구하는 함수

COUNT() : 컬럼명 넣은 경우, NULL 값 제외시킴
예외) count( *아스타 ) 같은 경우 모든 행의 갯수를 구하는 것이기 때문에, NULL값에 영향을 받지 않는다
DISTINCT 옵션 : 유일값 == 중복값 제외시킴 (셀렉트문에서 컬럼명 앞에 사용/함수 있다면 함수 안에)

SUM() : 숫자 데이터 가진 컬럼에
AVG() : NULL 값 제외시킴 제외시켜서 평균값 계산하게 됨
주의) NULL값 제외시키고 싶지 않을 때, 평균을 SUM(Visits)/COUNT(*) 이런 식으로 구해줄 수 있음

MIN() / MAX()

GROUP BY : 전체 데이터 그루핑 = 그룹별로 보기

  • 데이터를 쪼개서 보고 싶은데, 나눠서 보는 그 기준! = 그룹
  • 그룹을 하고 싶은 그룹 컬럼을 GROUP BY 예약어 뒤에 넣어주기
  • 출력 시 나와야 하니까, SELECT문에도 넣어줘야 함
  • 한 개가 아닌 여러 게 컬럼 그루핑 가능
  • MY SQL에서는 숫자로 그룹바이 컬럼 쓸 수 있음 (비추천)
  • 그룹바이 > 오더바이 순서 : 그룹핑한거에 ORDER BY 적용 가능
  • WHERE문 어떻게 결과물에서 적용하고 싶은 경우, HAVING으로 대체 (그룹 바이 뒤에)

CASE

WHEN ~ THEH ~ : 순서가 중요

CASE WHEN (조건1) THEN (조건1을 만족할 때에 넣고 싶은 값) WHEN (조건2) THEN (조건2를 만족할 때에 넣고 싶은 값) ELSE (위의 조건들에 모두 해당되지 않을 때) END

  • 조건 1개만 있어도 사용 가능 (기본값: CASE WHEN THEN END) -> 근데 그럴거면 if 쓸듯
    WHEN절을 여러 개 쓸 때, 추가되는 조건은 위에 먼저 적힌 조건에서 제외되는 것들 중에서이다 (not a triangle이면, 그 다음부터는 무조건 triangle)
    CASE WHEN ~(AND)~ THEN ... END AS ~ (, * )
  • 이 안에 논리 연산자도 쓸 수 있다

IF(조건, 참일 때, 거짓일 때)

IF(last_order_date >= '2020-12-01', 1, 0)

테이블 pivot

  • CASE문을 함수 안에 넣을 수도 있음

SELECT문에서 여러 개 출력할 때

SELECT SupplierID
	 , CategoryID
     , AVG(Price)

=> 요런 식으로 띄어쓰기 하는 거 추천함
AS : 별칭
SELECT 문에서 사칙연산 가능
함수 함수로 감쌀 수 있음
곱하기 *
셀렉트절의 AS는 GROUP BY, ORDER BY에서 쓸수 있다 (되는 게 몇몇 있음)

MIN, MAX 할때랑 ORDER BY, LIMIT 1 할때랑 뭐가 다른거지???

<오후> 데이터리안

RFM

범용성이 높은 프레임워크

CASE: 조건이 여러 개

  • 위에서부터 필터링이 된다고 생각하면 됨!

  • A조건

  • B조건
    => (A조건이 아닌 것 중에,) B조건

  • CASE WHEN ~ THEN ~ END
    -> ELSE NULL 굳이 안해도 바로 NULL값으로 할당됨!

  • ELSE는 옵션, "CASE WHEN~ THEN~ END" 이게 최소 단위

IF: 조건이 한 개

Pivot

행과 열로 나눠진 형태로 보면 (교차되는 지점이 생겨) 인식하기가 더 빠르고 효율적이기 때문에 피벗!
<아이디어> 데이터를 한눈에 보고 싶다
기존 테이블: [행] 인덱스 0 1 2 3 ... [열] 컬럼명1 컬럼명2 컬럼명3
피벗 테이블: [행] 컬럼명1의 요소들 [열] 컬럼명2의 요소들

<과제> 인프런 마저 학습 pivot과 join

JOIN : 관련성이 있는 두 개 이상의 테이블을 이어붙여서 흩어져있는 정보들을 한번에 가져오기

rdb 데이터베이스 = 여러 데이터를 연결하는 과정이 필수
메모리 낭비하고 있는 한 테이블, 두 개로 나누어서 저장하자, 그 후 연결할 수 있는 번호를 부여하면 중복되는 데이터 없이 연결해서 볼 수 있음

  • ON 조건에서 2개 써줄 수도 있음

INNER JOIN : 모든 경우의 수 다 만들기

실제로, FROM절에 이제 2가지 이상 쓸 수 있다
FROM Users, Orders
=> 그런데 구식 버전

그럼 테이블 어떻게 붙일까? INNER JOIN
양쪽 테이블에 데이터가 모두 다 있을 때 출력 : 교집합

  • Users에도 데이터가 있고, Orders에도 데이터가 있는 경우에만 출력
SELECT *
FROM Table A
  	INNER JOIN Table B ON A.key = B.key
(WHERE)
  • A, B 컬럼들을 기준으로 데이터를 이어붙이겠다

  • 단, 두 테이블 모두 정보가 있어야 한다

  • 같은 열이 있다면 '테이블.컬럼' 으로 표기해줘야 한다

OUTER JOIN : 이너 조인 제외하면 다 아우터 조인

LEFT JOIN : 왼쪽 테이블(A)에는 데이터가 있고, 오른쪽 테이블(B)은 데이터 없을 때 => 왼쪽은 전부 출력한다

  • 데이터가 없는 고객도 출력을 하고 싶기 때문에 (이너조인을 하면 데이터가 빈 행은 아예 없어진다)
  • WHERE userID IS NULL : 결측만 출력
  • 대부분 RIGHT JOIN 사용 안 하고 LEFT (OUTER) JOIN 사용한다

SELF JOIN

  • 꼭 AS(알리아스)를 이용해서 같은 데이터를 다른 이름으로 생성해주고, 붙여야 한다
  • INNER JOIN으로 사용해주면 된다

시간 더하기, 빼기

  • DATE_ADD(기준날짜, INTERVAL~)

  • DATE_SUB(기준날짜, INTERVAL~)

  • SELECT DATE_ADD(NOW(), INTERVAL 1 SECOND)

  • SELECT DATE_ADD(NOW(), INTERVAL 1 HOUR)

  • SELECT DATE_ADD(NOW(), INTERVAL -1 DAY) => DATE_SUB 빼기랑 같음

ON yesterday.recordDate + INTERVAL 1 DAY = today.recordDate

  • 이렇게도 가능!

집합연산 UNION : 위아래로 붙이기

중복 데이터가 있을 경우, 중복 없앤 결과 반환

  • 쿼리와 쿼리 사이에 UNION 작성

UNION ALL : 중복값까지 전부 포함

지원 안되는 FULL OUTER JOIN?

LEFT JOIN + UNION + RIGHT JOIN
이런 식으로 구현할 수 있다

기타

주석 감싸는 방법

/* (주석 감싸기) */

FLOOR : 내림
AS : 알리아스 FROM절, WHERE절에서도 쓸 수 있음
DISTINCT : 중복값 제거해주는 WHERE절 옵션으로, 이걸 쓰지 않으면 기본값이 ALL이라고 생각할 수 있음
HAVING : GROUP BY의 조건절 (필터링) - 그룹바이 해준 결과물을 가지고 필터링
ORDER BY X : 유니온 이후에, 마지막 줄에서 정렬해주면 됨 (유니온 위의 쿼리에서는 불가능)

회고 및 의문점

따옴표 쓰고 안쓰고 헷갈려.. 요소는 따옴표!! 띄어쓰기 안에 있는 컬럼명도 따옴표!!

profile
멋쟁이가 될꺼야~

0개의 댓글