[TIL Day45-2] SQL과 데이터분석 - SELECT 실습

이다혜·2021년 7월 7일
0

TIL

목록 보기
47/60

<들어가기에 앞서>

실습에 들어가기에 앞서 기억할 점(1)

  • 현업에서 깨끗한 데이터란 존재하지 않는다
    - 항상 데이터를 믿을 수 있는지 의심할 것(의疑데이터증...)
    - 실제 레코드를 몇 개 살펴보는 것 만한 방법이 없다(노가다)

  • 항상 데이터의 품질을 의심하고 체크하는 버릇이 필요
    - 중복된 레코드들 체크
    - 최근 데이터의 존재 여부 체크(freshness)
    - Primary key uniqueness가 지켜지는지 체크
    - 값이 비어있는 컬럼들이 있는지 체크
    - 위의 체크는 코딩의 unit test 형태로 만들어 매번 쉽게 체크해볼 수 있다

실습에 들어가기에 앞서 기억할 점(2)

  • Data Discovery 문제들
    - 회사가 성장함에 따라 너무나 많은 테이블들이 존재하게 된다
    - 중요 테이블들이 무엇이고 그들의 메타 정보를 잘 관리하는 것이 중요
    - 무슨 테이블에 내가 원하고 신뢰할 수 있는 정보가 들어있나?
    - 테이블에 대해 질문을 하고 싶은데 담당자가 누구인가?
    - 이러한 문제를 해결하기 위한 다양한 오픈소스 및 서비스 출현
    • DataHub, Amundsen, Select Start, DataFrame...

SELECT 소개

테이블(들)에서 레코드들(혹은 레코드 수)을 읽어오는데 사용하며, WHERE를 사용해 조건을 만족하는 레코드만 읽어올 수 있다.

SELECT 필드이름1, 필드이름2, ... -- *를 사용하면 모든 필드 선택
FROM 테이블이름
WHERE 선택조건
GROUP BY 필드이름1, 필드이름2, ...
ORDER BY 필드이름 [ASC|DESC] -- 필드 이름 대신에 숫자 사용 가능
LIMIT N;

예제

  • 테이블에 존재하는 유일한 채널 이름을 알고 싶은 경우
SELECT DISTINCT channel
FROM raw_data.user_session_channel;
  • 채널별로 속한 레코드 수를 카운트 하고 싶은 경우
SELECT channel, COUNT(1)
FROM raw_data.user_session_channel
GROUP BY 1; -- (ordinal 표현) SELECT문의 1번 필드로 GROUP BY 수행
  • 테이블의 모든 레코드 수 카운트
SELECT COUNT(*)
FROM raw_data.user_session_channel;
  • channel 이름이 Facebook인 레코드 수 카운트
SELECT channel, COUNT(1)
FROM raw_data.user_session_channel
WHERE channel = 'Facebook';

CASE WHEN

필드 값의 변환을 위해 사용하는 기능으로, 여러 조건을 사용하여 변환하는 것도 가능하다.
CASE WHEN 조건 THEN 참일 때 값 ELSE 거짓일 때 값 END 필드이름

  • 채널을 분류하여 channel_type이라는 새로운 필드 만들기
SELECT CASE
    WHEN channel in ('Facebook', 'Instagram') THEN 'Social-Media'
    WHEN channel in ('Google', 'Naver') THEN 'Search-Engine'
    ELSE 'Something-Else'
END channel_type
FROM raw_data.user_session_channel;
  • NULL이란?
    - 값이 존재하지 않음을 나타내는 상수
    - 필드 지정 시 값이 없는 경우 NULL로 지정 가능
    - field1 is NULL: 어떤 필드의 값이 NULL인지 아닌지 비교
    - NULL이 사칙연산에 사용되면 그 결과도 NULL

COUNT 함수

  • SELECT COUNT(1) FROM count_test
    모든 레코드 수를 세어 7을 반환
  • SELECT COUNT(0) FROM count_test
    위와 같은 결과
  • SELECT COUNT(NULL) FROM count_test
    NULL이 인자로 들어오면 세지 않으므로 0을 반환
  • SELECT COUNT(value) FROM count_test
    NULL이 아닌 value의 레코드 수를 세어 6을 반환
  • SELECT COUNT(DISTINCT value) FROM count_test
    유일한 값들(NULL, 1, 0, 4, 3) 중 NULL이 아닌 값만 세어 4를 반환

WHERE

  • IN and NOT IN
    - WHERE channel IN ('Google', 'Youtube')
    - WHERE channel = 'Google' OR channel = 'Youtube'

  • LIKE and ILIKE
    - LIKE: 대소문자를 구분
    - ILIKE: 대소문자를 구분하지 않음
    - WHERE channel LIKE 'G%' (채널명이 G로 시작하는 채널)
    - WHERE channel LIKE '%o%' (채널명에 o가 들어있는 채널)
    - NOT LIKE or NOT ILIKE

  • BETWEEN
    - 날짜 범위 매칭에 사용 가능

STRING Functions

  • LEFT(str, N): 왼쪽부터 N개 문자열만 추출
  • REPLACE(str, exp1, exp2): 주어진 문자열에서 exp1을 exp2로 대체
  • UPPER(str)
  • LOWER(str)
  • LEN(str)
  • LPAD, RPAD: 문자열의 왼쪽/오른쪽에 문자 padding
  • SUBSTRING: 범위를 지정하여 문자열 추출

ORDER BY

  • 디폴트값은 오름차순 정렬
  • 내림차순 정렬을 하고싶다면 "DESC" 명시
  • 여러 개 컬럼을 기준으로 정렬할 수 있음 ORDER BY 1 DESC, 2, 3
  • NULL값의 순서
    - NULL값들은 오름차순일 경우 마지막에, 내림차순일 경우 처음에 위치함
    - 이를 바꾸려면 NULLS FIRST 혹은 NULLS LAST 사용
profile
하루하루 성장중

0개의 댓글