SQL 책 리뷰

[SQL로 시작하는 데이터분석] (2) - 2장 데이터 준비

allaboutdata3 2025. 7. 26. 01:51

이전 장에 이어서 약간의 도입 부분? 이라고 할 수 있는 목차를 한번 오버뷰 할 것이다. 

전 포스팅에서는 데이터베이스의 종류나 구분에 대해서 알아봤고, 이번에는 데이터 베이스에 쓰게 될 데이터들에 대해 간단하게 알아볼 예정이다.

 

1. 데이터 타입

책에 나온 데이터 타입들을 간단하게 표로 정리해 보았다. 
문자열 CHAR / VARCHAR 문자(텍스트) 데이터 저장 - CHAR :  고정 길이
- VARCHAR : 가변 길이 저장
TEXT / BLOB 긴 텍스트 또는 바이너리 대용량 문자열(예: 설문 응답), 파일 데이터도 저장 가능
숫자 INT / SMALLINT / BIGINT 정수 저장 정수만 저장하며, 크기별로 선택 가능
- SMALLINT : 작은 범위의 정수 저장 (4bit 사용)
- BIGINT : 큰 수 저장 (8bit 사용)
FLOAT / DOUBLE / DECIMAL 실수(소수점 포함 수치) 저장 소수점이 필요한 정밀 수치 저장 가능
- FLOAT : 낮은 정밀도 수치가 필요할때 사용 , 메모리 절약 필요시 적절함
- 그 외 두개 : 높은 정밀도의 수치가 필요할때.
논리형 BOOLEAN TRUE / FALSE 저장 참 또는 거짓 값만 저장
날짜/시간 DATETIME / TIMESTAMP 날짜 + 시간 날짜와 시간을 함께 저장 (예: 2025-07-25 12:00:00)
- DATETIME : 사람이 입력하는 정해진 시각 (변하지 않음 ) 
- TIMESTAMP : 시스템이 기록하는 현재 시각 (타임존에 따라 달라질 수 있음 ) 
TIME 시간만 저장 시, 분, 초만 저장 (날짜 없음)

 

 

데이터 타입들이 담을 수 있는 내용들로는 약간 와닿지가 않는 것 같아서 실제 업무에서는 어떤 자료들을 기록하기 위해 사용되는지 좀 더 검색해봤다. 아래는 약간 업무에서 자주 쓰이는 데이터 저장 대상에 대해 쫌 더? 찾아봤다. 

 

** 업무에서 자주쓰이는 데이터 타입과 저장 대상

문자열 저장 시

  • TEXT,  CLOB : 고객 리뷰, 게시글, 코멘트처럼 매우 긴 텍스트 데이터를 저장할 때 사용한다.
  • BLOB : 이미지, 동영상, 음성 파일 같은 바이너리 데이터를 데이터베이스에 직접 저장할 때 쓰인다. 다만, 대용량 미디어 파일은 보통 외부 저장소에 보관하고, DB에는 파일 경로나 URL만 저장하는 경우가 많다.

숫자 저장 시

  • INT :  고객 ID, 주문 번호, 상품 수량, 재고 수 등 정수 형태의 기본 숫자 데이터
  • DECIMAL : 금융 거래 내역, 상품 가격, 세금 비율 등 소수점 아래 정확한 수치가 필요한 데이터
  • FLOAT, DOUBLE:  센서 데이터, GPS 좌표, 과학적 계산 결과처럼 소수점이 포함되지만 약간의 오차가 허용되는 데이터 저장에 활용된다.

날짜 및 시간 저장 시

  • DATE : 회원 가입일, 주문 날짜, 계약 시작일 등 날짜 정보만 필요한 데이터를 저장할 때 사용한다.
  • TIME : 하루 중 특정 시간, 예를 들어 근무 시작 시간, 예약 시간 등 시간 정보가 중요할 때 쓰인다.
  • TIMESTAMP : 로그 기록, 데이터 생성 및 수정 시각처럼 시스템 시간 기반으로 정확한 시점 기록이 필요한 데이터에 주로 활용된다. 시계열 분석이나 코호트 분석에서도 핵심 역할을 한다.

2. 데이터 분류

데이터 종류에 대해서 알아봤으니, 이번에는 데이터는 어떤 기준으로 분류하는 지에 대해 알아보자. 

 

1) 정형 데이터와 반정형데이터 : 데이터가 구조를 가지고 있냐? 아니냐? 에 따라 분류

  • 정형데이터 : 각 속성이 열에 저장되고 개체의 인스턴스가 행에 저장되는 형태 → SQL 쿼리가 유용
  • 비정형 데이터 : 미리 지정된 구조, 데이터 모델, 데이터 타입 X → ex) 이미지, 오디오,비디오 등
  • 반정형 데이터 : 비정형 데이터중, 나름의 구조를 갖춘 데이터 → ex) 이메일 발신자, 수신자 주소 / 제목/ 본문/ 전송 시간 등

2) 정량 데이터와 정성 데이터  : 수치로 측정될 수 있는가? 에 따라 분류

  • 정량 데이터 : 사람, 물건, 이벤트 등을 특정 수치로 정량화한 데이터. → ex) 고객 정보 / 제품 유형 / 기기 설정 정보/ 가격/ 양 등
    • 개수, 합계, 평균 등의 산술 함수 사용가능.
    • 로그 데이터처럼 머신에서 자동으로 생성되는 경우가 많긴한데, 그렇지 않은 경우도 존재. → ex) 의사기록한 환자 키,몸무게 / 선생님이 채점한 애들의 퀴즈 점수
  • 정성 데이터 : 주로 텍스트 형태로 적힌 느낌, 의견, 서술과 같이 명확한 수치로 측정이 불가능한 데이터

3) 퍼스트, 세컨트, 서드 파티 데이터 : 어디서 데이터를 받아오는가? 에 따라 분류

  • 퍼스트 파티 데이터 : 기관에서 직접 수집한 데이터
  • 세컨드 파티 데이터 : 특정 기관에 서비스를 제공하는 업체에서 수집하는 데이터
                                   ex) 전자 상거래 SW , 이메일, 마케팅 자동화 도구, 웹/모바일 인터렉션 트레커 등 SaaS (software as a service)
  • 서드 파티 데이터 : 업체에 금맥을 지불하고 구매하는 데이터, 혹은 정부에서 무료로 공개한 데이터.
                                → 타 데이터에 비해 세밀도가 떨어지고, 사용자 레벨의 상세 데이터가 포함되어있지 않음

4) 희소 데이터 

 

  • 전체 데이터 중에 실제 값(0이 아닌 값이나 의미 있는 값)이 매우 적고, 대부분이 0이나 빈 값인 데이터
  • 즉, 데이터가 많이 비어 있어서 ‘빈 공간’이 많은 형태
  • 예를 들어, 쇼핑몰 고객-상품 구매 기록 테이블에서, 고객 한 명이 구매하는 상품은 전체 상품 중 일부에 불과해 대부분의 칸이 0(구매 안 함)으로 채워지는 경우가 이에 해당한다.

3. SQL 쿼리 구조와 주요 절 정리 

뒤로 가면 갈수록 쿼리가 드럽게 길어지는데, 길어지기 전에 먼저 대박 기본적인 쿼리 구조랑 절부터 짚고 넘어가보고자 한다. 

 

1) SELECT와 FROM: 데이터 추출의 시작

SQL 쿼리는 크게 SELECT 절과 FROM 절로 시작한다.

 

  • SELECT 절은 원하는 **열(Column)**을 지정하는 부분이다. 예를 들어 고객 이름과 나이를 확인하고자 할 때 SELECT name, age라고 작성한다.
  • FROM 절은 데이터를 가져올 테이블을 명시하는 부분이다. 예를 들어 FROM customers는 고객 정보가 저장된 테이블에서 데이터를 조회한다는 뜻이다.

 

2) JOIN: 여러 테이블을 연결하는 절

실제 업무 데이터는 여러 테이블에 분산되어 저장되는 경우가 많다. 이러한 데이터를 결합하기 위해 JOIN 절을 사용한다. JOIN은 두 개 이상의 테이블을 특정 조건에 따라 연결하여 하나의 결과를 생성한다.

  • INNER JOIN은 두 테이블 모두에 존재하는 레코드만 조회한다.
  • LEFT JOIN은 첫 번째 테이블의 모든 레코드와 두 번째 테이블에서 일치하는 레코드를 포함한다.
  • RIGHT JOIN은 두 번째 테이블의 모든 레코드와 첫 번째 테이블에서 일치하는 레코드를 포함한다.
  • FULL JOIN은 두 테이블의 모든 레코드를 조건에 맞게 조회한다.

실무에서는 데이터 누락을 최소화하기 위해 주로 LEFT JOIN을 사용한다.

 

 

 

3) WHERE: 조건에 맞는 데이터만 필터링

필요한 데이터만 추출하거나 불필요한 데이터를 제거하기 위해 WHERE 절을 사용한다. 예를 들어 WHERE age > 30은 나이가 30세 이상인 데이터만 선택한다. 이 절은 쿼리 성능 개선에도 중요한 역할을 한다.

 

 

 

4) GROUP BY: 데이터를 그룹화하여 집계할 때 

  • 특정 기준으로 데이터를 묶어 통계나 합계를 산출할 때 GROUP BY 절을 사용한다. 예를 들어 지역별 매출 합계나 고객 등급별 구매 건수를 계산할 때 활용한다.
  • GROUP BY 절은 집계 함수(COUNT, SUM, AVG 등)와 함께 사용한다.
    그룹화할 컬럼은 이름이나 위치 번호(예: 1, 2 등)로 지정할 수 있으나, DBMS에 따라 차이가 존재한다.

 

 

5) LIMIT: 결과 데이터 개수를 제한

데이터가 많을 때 일부만 확인하고자 할 경우 LIMIT 절로 반환할 레코드 수를 제한할 수 있다. 예를 들어 LIMIT 10은 상위 10개의 결과만 보여준다. 단, 일부 SQL 서버에서는 LIMIT 대신 TOP 키워드를 사용한다.

 

 

 

6) Cartesian JOIN : 조인 조건 없이 모든 행을 서로 결합

  • 조건 없이 두 테이블의 모든 행을 조합하는 조인이다.
  • 결과 행 수가 급격히 증가해 불필요한 데이터가 많아진다.
  • 대부분 의도치 않은 조인 오류이며, 사용에 주의해야 한다.

 

으악! 너무 많은가? 라는 생각이 맨 첨엔 아주 잠깐 들수도 있는데, 하다보면 익숙해지니까 별로 걱정은 하지말자. 여기까지가 정말 정말 많이 쓰이고 기본적인 쿼리 내용들이다 .

 

다음으로는 숫자 데이터를 ‘그룹’으로 나눠 분석할 때 유용한 구간화(Binning)분위수 함수에 대해 정리해보겠다.


4. 구간화(Binning)와 분위수 함수 정리

데이터 분석에서 **연속형 변수(숫자 데이터)**를 그룹화해 이해하기 쉽게 만드는 방법으로 **구간화(Binning)**가 자주 사용된다. 구간화는 값의 범위를 기준으로 데이터를 여러 그룹으로 나누고, 각 그룹에 속하는 데이터 개수를 집계하는 방식이다.

 

그러면 먼저 구간화가 뭔지 알아보자. 

구간화란?

  • 연속값 데이터를 특정 범위(구간 또는 버킷)로 나누는 작업이다.
  • 각 구간에 속하는 데이터 수를 세어 데이터 분포를 파악하는 데 유용하다.
  • 구간화는 SQL에서 CASE 문, 반올림 함수(round), 로그 함수(log) 등을 활용해 간단히 구현할 수 있다.

실제  쿼리를 한번 확인해보자. 아래는 구간화 하는 쿼리 예시이다 .

CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ELSE 기본값
END

 

 

그러면 구간화 설정은 어떻게 할까?

구간 설정 방법

  • 구간은 일반적으로 균일한 크기로 설정하는 것이 적절하다.
  • 구간 크기를 조정할 때는 round() 함수를 사용해 반올림하거나, 로그 변환을 통해 데이터 분포를 조정하기도 한다.
  • 로그 함수는 데이터 값의 범위가 매우 넓을 때 유용하지만, 0 이하의 값에 대해서는 데이터베이스에 따라 NULL 반환 또는 오류가 발생할 수 있으므로 주의해야 한다.
ROUND(값, 소수점 자리수)

 

 

분위수 함수와 윈도우 함수

그외에 데이터를 구간화하는 다른 방법이 존재한다! (사실 이미 우리가 알고 있는 방법이다). 바로...사분위수! 

사분위 기반함수가 또 따로 존재한다. 쓰는 방법은 아래에 정리해놨다. 

<함수명> OVER (
    [PARTITION BY 그룹화 컬럼]  -- 선택사항
    [ORDER BY 정렬 컬럼]
    [ROWS 또는 RANGE 윈도우 크기 지정]  -- 선택사항
)

 

그 이외에 주요 분위수 관련 함수들도 존재한다. 뭐 NTILE, PERCENT_RANK 등등이 있는데. 이 쿼리들은 사실 그렇게 많이 쓰이지는 않아서 생략하겠다. 


지금까지가 'SQL 시작하는 데이터분석'책의 약간 인트로? 부분이였다. 사실 포스팅이 첨이기도 하고 아직 시작 부분이라서 글이 너무 많고 눈에 안들어 오긴하는데 , 다음 포스팅 부터는 괜찮을꺼고, 앞으로도 더 나은 포스팅이 될 수 있도록 고민할 예정이니!! 하차 말고 같이 공부하도록!! 

 

아자아자 오늘도 홧팅이다!!