引き続きSQLについて学んで行きましょう。
必要なものをimportして、関数を作っておきます。
import sqlite3
import pandas as pd
con = sqlite3.connect("sakila.db")
#前のレクチャーのものをそのまま使って構いません。
def sql_to_df(sql_query):
df = pd.read_sql(sql_query, con)
return df
データをまとめる関数の一覧です。group byと一緒に使うと便利です。
具体的な使い方を見ていきましょう。
# お客さんの人数を数えます。
query = ''' SELECT COUNT(customer_id)
FROM customer; '''
sql_to_df(query).head()
基本的な使い方は、以下の様な感じです。
SELECT 列名, まとめる関数(列名)
FROM テーブル名
WHERE ・・・
ワイルドカード | 説明 |
---|---|
% | 0個以上の文字を置き換えるものと解釈されます。 |
_ | 1文字だけをワイルドカードにします。 |
[文字のリスト] | いくつか、文字の候補を並べることが出来ます。 |
実際の例を見てみましょう。
# まずは、% から
# 名前がMから始まるお客さん全員
query = ''' SELECT *
FROM customer
WHERE first_name LIKE 'M%' ; '''
sql_to_df(query).head()
# 次に、_
# 名字が4文字で、INGで終わる人
query = ''' SELECT *
FROM customer
WHERE last_name LIKE '_ING' ; '''
sql_to_df(query).head()
[文字のリスト] を使った例です。
SQLにも若干違い(方言)があります。
MySQLでは、
WHERE value LIKE '[文字リスト]%'
SQLiteでは、
WHERE value GLOB '[文字リスト]*'
# 実際にやってみましょう。
# 名前がAまたはBで始まる人をとってきます。
query = ''' SELECT *
FROM customer
WHERE first_name GLOB '[AB]*' ; '''
sql_to_df(query).head()
ORDER BYを使うと、結果を並べ替えることが出来ます。デフォルトでは、昇順(小さいものから大きいものへ)に並びます。DESCというキーワードを使うと、これを逆の降順にすることが出来ます。
SELECT 列名
FROM テーブル名
ORDER BY 列名 [DESC]
# すべてのお客さんを、その名字で並べて返します。
query = ''' SELECT *
FROM customer
ORDER BY last_name ; '''
sql_to_df(query).head()
# 順番を逆にします。
query = ''' SELECT *
FROM customer
ORDER BY last_name DESC; '''
sql_to_df(query).head()
GROUP BYと関数を一緒に使うと、複数の行(レコード)をまとめることが出来ます。
SELECT 列名, 関数(列名)
FROM テーブル名
WHERE ・・・
GROUP BY 列名;
# お店ごとのお客さんの数を数えます。
query = ''' SELECT store_id , COUNT(customer_id)
FROM customer
GROUP BY store_id; '''
sql_to_df(query).head()