SQLの基本SELECT文

SELECTはデータベースからデータを読み込む時に使います。条件を指定して、読み込むデータを選ぶこともできます。

SELECT文の文法

SELECT 列名 FROM テーブル名

複数の列を選ぶことも可能

SELECT 列名1, 列名2
FROM テーブル名

*を使うと、すべての列を読み込めます。

SELECT * FROM テーブル名

SQL文を試す前に、ちょっとした関数を作って、結果がDataFrameで返ってくるようにしましょう。

In [1]:
import sqlite3
import pandas as pd
con = sqlite3.connect("sakila.db")

# 関数を作って、SQL文の実行結果をDataFrameにして返します。

def sql_to_df(sql_query):

    # read_sqlの引数に、SQL文とデータベースへのConnectionを渡します。
    df = pd.read_sql(sql_query, con)

    # 結果のDataFrameを返します。
    return df

SELECT文を使った複数列の選択

In [2]:
query = ''' select first_name,last_name
            from customer; '''

sql_to_df(query).head()
Out[2]:
first_name last_name
0 MARY SMITH
1 PATRICIA JOHNSON
2 LINDA WILLIAMS
3 BARBARA JONES
4 ELIZABETH BROWN

*を使ってすべての列を読み込む

In [3]:
query = ''' SELECT *
            FROM customer; '''

sql_to_df(query).head()
Out[3]:
customer_id store_id first_name last_name email address_id active create_date last_update
0 1 1 MARY SMITH MARY.SMITH@sakilacustomer.org 5 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
1 2 1 PATRICIA JOHNSON PATRICIA.JOHNSON@sakilacustomer.org 6 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
2 3 1 LINDA WILLIAMS LINDA.WILLIAMS@sakilacustomer.org 7 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
3 4 2 BARBARA JONES BARBARA.JONES@sakilacustomer.org 8 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
4 5 1 ELIZABETH BROWN ELIZABETH.BROWN@sakilacustomer.org 9 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28

DISTINCTの使い方

distinctを使うと、重複する値をまとめて1つだけ表示されるようにできます。

SELECT DISTINCT 列名
FROM テーブル名;

In [5]:
# country_idは沢山あります。
query = ''' SELECT country_id
            FROM city'''

sql_to_df(query).head()
Out[5]:
country_id
0 1
1 2
2 2
3 2
4 3
In [4]:
# country_idをまとめます。
query = ''' SELECT DISTINCT(country_id)
            FROM city'''

sql_to_df(query).head()
Out[4]:
country_id
0 1
1 2
2 3
3 4
4 5

WHEREを使った検索条件の指定

SELECT文の最後に、WHERE節を付けると、検索の条件を指定できます。

SELECT 列名
FROM テーブル名
WHERE 列名 ( =や<などの演算子) 条件の値;

In [6]:
# お店の番号で、お客さんを絞り込みます。
query = ''' SELECT *
            FROM customer
            WHERE store_id = 1'''

sql_to_df(query).head()
Out[6]:
customer_id store_id first_name last_name email address_id active create_date last_update
0 1 1 MARY SMITH MARY.SMITH@sakilacustomer.org 5 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
1 2 1 PATRICIA JOHNSON PATRICIA.JOHNSON@sakilacustomer.org 6 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
2 3 1 LINDA WILLIAMS LINDA.WILLIAMS@sakilacustomer.org 7 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
3 5 1 ELIZABETH BROWN ELIZABETH.BROWN@sakilacustomer.org 9 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28
4 7 1 MARIA MILLER MARIA.MILLER@sakilacustomer.org 11 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28

様々な演算子が利用できます。

演算子 説明
等しい
<> 等しくない。一部のSQL実行エンジでは、!=と書かれるこも。
> より大きい
< より小さい
>= 以上
<= 以下

SQLでは数字はそのまま書けますが、テキストは引用符で囲む必要があります。

In [7]:
# お客さんの名前で検索
query = ''' SELECT *
            FROM customer
            WHERE first_name = 'MARY'  '''

sql_to_df(query).head()
Out[7]:
customer_id store_id first_name last_name email address_id active create_date last_update
0 1 1 MARY SMITH MARY.SMITH@sakilacustomer.org 5 1 2006-02-14 22:04:36.000 2011-09-14 18:10:28

ANDの使い方

複数の条件を同時に満たしてほしい場合、ANDを使います。

In [8]:
# 2006年のR指定映画を選びます。

query = ''' SELECT *
            FROM film
            WHERE release_year = 2006
            AND rating = 'R' '''

sql_to_df(query).head()
Out[8]:
film_id title description release_year language_id original_language_id rental_duration rental_rate length replacement_cost rating special_features last_update
0 8 AIRPORT POLLOCK A Epic Tale of a Moose And a Girl who must Con... 2006 1 None 6 4.99 54 15.99 R Trailers 2011-09-14 18:05:33
1 17 ALONE TRIP A Fast-Paced Character Study of a Composer And... 2006 1 None 3 0.99 82 14.99 R Trailers,Behind the Scenes 2011-09-14 18:05:33
2 20 AMELIE HELLFIGHTERS A Boring Drama of a Woman And a Squirrel who m... 2006 1 None 4 4.99 79 23.99 R Commentaries,Deleted Scenes,Behind the Scenes 2011-09-14 18:05:33
3 21 AMERICAN CIRCUS A Insightful Drama of a Girl And a Astronaut w... 2006 1 None 3 4.99 129 17.99 R Commentaries,Behind the Scenes 2011-09-14 18:05:33
4 23 ANACONDA CONFESSIONS A Lacklusture Display of a Dentist And a Denti... 2006 1 None 3 0.99 92 9.99 R Trailers,Deleted Scenes 2011-09-14 18:05:33

ORの使い方

条件をORで繋ぐと、どちらか一方の条件が満たされたとき、その行(レコード)が返ります。

In [9]:
# R指定もしくは、PG指定の映画を選びます。

query = ''' SELECT *
            FROM film
            WHERE rating = 'PG'
            OR rating = 'R' '''

sql_to_df(query).head()
Out[9]:
film_id title description release_year language_id original_language_id rental_duration rental_rate length replacement_cost rating special_features last_update
0 1 ACADEMY DINOSAUR A Epic Drama of a Feminist And a Mad Scientist... 2006 1 None 6 0.99 86 20.99 PG Deleted Scenes,Behind the Scenes 2011-09-14 18:05:32
1 6 AGENT TRUMAN A Intrepid Panorama of a Robot And a Boy who m... 2006 1 None 3 2.99 169 17.99 PG Deleted Scenes 2011-09-14 18:05:33
2 8 AIRPORT POLLOCK A Epic Tale of a Moose And a Girl who must Con... 2006 1 None 6 4.99 54 15.99 R Trailers 2011-09-14 18:05:33
3 12 ALASKA PHANTOM A Fanciful Saga of a Hunter And a Pastry Chef ... 2006 1 None 6 0.99 136 22.99 PG Commentaries,Deleted Scenes 2011-09-14 18:05:33
4 13 ALI FOREVER A Action-Packed Drama of a Dentist And a Croco... 2006 1 None 4 4.99 150 21.99 PG Deleted Scenes,Behind the Scenes 2011-09-14 18:05:33