PythonでSQLのサブクエリ・結合を使う基本と実践例|初心者でもわかるデータ取得の考え方
生徒
「Pythonでデータベースを使っていると、テーブルが増えてきて、どうやってデータを組み合わせればいいのかわからなくなります…」
先生
「そんなときに使うのが、SQLの結合やサブクエリです。複数の表をまとめて扱えるようになります。」
生徒
「名前が難しそうですが、初心者でも理解できますか?」
先生
「考え方は意外とシンプルです。身近な例えを使って、順番に見ていきましょう。」
1. SQLで複数の表を扱う理由
SQLデータベースでは、情報を一つの表にまとめず、役割ごとに分けて保存することが多いです。例えば、ユーザー情報の表と注文情報の表を分けて管理します。これは、ノートを科目ごとに分けるのと同じ考え方です。
PythonでSQLを使うときも、この分かれた表を組み合わせてデータを取り出す必要があります。そのために使われるのが「結合」と「サブクエリ」です。
2. 結合とは何かをイメージで理解する
結合とは、複数のテーブルを共通の情報でつなぎ合わせる仕組みです。例えば、名簿と成績表を「学籍番号」でつなぐと、一人ひとりの名前と成績を同時に見られます。
SQLでは、この処理をJOINと呼びます。PythonからSQLを実行しても、考え方は同じです。
import sqlite3
conn = sqlite3.connect("sample.db")
cursor = conn.cursor()
cursor.execute("""
SELECT users.name, orders.price
FROM users
JOIN orders ON users.id = orders.user_id
""")
rows = cursor.fetchall()
for row in rows:
print(row)
3. INNER JOINの基本的な使い方
INNER JOINは、両方の表に共通するデータだけを取り出す結合方法です。ユーザーと注文の両方に存在する情報だけを表示したい場合に使われます。
これは、名簿と出席表を見比べて、両方に名前がある人だけを確認するようなイメージです。
4. サブクエリとは何か
サブクエリとは、SQLの中に書かれた「小さなSQL」のことです。まず条件を決めてから、その結果を使って次の検索を行います。
料理で例えると、先に材料を選び、その材料だけを使って調理するような流れです。処理の順番を整理したいときに便利です。
cursor.execute("""
SELECT name
FROM users
WHERE id IN (
SELECT user_id
FROM orders
WHERE price >= 3000
)
""")
for row in cursor.fetchall():
print(row[0])
5. サブクエリと結合の違い
結合は、複数の表を横につなげて一度に表示する方法です。一方、サブクエリは、条件を段階的に絞り込む方法です。
どちらも同じ結果を得られる場合がありますが、考え方が違います。初心者のうちは、「表をつなぐなら結合」「条件を先に決めたいならサブクエリ」と覚えると理解しやすくなります。
6. Pythonでサブクエリを使うときの注意点
PythonからSQLを実行する場合、SQL文は文字列として書かれます。そのため、構文が複雑になると、読みづらくなりがちです。
サブクエリを使うときは、改行を入れて見やすく書くことで、後から見返したときに理解しやすくなります。
query = """
SELECT name
FROM users
WHERE id = (
SELECT user_id
FROM orders
WHERE order_id = 1
)
"""
cursor.execute(query)
print(cursor.fetchone())
7. 結合とサブクエリの実践的な使い分け
実際の開発では、結合とサブクエリを場面に応じて使い分けます。一覧表示のように多くの情報を一度に出したい場合は結合が向いています。
一方で、「特定の条件を満たす人だけを探したい」といった場合は、サブクエリの方が考えやすいことがあります。どちらが正解というわけではなく、読みやすさや理解しやすさが大切です。
8. 初心者がつまずきやすいポイント
SQLの結合やサブクエリでつまずきやすい原因は、「どの表のどの列を使っているのか」が分からなくなることです。紙に表の関係を書き出すと、頭の中が整理されます。
PythonでSQLを扱う場合も、データの流れを意識しながら書くことで、理解しやすくなります。