見出し画像

SQLite データベース活用①

これまでの投稿でデータベース操作の基本"CRUD"についてまとめました。ここからは、作成したデータベースを活用する方法を紹介します。


データの抽出 WHERE(応用編)

データ抽出に関しては、データベース作成②でWHERE句を紹介していますが、今回はその応用編です。今回もその時使用したdrugs.dbの中のGLP1テーブルを使用するのでデータベースを準備します。

import sqlite3
db = sqlite3.connect('drugs.db')
cur = db.cursor()

# テーブルの中身を確認
cur.execute('SELECT * FROM GLP1')
results = cur.fetchall()
for result in results:
    print(result)

あいまい検索

以前の投稿では以下のようなサンプルコードを示しました。

cur.execute('SELECT * FROM GLP1 WHERE maker = "イーライリリー"')
results = cur.fetchall()
for result in results:
    print(result)

WHEREに続く「maker = "イーライリリー"」が検索条件式でしたが、条件式に「=」が入っていると完全一致するものしか抽出できません。
時には、「トル何とか」みたいな感じで部分一致で抽出できると便利です。このようなあいまい検索をするためにLIKE句と以下のような記号(ワイルドカード)を組み合わせて使用します。

  • %(パーセント):任意の文字列(0文字以上)

  • _(アンダースコア):任意の1文字

「maker = "○○"」を「maker LIKE "○○"」に変えてみます。

cur.execute('SELECT * FROM GLP1 WHERE maker LIKE "%ノ%"')
results = cur.fetchall()
for result in results:
    print(result)

「maker LIKE "%ノ%"」とすることでメーカー名に「ノ」が含まれるレコードが抽出できました。%は0文字でも良いので、「ノ」は先頭でも末尾でも抽出されます。

次に、「maker LIKE "_ノ%"」に変えてみます。

cur.execute('SELECT * FROM GLP1 WHERE maker LIKE "_ノ%"')
results = cur.fetchall()
for result in results:
    print(result)

今度はメーカー名が「サノフィ」の1レコードのみとなりました。この検索条件では、メーカー名の2番目が「ノ」であるレコードが検索されます。

個人的には、アンダースコアを使用して文字数指定することはほとんど無く、入力した文字列の前後に自動で「%」を付けて、条件式に組み込んでしまうことが多いです。

search = input('検索ワード')
search = '%' + search + '%'
cur.execute(f'SELECT * FROM GLP1 WHERE name LIKE "{search}"')
results = cur.fetchall()
for result in results:
    print(result)

これで、「トル何とか」にも対応できます。

AND/OR

複数条件で抽出することもできます。やり方は簡単で、WHERE句以降の条件式をANDもしくはORで繋げるだけです。

WHERE 条件式1 AND 条件式2
WHERE 条件式1 OR 条件式2

例えば、剤型が注射(form = 2)かつメーカーがノボ社のGLP1阻害剤を抽出するには以下のようなコードになります。

cur.execute("""
            SELECT * FROM GLP1 
            WHERE form = 2
            AND maker LIKE "%ノボ%"
            """)
results = cur.fetchall()
for result in results:
    print(result)

複数の条件を複雑に組み合わせたい場合は括弧を使って条件をグループ化することができます。例えば、「WHERE 条件式1 AND (条件式2 OR 条件式3)」とすると、「条件式2もしくは条件式3を満たし、かつ条件式1を満たす」レコードが抽出できます。

NOT

また、条件式に当てはまらないレコードを抽出する場合はNOTを使用します。

WHERE NOT 条件式

先ほどのコードにNOTを入れてみます。

cur.execute("""
            SELECT * FROM GLP1 
            WHERE NOT form = 2
            AND maker LIKE "%ノボ%"
            """)
results = cur.fetchall()
for result in results:
    print(result)

すると、剤型が2ではないノボ社製品のレコードが抽出されました。ANDの前後は同格になっていることが分かります。

今度は、上記コードに括弧をいれてみます。

cur.execute("""
            SELECT * FROM GLP1 
            WHERE NOT (form = 2
            AND maker LIKE "%ノボ%")
            """)
results = cur.fetchall()
for result in results:
    print(result)

NOTは括弧でまとめた条件式全体にかかるようになり、剤型が2かつノボ社ではないレコードを抽出することができました。

この記事が気に入ったらサポートをしてみませんか?