앎을 경계하기

[가짜연구소3기] Data Engineer

[가짜연구소 3기] 데이터 엔지니어링 33 - Refining imports with SQL queries

양갱맨 2021. 9. 4. 21:12

주제

SQL 쿼리문을 작성하여 데이터를 가져오는 방법에 대해 배웠다.


열 선택하기

SELECT 열 이름 FROM 테이블명; 으로 특정 컬럼을 지정해서 로드할 수 있다.

pandas의 read_excel, read_csv에서 usecols와 비슷하다.

SELECT date, tavg
FROM weather;

WHERE 절 사용하기

Where 절을 사용해서 가지고 오고자 하는 데이터를 필터링해서 가져올 수 있다.

  • 숫자의 경우 =, >, ≥, <, ≤, <>으로 비교해서 가져올 수 있다.
    SELECT *
    FROM weather
    WHERE tmax > 32;

    위 쿼리는 32보다 큰 tmax값을 가진 레코드를 전부 가져온다.

  • 문자열의 경우 =을 사용해서 문자열 일치 비교한다. 문자열은 대소문자를 구분한다.
    SELECT *
    FROM hpd311calls
    WHERE borough = 'BROOKLYN';

SQL과 pandas

import pandas as pd
from sqlalchemy import create_engine

#엔진 설정
engine = create_engine("sqlite:///data.db")

#쿼리 작성
query = """SELECT *
						FROM hpd311calls
						WHERE borough = 'BROOKLYN';"""
brooklyn_calls = pd.read_sql(query, engine)
print(brooklyn_calls.borough.unique())
['BROOKLYN']

AND로 조건 결합하기

WHERE 조건 내에서 AND 을 사용해서 조건을 결합할 수 있다.

and_query = """SELECT *
								FROM hpd311calls
								WHERE borough = 'BRONX'
								AND complaint_type='PLUMBING';"""

bx_plumbing_calls = pd.read_sql(and_query, engine)
print(bx_plumbing_calls.shape)
(2016, 8)

OR로 조건 결합하기

AND 연산자는 모든 조건이 참이어야 한다.

OR 연산자는 하나 이상이 참이면 레코드를 반환한다.

or_query = """SELECT *
							FROM hpd311calls
							WHERE complaint_type = 'WATER LEAK'
								OR complaint_type = 'PLUMBING';"""

leaks_or_plumbing = pd.read_sql(or_query, engine)

print(leaks_or_plumbing.shape)
(10684, 8)