[SQL] 데이터 분석의 시작: SQL로 데이터 다루기

jul ee·2025년 4월 3일

데이터 성장기

목록 보기
10/139

🖇  쿼리문 작성과 데이터 필터링
🖇  비교 연산자
🖇  논리 연산자
🖇  산술 연산자


데이터는 저장만으로는 의미가 없다.
진짜 중요한 것은 어떤 데이터를 어떻게 불러오고, 어떻게 추려낼 것인가 이다.

SQL은 데이터를 분석하는 가장 기본적이고 강력한 도구이다.

이 글에서는 JupyterNotebook 환경에서 pandasql을 사용해 파이썬 환경에서 SQL 쿼리문을 실습해보고

SELECT, WHERE, AND, OR, IN, BETWEEN 등 데이터 필터링에 자주 쓰이는 SQL 구문을 직접 다뤄보았다.



🖇  쿼리문 작성과 데이터 필터링

실습을 통해 다룰 데이터를 설명하겠다.

해당 데이터는 자전거 대여 수요 분석에 많이 사용되는 유명한 공개 데이터셋인 Capital Bikeshare 데이터를 기반으로 만들어진 전처리된 버전이다.

bike 테이블(bike_dataset.csv)은 아래와 같은 구조로 되어있으며

dteday, season, yr, mnth, hr, holiday, weekday, workingday, weathersit, temp, atemp, hum, windspeed, casual, registered, cnt
각각 날짜, 계절, 연도, 월, 시간, 휴일 여부, 요일, 근무일 여부, 날씨, 온도, 체감온도, 습도, 풍속, 비회원 대여 수, 회원 대여 수, 전체 대여 수를 나타낸다.

먼저
pandsql 을 사용하기 위해 필요한 라이브러리와 데이터를 불러와야 한다.

/* 파이썬의 표준 라이브러리 os(Operating System)
   파일 경로를 조립하거나, 현재 디렉토리 확인
   os.path.join()이나 os.getcwd() 같은 함수 사용 가능 */
import os
/* 파이썬 기반 sql 사용 -> pandas 가져오기
   데이터프레임(DataFrame)을 활용한 데이터 분석에 가장 많이 사용되는 라이브러리 */
import pandas as pd 
/* sql을 사용하기  라이브러리 가져오기
   pandas의 데이터프레임(테이블)에 SQL 문법으로 질의(Query)를 날릴 수 있게 해준다
   pandasql 라이브러리에서 sqldf 함수 가져오기 */
from pandasql import sqldf
/* pandasql을 전역 환경으로 지정
  -> 나중에 mysql("SELECT * FROM bike")처럼 SQL 문법으로 손쉽게 질의할 수 있게 하기 위함 */
mysql = lambda q: sqldf(q, globals())
/* 데이터 불러오기
   데이터 파일들이 들어 있는 폴더 경로를 변수로 저장
   절대 경로: 루트 디렉토리(/)를 기준으로 전체 경로를 나타낸다 */
data_dir = '/aiffel/aiffel/sql_basic'
/* 'bike_dataset.csv' 파일을 bike라는 데이터프레임으로 읽어오기
   os.path.join()은 경로를 시스템에 맞게 자동으로 연결한다
   pd.read_csv()는 CSV 파일을 읽어 데이터프레임으로 변환한다 */
bike = pd.read_csv(os.path.join(data_dir, 'bike_dataset.csv'))
...


쿼리문 작성하기(SELECT, FROM)

어떤 컬럼을 어떤 테이블에서 가져올 것인지를 작성하는 구문

테이블을 지정하여(FROM) 데이터를 조회(SELECT)할 수 있다.

     전체 컬럼 조회하기

  • SELECT 구문에 * 기호
    • 해당 테이블의 모든 컬럼을 조회
SELECT 컬럼(*)
FROM 테이블명
-- bike 테이블에서 전체 컬럼 조회하기

SELECT * 
FROM bike


-- bike 테이블에서 날짜, 계절, 날씨 컬럼을 추출하기

SELECT dteday, season, weathersit
FROM bike

전체 데이터 필터링하기(WHERE)

WHERE 조건을 줘서 데이터를 확인한다.

  • SQL에서 쿼리 결과 필터링은 중요한 기술
  • WHERE 는 FROM 절 다음에 위치 → 순서가 중요
  • WHERE 절에는 연산자를 같이 사용해야 한다.
SELECT 원하는 컬럼
FROM 테이블명
WHERE 조건절
-- 2012년을 기준으로 데이터 확인하기

SELECT *
FROM bike
WHERE yr = 2012



🖇  비교 연산자

비교 연산자

연산자의미
A = 'value'A와 'value'는 같다
A != 'value'A와 'value'는 같지 않다
A > nA가 n보다 크다
A >= nA가 n보다 크거나 같다
A < nA가 n보다 작다
A <= nA가 n보다 작거나 같다

=

  • 특정 데이터를 선택할 때 사용
-- 2012년을 기준으로 날짜, 계절, 날씨 컬럼 확인하기

--   LIMIT으로 전체 데이터 중 100개만 확인하기
--    -> sql 구문 가장 하단에 작성해야 한다
 
SELECT dteday, season, weathersit
FROM bike
WHERE yr = 2012
LIMIT 100    



-- 계절이 봄인 전체 데이터를 확인하기

SELECT *
FROM bike
WHERE season = 'spring'

!= 또는 <>

  • 같지 않다'는 뜻
  • 특정 데이터를 제외하여 선택할 때 사용
-- 계절이 봄이 아닌 전체 데이터 확인하기

SELECT *
FROM bike
WHERE season != 'spring'

------------------------

SELECT *
FROM bike
WHERE season <> 'spring'

>>=

  • 컬럼을 기준으로 데이터 값보다 큰 경우에 사용
  • 숫자 타입의 금액이나 날짜 타입의 날짜를 데이터 값으로 사용할 때
-- 23시 이후 대여건에 대한 전체 데이터 확인하기

SELECT *
FROM bike
WHERE hr >= 23
LIMIT 100

<<=

  • 컬럼을 기준으로 데이터 값보다 작은 경우에 사용
  • 숫자 타입의 금액이나 날짜 타입의 날짜를 데이터 값으로 사용할 때
-- 온도가 0.2 미만인 전체 데이 추출하기

SELECT *
FROM bike
WHERE temp < 0.2
LIMIT 100


-- 전체 대여 건수가 100건보다 작은 데이터를 추출하기

SELECT *
FROM bike
WHERE cnt < 100



🖇  논리 연산자 사용하기

여러가지 조건을 주고 싶을 때 사용

논리 연산자를 계속 추가하면 복잡한 조건도 쉽게 필터링할 수 있다.

AND

  • 앞의 조건과 뒤의 조건 둘 다를 만족해야 참(True)
  • 조건1과 조건2 둘 다 만족한 값을 필터링한다.
  • 조건을 계속 추가해야할 때 사용
WHERE [조건1] AND [조건2]
-- bike 테이블에서 2011년도 겨울 시즌의 데이터 확인하기

SELECT *
FROM bike
WHERE yr = 2011
      AND season = 'winter'
LIMIT 100


-- bike 테이블에서 2011년도 봄시즌의 22시에 발생한 데이터 확인하기

SELECT *
FROM bike
WHERE yr = 2011
      AND season = 'spring'
      AND hr = 22

OR

  • 앞의 조건을 만족하거나 뒤의 조건을 만족하거나, 한쪽이라도 만족해야 참(True)
  • 조건1과 조건2 둘 중 하나라도 만족시킨 값을 필터링한다.
  • 조건을 계속 추가해야 할 때 사용
WHERE [조건1] OR [조건2]
-- bike 테이블에서 2011년 또는 봄시즌의 데이터 확인하기

SELECT *
FROM bike
WHERE yr = 2011
      OR season = 'spring'
    🧐 Q.  hr이 10이거나 11인 행을 추출하고 싶은 경우 맞게 작성된 쿼리는 무엇일까?
    
    1번. WHERE hr = 10 OR hr = 11
    2번. WHERE hr = 10 OR 11
    

    정답은 1번
    -> 2번 'WHERE hr = 10 OR 11' 같은 경우는 원하는 값을 추출할 수 없다.
    -> 11은 단순한 숫자 값이지만, 이 조건에서는 항상 참(True)으로 평가되어 모든 행을 반환하게 된다.
    -> 0은 False,그 외의 모든 숫자를 참(True)으로 간주하기 때문이다.

IN

  • 컬럼이 어떤 값들의 집합에 속할 경우 사용
  • 조회하고자 하는 데이터 값이 여러 개일 때 사용
    • =과 유사하지만 =은 데이터 값 하나를 조건으로 줄 수 있는 반면, IN은 데이터 값을 여러 개의 list로 지정할 수 있다.
    • 여러 개 값의 리스트 중 하나의 값이라도 만족하면 해당하는 결과값을 출력한다.
-- 1월(Jan), 3월(Mar), 5월(May)에 대한 전체 데이터 추출하기

SELECT *
FROM bike
WHERE mnth IN ('Jan', 'Mar', 'May')
-- cf. OR로도 동일한 데이터를 추출할 수 있지만
-- 하나의 컬럼에서 같은 인자를 조건으로 줄 때 IN을 사용하는 것이 효율적이다

SELECT *
FROM bike
WHERE mnth = 'Jan'
      OR mnth = 'Mar' 
	  OR mnth = 'May'

NOT

  • 논리 연산자의 의미를 반전시킨다.
    • 조건을 부정으로 만들어 부정 연산자라고도 부른다.
  • 선언한 조건에 대해 반대 결과를 반환
-- 1월(Jan), 3월(Mar), 5월(May)이 아닌 전체 데이터 추출하기

SELECT *
FROM bike
WHERE mnth NOT IN ('Jan', 'Mar', 'May')


-- 1월(Jan), 3월(Mar), 5월(May)이 아니고, 전체 대여 건수가 10보다 큰 전체 데이터 추출하기

SELECT *
FROM bike
WHERE mnth NOT IN ('Jan', 'Mar', 'May')
	  AND cnt > 10

NULL

  • 값이 지정되지 않아 알 수 없는 값
  • NULL은 0이나 공백과는 다르다
    • 0 : 숫자
    • '' "(공백) : 문자열
-- 날씨 데이터의 값이 NULL값인 데이터 추출하기

SELECT *
FROM bike
WHERE weathersit IS NULL


-- 날씨 데이터의 값이 NULL값이 아닌 전체 데이터 추출하기

SELECT *
FROM bike
WHERE weathersit IS NOT NULL

Between A and B

  • A와 B 사이에 값이 존재할 때 사용
    • [주의] A와 B를 포함한다는 점!
  • 두 값의 범위에 해당하는 행을 출력할 때 사용
    • 주로 날짜 사이 간격을 줄 때 자주 사용하는 편이다.
    • 최소값과 최대값을 지정한 값의 범위 내에 있는 값들을 검색하기 위해 사용
      e.g., number Between 3 AND 5와 number>=3 AND number<=5는 동일한 결과를 출력한다.
-- 2011년 3월 30일 ~ 31일 사이의 데이터를 확인하기

SELECT *
FROM bike
WHERE dteday Between '2011-03-30' and '2011-03-31'


-- cf. 비교 연산자 사용하여 확인하기

SELECT *
FROM bike
WHERE dteday >= '2011-03-30' 
      AND dteday <= '2011-03-31'



🖇  산술 연산자 사용하기

데이터값을 계산하고자 할 때 사용

  • +-*/ 등이 있다.
    • 우선 순위:  ()  >  * /  >  + -
  • SELECTWHERE 문에서 사용
    • 문자열 혹은 날짜타입 데이터에 산술연산자를 적용하면 원하지 않는 값을 얻을 수 있다.
    • 실무에서 많이 쓰이며 비즈니스를 위한 다양한 리포트를 작성할 때 필수적으로 사용된다.
# dteday 값에 2를 더하고, weekday에 3을 더하기 

SELECT dteday,
       dteday + 2,
       weekday,
       weekday + 3
FROM bike
=> DBMS(Database Management system)에 따라
   실행했을 때 에러가 날 수 있기 때문에
   날짜나 문자 타입의 경우에는 산술 연산자를 사용하지 않는 것이 좋다.

     [주의]
     이때 dteday + 2, weekday + 3는
     산술 연산자를 사용해 계산해 출력한 결과일 뿐
     새로운 컬럼을 만들어 데이터베이스에 추가한 것이 아니다.

# 온도(temp)에 +2, -2, *2, /2 추가하기

SELECT temp,
	   temp + 2,
       temp - 2,
       temp * 2,
       temp / 2 
FROM bike

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글