해당 내용은 Datacamp의 Data engineering track을 정리했습니다.
Streamlined Data Ingestion with pandas의 chapter 3에 대한 내용입니다.
해당 포스팅에는 아래의 내용을 포함하고 있습니다.
- 데이터베이스에서 sqlalchemy와 Pandas를 활용해서 불러오기
- SQL 언어의 기본적인 문법
1. Introduction to databases
데이터베이스로부터 가져오는 방법은 이전 강의에서 설명해놓은 부분을 참고하시면 좋을 것 같아서 해당 링크를 걸어놓겠습니다. 여기를 클릭하세요. 포스팅의 Extract 부분을 읽으시면 됩니다.
2. Refining imports with SQL queries
이번 강의에서는 SQL 언어에서 Data를 불러올 때 활용하는 SELECT 명령어에 대해 알아봅니다. 가장 기본적인 형태는 SELECT [column name] FROM [table name]; 만약에 모든 column을 불러오고 싶을 때에는 *를 사용하면 됩니다. 추가적으로 조건을 주고 해당 조건에 맞는 record를 꺼내고 싶을 때에는 WHERE 절을 활용하면 됩니다. WHERE 절은 FROM 뒤에 작성합니다. 보통 WHERE 절로 조건을 걸어줄 때, integer 형태의 변수는 A값 이상 또는 이하와 같이 범위로 조건을 줄 수 있습니다. 그런 경우에는 비교 연산자인 =, >, >=, <, <=, <> 등을 사용할 수 있습니다. 특이하게, 파이썬에서는 부등호를 !=로 사용하지만, SQL에서는 <>로 사용합니다. 또한 WHERE 절에서 string 비교를 할 때에는 항상 대소문자에 유의해야 합니다.
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)
추가적으로 AND나 OR을 통해서 조건의 개수를 더 늘릴 수도 있습니다.
3. More complex SQL queries
2번 강의에서 SQL query에 추가할 수 있는 조건에 대한 내용을 다뤘습니다. 이번 강의에서는 더 복잡한 쿼리문을 다뤄봅니다.
중복된 값을 제거하고 싶을 때에는 SELECT DISTINCT로 중복된 값들을 제거한 상태로 TABLE을 얻을 수 있습니다. 또한 다양한 집계함수인 SUM, AVG, MAX, MIN, COUNT 들을 column명과 함께 사용하면 해당 column에 대한 집계 결과를 얻을 수 있습니다. COUNT를 제외하고는 1개의 column에만 적용이 가능합니다. COUNT는 다수의 칼럼을 적용할 수 있다는 특징이 있습니다. 또한 category별로 묶어주기 위해서 GROUP BY를 활용할 수 있습니다. 보통 GROUP BY는 WHERE절 뒤에서 사용됩니다. query문을 작성할 때, query문 내부의 따옴표는 항상 밖의 따옴표와 다른 따옴표를 활용해야 합니다. 밖에서는 "를 사용했다면, 내부 조건에서는 '를 사용해야 오류 없이 잘 동작합니다.
engine = create_engine("sqlite:///data.db")
query = """SELECT borough, COUNT(*) FROM hpd311calls WHERE complaint_type = 'PLUMBING' GROUP BY borough;"""
plumbing_call_counts = pd.read_sql(query, engine)
4. Loading multiple tables with joins
관계형 데이터베이스에서는 2개 이상의 테이블을 하나의 테이블로 만들 때, join을 활용하게 됩니다. join을 하기 위해서는 동일한 값을 갖는 칼럼이 존재해야 하는 데, 이렇게 다른 테이블에 참조할 칼럼을 보통 외래키(foreign key)라고 부릅니다.
SELECT *
FROM hpd311calls
JOIN weather
ON hpd311calls.created_date = weather.date;
JOIN은 보통 FROM 뒤에 사용하고, hpd311calls와 JOIN 할 테이블 이름을 JOIN 뒤에 작성합니다. ON에는 hpd311calls의 칼럼과 weather의 칼럼 어떤 것을 기준으로 합칠 것인지를 알려주는 부분입니다. 최종적으로 JOIN까지 모두 적용해서 SQL 순서를 정하면, SELECT - FROM - JOIN - WHERE - GROUP BY 순으로 SQL 문을 작성해주면 됩니다.