[TIL] 데이터 웨어하우스와 SQL 기본에 대해 배우고 이를 바탕으로 데이터 분석에 대해 학습 (2)

이원진·2023년 5월 9일
0

데브코스

목록 보기
22/54
post-thumbnail
post-custom-banner

학습내용


  1. Redshift 런치 데모

  2. 예제 테이블 소개

  3. SQL 소개

  4. SQL 실습 환경 소개

  5. SELECT 소개

1. Redshift 런치 데모


  • Node type: dc2.large 선택

  • Admin user name, password 설정

  • Network and security > Publicly accessible: Enable 선택

  • DB name, port 설정


2. 예제 테이블 소개


  • 사용자 ID: 사용자마다 부여하는 유일한 ID

  • 세션 ID: 세션마다 부여되는 ID

    • 세션: 사용자의 방문을 논리적인 단위로 나눈 것

    • 하나의 사용자는 여러 개의 세션을 가질 수 있음

    • 보통 세션을 만들어낸 접점(경유지)을 채널이란 이름으로 기록

    • 세션이 생긴 시간도 기록

  • 이 정보를 기반으로 다양한 데이터 분석과 지표 설정 가능

    • DAU(Daily Active User), WAU(Weekly ...), MAU(Monthly ...) 차트

  • Marketing Channel Attribution 분석

    • 어느 채널에 광고를 하는 것이 효과적인지?

3. SQL 소개


  • SQL 기본

    • 다수의 SQL문을 실행한다면, 세미콜론으로 분리

    • --: 한 줄 주석

    • /* */: 여러 줄 주석

    • SQL 키워드는 대문자를 사용하는 등 포맷팅 필요

    • 테이블, 필드 명명 규칙을 정하는 것이 중요

      • User vs Users
      • user_session vs UserSession

  • DDL: 테이블 구조 정의 언어

    • 데이터 웨어하우스는 Primary key uniqueness를 보장하지 않기 때문에 Primary key를 지정해도 의미가 없음

    • CTAS: CREATE TABLE AS 테이블이름 AS SELECT

      • CREATE TABLE + INSERT INTO

    • 레코드 수정

      • INSERT INTO: 테이블에 레코드 추가

      • UPDATE FROM: 테이블 레코드의 필드값 수정

      • DELETE FROM: 테이블에서 레코드 삭제

        • vs TRUNCATE: TRUNCATE은 트랜잭션에서 사용 불가

    • 테이블 삭제

      • DROP TABLE IF EXISTS 테이블이름

        • 테이블이 존재하지 않아도 에러 발생 X

      • vs DELETE FROM

        • 테이블은 유지하고 레코드만 삭제

    • 테이블 변경

      • 새로운 컬럼 추가: ALTER TABLE 테이블이름 ADD COLUMN 필드이름 필드타입;

      • 기존 컬럼 이름 변경: ALTER TABLE 테이블이름 RENAME 현재필드이름 TO 새필드이름;

      • 기존 컬럼 제거: ALTER TABLE 테이블이름 DROP COLUMN 필드이름;

      • 테이블 이름 변경: ALTER TABLE 테이블이름 RENAME TO 새테이블이름;

    • SELECT

      • SELECT FROM: 테이블에서 레코드와 필드를 읽어옴

      • WHERE: 레코드 선택 조건 지정

      • GROUP BY: 정보를 그룹 레벨에서 추출

      • ORDER BY: 레코드 순서 결정

      • 보통 다수의 테이블을 조인해서 사용


4. SQL 실습 환경 소개


  • 실습 유의사항

    • 현업에서 깨끗한 데이터라는 것은 존재하지 않음

    • 데이터 관련 업무를 한다면 항상 데이터의 품질을 의심하고 체크하는 버릇이 필요

      • 중복된 레코드 체크

      • 최근 데이터의 존재 여부 체크(freshness)

      • Primary key uniqueness가 지켜지는지 확인

      • 값이 비어있는 컬럼들이 있는지 체크

      • unit test 형태로 만들어 위의 항목들을 체크 가능

    • 어느 시점이 되면 테이블이 너무 많이 존재하게 됨

      • 중요 테이블이 무엇인지 파악하고, 그것들의 메타 정보를 잘 관리하는 것이 중요

      • 이런 Data Discovery 문제를 해결하기 위해 다양한 오픈소스와 서비스 출현

        • DataHub, Amundsen, Select Star, DataFrame, ...

5. SELECT 소개


  • 테이블에서 레코드를 읽어오는데 사용

  • LIMIT: 가져올 레코드 수 지정

  • DISTINCT: 중복값 제거

  • COUNT: 데이터의 개수 계산

    value
    NULL
    1
    1
    0
    0
    4
    3
    • count_test 테이블

    • SELECT COUNT(1) FROM count_test -> 7

    • SELECT COUNT(0) FROM count_test -> 7

    • SELECT COUNT(NULL) FROM count_test -> 0

      • 괄호 안에 NULL이 들어오면 세지 않고, NULL이 아닌 다른 값(0, 1, *)이 들어오면 셈

    • SELECT COUNT(value) FROM count_test -> 6

      • 7개의 레코드 중 NULL을 제외하면 6개

    • SELECT COUNT(DISTINCT value) FROM count_test -> 4

      • 5개의 DISTINCT한 레코드 중 NULL을 제외하면 4개

  • CASE WHEN: 조건을 사용해 필드값 변환

  • NULL

    • 값이 존재하지 않음을 나타내는 상수

    • 0과 공백과는 다른 값

    • 필드 지정 시 값이 없는 경우 NULL로 초기화 가능

    • IS, IS NOT으로 NULL값인지 아닌지 확인 가능

  • WHERE

    • IN

      • WHERE field IN (A, B)

    • LIKE, ILIKE

      • WHERE field LIKE "A*"

      • ILIKE은 대소문자 구분 X

      • 부정: NOT LIKE, NOT ILIKE

    • BETWEEN

      • WHERE field BETWEEN(A, B)

    • 위의 오퍼레이터들은 CASE WHEN 구문에서도 사용 가능

  • STRING Functions

    • LEFT(str, N): str의 앞에서부터 N자리 추출

    • REPLACE(str, exp1, exp2): str에서 exp1을 exp2로 대체

    • UPPER(str): str 대문자로 변환

    • LOWER(str): str 소문자로 변환

    • LEN(str): str 길이 계산

    • LPAD(str, 5, "a"): str의 왼쪽 5칸을 문자 "a"로 채움

      • RPAD: 오른쪽 채움

    • SUBSTRING(str, a, b): str의 a번째 자리에서부터 b자리만큼의 문자열 추출

  • ORDER BY

    • 오름차순(ASC)이 default

      • 내림차순: DESC

    • ORDER BY a ASC: a 컬럼의 순서대로 오름차순 정렬

    • ORDER BY a ASC DESC b, c: a 컬럼의 순서대로 오름차순, b 컬럼의 순서대로 내림차순, c 컬럼의 순서대로 내림차순 정렬

    • NULL값

      • ASC: 마지막에 위치

      • DESC: 처음에 위치

      • NULLS FIRST, NULLS LAST 옵션을 사용해 순서 설정 가능

  • 타입 변환

    • DATE Conversion

    • TO_CHAR, TO_TIMESTAMP

  • 타입 캐스팅

    • 1/2의 결과는 FLOAT 타입으로 캐스팅하지 않으면 0.5가 아닌 0

    • 오퍼레이터 사용

      • field::float

    • cast 함수 사용

      • cast(field ad float)

메모



post-custom-banner

0개의 댓글