乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

初心者

今回はSQLiteを用いた
超簡単なデータベース入門です。


解説動画はこちら



超簡単 SQLite入門

今回は
Google Colabでデータベースを使ってみましょう
SQLiteを用いてデータベースの操作の基本を
体験してみましょう


SQLiteとは

軽量な組み込み型データベースです。

一般的なRDBと使い方はほとんど一緒で
単一ファイルで管理されPython標準ライブラリで操作可能です。

小規模アプリ・学習用途に最適です。


データベースの仕組み


データベースはテーブルと呼ばれる
「表」形式のデータを複数組み合わせたものです。

表は複数のカラム(列)が存在し
データ行はレコードと呼ばれています。
スクリーンショット 2025-05-17 16.28.06

カラムはデータの形式によって
異なるデータ型を定義して格納できるようになっています。

通常のRDBはSQL文を用いて
テーブルの操作を行えるようになっています。

今回は詳細なSQL文の内容説明は省きますが
コードを実行すれば、SQL文を実行したことと同じ結果になります。




データベースの接続

ここからはデータベースの接続を行っていきましょう。

Google Colabでは初めから
SQLiteを使えるようになっています。

# データベース作成と接続
import sqlite3

# データベースの作成

# メモリに保存したい場合
# conn = sqlite3.connect(':memory:')

# ファイルに保存したい場合
conn = sqlite3.connect('sample.db')

# 接続
cursor = conn.cursor()

実行するとファイル置き場に
sample.db が出来上がります。



テーブルの作成

データベースを作成したら
その中にテーブルを作る事ができます。

cursor.execute でSQL文(CREATE文)を実行すると
テーブルを作成できます。

# テーブル作成CREATE文
create_query = '''
CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT,
    age INTEGER
)
'''
# テーブル作成を実行
cursor.execute(create_query)
conn.commit()

# テーブルの確認
query = "select name from sqlite_master where type = 'table';"
cursor.execute(query)
cursor.fetchall()


データの投入

INSERT文を実行してデータを投入することができます。

INSERT INTO テーブル名 VALUES (?, ?, ?)

テーブルのカラムの個数と
? の個数を合わせておく必要があります。

投入するデータも、カラムの個数に合わせた
リスト型で定義しましょう。

# データを3件挿入
users_data = [
    (1, 'Alice', 25),
    (2, 'Bob', 30),
    (3, 'Charlie', 22)
]
cursor.executemany('INSERT INTO users VALUES (?, ?, ?)', users_data)
conn.commit()

ここまで実行すると、3件分のデータが格納されると思います。


データの取得

データの取得は
SELECT文を実行してデータを取得する事ができます。

SELECT 抽出カラム FROM テーブル名

# 全件取得
cursor.execute('SELECT * FROM users')
rows = cursor.fetchall()

# 結果を表示
for row in rows:
    print(row)
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 22)



条件付きでデータ取得(WHERE)

SELECT文のWHERE句を加えると
条件を指定することができます。

SELECT 抽出カラム FROM テーブル名 WHERE 条件

# 条件付きで取得(年齢 > 23) 
cursor.execute('SELECT name FROM users WHERE age > 23')
print(cursor.fetchall())

[('Alice',), ('Bob',)]



データの更新(UPDATE)

UPDATE文を実行するとデータを更新することができます。

UPDATE テーブル名 SET 更新カラム名 WHERE 条件

# データの更新(Bobの年齢を35に)
cursor.execute("UPDATE users SET age = 35 WHERE name = 'Bob'")
conn.commit()
cursor.execute('SELECT * FROM users')
print(cursor.fetchall())
[(1, 'Alice', 25), (2, 'Bob', 35), (3, 'Charlie', 22)]


データの削除(DELETE)

データの削除はDELETE文を実行して行えます。

DELETE FROM テーブル名 WHERE 条件

# データの削除(Charlieを削除)
cursor.execute("DELETE FROM users WHERE name = 'Charlie'")
conn.commit()
cursor.execute('SELECT * FROM users')
print(cursor.fetchall())
[(1, 'Alice', 25), (2, 'Bob', 35)]



Pandasライブラリでデータ取得

pandasデータフレームでもテーブルからデータ取得できます。

import pandas as pd

df = pd.read_sql_query("SELECT * FROM users", conn)
df


応用編

ビットコインの取引データを取得してテーブルに格納する

取引データを格納するデータベースとテーブルを新たに作ります。
import requests
import sqlite3

# SQLiteデータベースの接続
conn = sqlite3.connect('trades.db')
cursor = conn.cursor()

# 取引テーブルの作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS trades (
    id INTEGER PRIMARY KEY,
    amount REAL,
    rate REAL,
    pair TEXT,
    order_type TEXT,
    created_at DATETIME
)
''')

次のコードを実行すると取引データをDBに格納できます。

# 取引データを取得
# コインチェックのAPIエンドポイント
url = 'https://coincheck.com/api/trades'
params = {'pair': 'btc_jpy', 'limit': 100}
response = requests.get(url, params=params)
data = response.json()

if data['success']:
    # 取引データをデータベースにUPSERT
    for trade in data['data']:
        cursor.execute('''
        INSERT INTO trades (id, amount, rate, pair, order_type, created_at)
        VALUES (?, ?, ?, ?, ?, ?)
        ON CONFLICT(id) DO UPDATE SET
        amount = excluded.amount,
        rate = excluded.rate,
        pair = excluded.pair,
        order_type = excluded.order_type,
        created_at = excluded.created_at
        ''', (trade['id'], float(trade['amount']), float(trade['rate']), trade['pair'], trade['order_type'], trade['created_at']))
    conn.commit()

conn.close()
print("取引データの取得とUPSERTが完了しました。")


ここから先は
Pandasデータフレームで取引データを見てみましょう。

import pandas as pd
import sqlite3

conn = sqlite3.connect('trades.db')
cursor = conn.cursor()

df = pd.read_sql_query("SELECT * FROM trades", conn)

# created_atをdatetime型に変換
df['created_at'] = pd.to_datetime(df['created_at'])
df.set_index('created_at', inplace=True)

取引データを1分単位で集計してみやすくします。
minute_candles = df.resample('min').agg(
    open=('rate', 'first'),
    high=('rate', 'max'),
    low=('rate', 'min'),
    close=('rate', 'last'),
    volume=('amount', 'sum'),
    count=('rate', 'count')
).dropna()

minute_candles["volatility"] = minute_candles["high"] - minute_candles["low"]
minute_candles["volatility_rate"] = minute_candles["volatility"] / minute_candles["close"]
minute_candles["volume_avg"] = minute_candles["volume"] / minute_candles["count"]
スクリーンショット 2025-05-17 16.27.55



最後は可視化です。
集計したデータをplotlyで可視化します。

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# subplot作成(上下2段)
fig = make_subplots(
    rows=2, cols=1,
    shared_xaxes=True,
    row_heights=[0.7, 0.3],
    vertical_spacing=0.02,
    subplot_titles=('ローソク足チャート', '出来高(Volume)')
)

# ローソク足(上段)
fig.add_trace(
    go.Candlestick(
        x=minute_candles.index,
        open=minute_candles['open'],
        high=minute_candles['high'],
        low=minute_candles['low'],
        close=minute_candles['close'],
        name='Candlestick'
    ),
    row=1, col=1
)

# 出来高(棒グラフ・下段)
fig.add_trace(
    go.Bar(
        x=minute_candles.index,
        y=minute_candles['volume'],
        name='Volume',
        marker_color='gray',
        opacity=0.5
    ),
    row=2, col=1
)

# レイアウト調整
fig.update_layout(
    title='ローソク足 + Volume(出来高)チャート',
    xaxis_rangeslider_visible=False,
    showlegend=False,
    height=600
)
fig.show()
スクリーンショット 2025-05-17 16.27.45





まとめ


SQLiteを用いると
非常に簡単にデータベースをセットアップできます。

データ投入や検索もPythonであれば
数行で行う事ができるので
非常に便利です。

これからSQLやデータベースを勉強したい方は
ぜひSQLiteを使ってみてください。

それでは。

Googleスプレッドシートでは
簡易なデータを取り込んで
SQLを使うことができるようになっています。

今回はそのやり方をご紹介します。

解説動画はこちら




データの取り込み

さてまずはデータを取り込みしてみましょう。

外部からデータを取り込む関数があります。
これでデータを取り込んでみましょう。

スプレッドシートを立ち上げて
シートのA1にこのコードを貼り付けて
実行してみましょう。

=IMPORTDATA("https://gist.githubusercontent.com/michhar/2dfd2de0d4f8727f873422c5d959fff5/raw/fa71405126017e6a37bea592440b4bee94bf7b9e/titanic.csv")
スクリーンショット 2020-10-31 17.26.19

IMPORTDATA("外部データのURL")
で外部データを取り込みできます。


あまり大きなデータは取り込めずに
エラーになってしまうようです。
目安は16000行ほどです。

小さなデータであれば
大丈夫でしょう。





QUERYの実行方法

データが取り込めたら
次はSQLを使う関数です。
QUERY関数でSQLを実行できます。

QUERY(<データ範囲>, "クエリ")

第一引数にデータ範囲を指定します。

クエリの対象データの範囲は
シートの位置を指定します。

今回取り込んだデータが
A:L列まで、892行目までのデータでした。

指定としては A1:L892
で全部を範囲指定できます。

SQLのSELECT文で言う
FROM句に該当します。

第二引数にクエリを書いていきます。


SELECT句

第二引数として指定する
クエリの部分です。

SELECT句の書き方は文を
「"」ダブルクォートで囲みます。

基本は
SELECT 列の位置
です。

列の位置はスプレッドシートの
列の位置を指定してください。

=QUERY(A1:L892 , "SELECT B , C")

このようにすれば
結果はB,Cの列のデータが出力されます。

SurvivedPclass
03
11
13


複数列の場合は「,」カンマで
つなぐことになります。

FROM句はQUERY関数の
第一引数で指定している部分なので
第二引数の所では不要になります。

WHERE句

次にWHERE句です。

条件指定をするところですね。

SELECT句の次に
WHERE句を指定します。
=QUERY(A1:L892, "SELECT D WHERE B = 1 AND E = 'male'")

Name
Williams, Mr. Charles Eugene
Beesley, Mr. Lawrence
Sloper, Mr. William Thompson




条件式の書き方は
通常のSQLと同様です。

列の値が一致するかどうかは = で判定
文字列を比較する場合は
文字列を「'」シングルクォートで囲みます。

数値の比較にはクォートは不要です。

LIKEで文字列の部分一致を
指定することもできます。

=QUERY(A1:L892, "SELECT D WHERE D like'%Mr.%'")

LIKEの後に
一致させたいところを書き
可変部分を % という形で指定します。


GROUP BY句

GROUP BY句はWHERE句の後に
指定をします。

グループ化したい列を指定して
SELECT句で集計関数を
使うことができるようになります。

ここではB列をグループ化して
A列の個数を数えてみます。

=QUERY(A1:L892, "SELECT B, COUNT(A) GROUP BY B")

Survived
count 
0549
1342

このような形で集計結果が出力されます。


PIVOT

PIVOTは機能としても有るようですが
GROUP BYの結果と違って
横に出力させることができます。

グループ化して集計した結果が
列方向に並ぶように出力されます。

=QUERY(A1:L892, "SELECT AVG(F) PIVOT C")
123
38.2334408629.8776300625.14061972



ORDER BY句

ORDER BY は並びかえです。

ORDER BY 並び替えしたい列名

デフォルトでは昇順
降順に並び替えたければ
DESCをつけます。

=QUERY(A1:L892, "SELECT F, COUNT(A) GROUP BY F ORDER BY F")
Age
count PassengerId
177
0.421
0.671
0.752


こんな形で簡易的にですが
スプレッドシートでSQLを
使うことができます。

意外と知られてはいないと思うので
使えると、仕事できる人感が
出るのではないでしょうかwww

是非使ってみてください。
それでは。


このページのトップヘ