<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 2T_Pandas로 배우는 SQL 시작하기 (2) - JOIN ON
Step3:  텍스트 마이닝
특정 텍스트가 포함되어 있는 row를 가져오는 방법
GovernmentForm 에 "Republic"이라는 텍스트가 포함된 열 가져오기
1. pandas로
contains, startswith, endswith
Step4:  JOIN(pandas에서는 merge 기능)
"sakila"로 들어와서 실습
Step5:  address(주소), customer(이름)
pandas merge를 이용해서 유저의 이름과 주소가 같이 있는 DataFrame을 만들어보기
Step8:  sql로 하는 첫번째 방법 => 바보 같은 방법이지만 중요하다. 원리를 이해해라
Step10:  customer 599개 address는 603개가 있는 상황
Step12:  599 * 603 = 361197
데이터를 받아오는 데 오랜 시간이 걸렸다.
Step16:  즉, 데이터 테이블을 합친 다음에 ( 모든 row에 대한 곱 )
WHERE 조건문을 통해서 우리가 원하는 데이터만 가져오자.
Step17:  pandas보다 sql에서 JOIN을 활용
sql 1번과 2번 중 무엇을 써야 하는가? JOIN!! JOIN을 쓰면 코드가 한 눈에 안 들어온다.
SQL (1) - SELECT ____ WHERE
SQL (2) - SELECT _ FROM _ JOIN ____
굳이 JOIN을 안 쓰더라도 상관 없어. WHERE문만 써도 괜찮아
World DB에서 Country와 City를 합쳐라. (Country Name, City Name)
3가지 방법으로. SQL(where, join)과 Pandas(merge)
Step18:  (1) Pandas_merge
Step21:  1. 바보 같지만 원리가 중요한 방법(sql)
Step23:  2. JOIN을 이용한 방법(DB를 생각해주는 착한 방법)
<ASSISTANT_TASK:>
Python Code:
import pymysql
db = pymysql.connect(
    "db.fastcamp.us",
    "root",             
    "dkstncks",
    "world",
    charset='utf8',
)
df = pd.read_sql("SELECT * FROM Country;", db)
#cursor
cursor = db.cursor()
# 1. 실제로 명령을 수행하는 부분 - 서버
cursor.execute("SELECT * FROM Country;")
# 2. 데이터를 가져오는 부분 - 서버 => 클라이언트
cursor.fetchall()   #결과를 불러 온다. Pandas는 사실 이걸 읽는 것이다.
pd.read_sql("SELECT * FROM Country;", db)
Explanation: 2T_Pandas로 배우는 SQL 시작하기 (2) - JOIN ON
End of explanation
country_df = pd.read_sql("SELECT * FROM Country;", db)
country_df[country_df["GovernmentForm"].str.contains("Republic")].head(2)
country_df[country_df["GovernmentForm"].str.startswith("Republic")].head(2)
country_df[country_df["GovernmentForm"].str.endswith("Republic")].head(2)
gf_str = country_df["GovernmentForm"].str
gf_str. #이렇게 해서 str에 어떤 기능들이 있는 지 확인할 수 있다.
# SQL을 이용
SQL_QUERY = 
    SELECT Name, GovernmentForm
    From Country
    WHERE
        GovernmentForm LIKE "Republic"
    ;
pd.read_sql(SQL_QUERY, db).head()
SQL_QUERY = 
    SELECT Name, GovernmentForm
    From Country
    WHERE
        GovernmentForm LIKE "%Republic%"
    ;
pd.read_sql(SQL_QUERY, db)
Explanation: 텍스트 마이닝
특정 텍스트가 포함되어 있는 row를 가져오는 방법
GovernmentForm 에 "Republic"이라는 텍스트가 포함된 열 가져오기
1. pandas로
contains, startswith, endswith
End of explanation
db = pymysql.connect(
    "db.fastcamp.us",
    "root",
    "dkstncks",
    "sakila",
    charset = "utf8",
)
Explanation: JOIN(pandas에서는 merge 기능)
"sakila"로 들어와서 실습
End of explanation
customer_df = pd.read_sql("SELECT * FROM customer;", db)
address_df = pd.read_sql("SELECT * FROM address;", db)
customer_df.columns
address_df.columns
customer_df.merge(address_df, on="address_id")[["first_name", "last_name", "address"]]
# left_on="address_id"
# right_on="address_id"
# => on...
Explanation: address(주소), customer(이름)
pandas merge를 이용해서 유저의 이름과 주소가 같이 있는 DataFrame을 만들어보기
End of explanation
SQL_QUERY = 
    SELECT COUNT(*)
    FROM customer
    ;
pd.read_sql(SQL_QUERY, db).head()
SQL_QUERY = 
    SELECT COUNT(*)
    FROM address
    ;
pd.read_sql(SQL_QUERY, db).head()
Explanation: sql로 하는 첫번째 방법 => 바보 같은 방법이지만 중요하다. 원리를 이해해라
End of explanation
SQL_QUERY = 
    SELECT COUNT(*)
    FROM customer, address
    ;
pd.read_sql(SQL_QUERY, db).head()
Explanation: customer 599개 address는 603개가 있는 상황
End of explanation
SQL_QUERY = 
    SELECT customer.first_name, customer.last_name, address.address
    FROM customer, address
    WHERE
        customer.address_id = address.address_id
    ;
df = pd.read_sql(SQL_QUERY, db).head()
Explanation: 599 * 603 = 361197
데이터를 받아오는 데 오랜 시간이 걸렸다.
End of explanation
SQL_QUERY = 
    SELECT customer.first_name, customer.last_name, address.address
    FROM customer
    JOIN address ON customer.address_id = address.address_id
    ;
pd.read_sql(SQL_QUERY, db).head()
import time
start_time = time.time()
customer_df = pd.read_sql("SELECT * FROM customer;", db)
address_df = pd.read_sql("SELECT * FROM address;", db)
df = customer_df.merge(address_df, on="address_id")
end_time = time.time()
exec_time = end_time - start_time
print(exec_time)
start_time = time.time()
SQL_QUERY = 
    SELECT customer.first_name, customer.last_name, address.address
    FROM customer, address
    WHERE
        customer.address_id = address.address_id
    ;
df = pd.read_sql(SQL_QUERY, db)
end_time = time.time()
exec_time = end_time - start_time
print(exec_time)
start_time = time.time()
SQL_QUERY = 
    SELECT customer.first_name, customer.last_name, address.address
    FROM customer
    JOIN address ON customer.address_id = address.address_id
    ;
pd.read_sql(SQL_QUERY, db)
end_time = time.time()
exec_time = end_time - start_time
print(exec_time)
Explanation: 즉, 데이터 테이블을 합친 다음에 ( 모든 row에 대한 곱 )
WHERE 조건문을 통해서 우리가 원하는 데이터만 가져오자.
End of explanation
db = pymysql.connect(
    "db.fastcamp.us",
    "root",             
    "dkstncks",
    "world",
    charset='utf8',
)
country_df = pd.read_sql("SELECT * FROM Country;", db)
city_df = pd.read_sql("SELECT * FROM City;", db)
Explanation: pandas보다 sql에서 JOIN을 활용
sql 1번과 2번 중 무엇을 써야 하는가? JOIN!! JOIN을 쓰면 코드가 한 눈에 안 들어온다.
SQL (1) - SELECT ____ WHERE
SQL (2) - SELECT _ FROM _ JOIN ____
굳이 JOIN을 안 쓰더라도 상관 없어. WHERE문만 써도 괜찮아
World DB에서 Country와 City를 합쳐라. (Country Name, City Name)
3가지 방법으로. SQL(where, join)과 Pandas(merge)
End of explanation
country_df.columns
city_df.columns
city_df.merge(country_df, right_on="Code", left_on="CountryCode")[["Name_x", "Name_y"]]
Explanation: (1) Pandas_merge
End of explanation
SQL_QUERY = 
    SELECT Country.Name "Country Name", City.Name "City Name"
    FROM Country, City
    WHERE Country.Code = City.CountryCode
    ;
pd.read_sql(SQL_QUERY, db).head(2)
SQL_QUERY = 
    SELECT co.Name "Country Name", ci.Name "City Name"
    FROM Country co, City ci
    WHERE co.Code = ci.CountryCode
    ;
pd.read_sql(SQL_QUERY, db).head(2)
Explanation: 1. 바보 같지만 원리가 중요한 방법(sql)
End of explanation
SQL_QUERY = 
    SELECT co.Name "Country Name", ci.Name "City Name"
    FROM Country co
        JOIN City ci 
        ON co.code = ci.CountryCode
    ;
pd.read_sql(SQL_QUERY, db).head(2)
Explanation: 2. JOIN을 이용한 방법(DB를 생각해주는 착한 방법)
End of explanation
<END_TASK>