【SQL初心者でも安心】SQLiteでシンプルSELECTをマスター! データベース操作のはじめの一歩


SELECT 句の構文

SELECT 列名1, 列名2, ...
FROM テーブル名
[WHERE 条件式]
[ORDER BY ソート列名];


SELECT 氏名, 年齢, 住所
FROM 顧客情報
WHERE 性別 = '男性';

各要素の説明

  • ORDER BY
    結果をソートする列を指定します。
  • WHERE
    特定の条件に合致するレコードのみを取得するための条件式を指定します。
  • FROM
    データを取得するテーブル名を指定します。
  • 列名
    カンマ区切りで複数の列を指定できます。
  • SELECT
    取得したい列を指定します。

データ型と演算子

SQLite では、数値、文字列、日付など様々なデータ型を扱うことができます。また、条件式やソート処理において、比較演算子(=、<、>など)、論理演算子(AND、OR、NOTなど)、算術演算子(+、-、*、/など)などを利用できます。


SELECT 氏名, 年齢
FROM 顧客情報
WHERE 年齢 >= 20 AND 年齢 <= 30
ORDER BY 氏名 ASC;

ワイルドカードの使用

ワイルドカードを用いることで、あいまい検索を実行できます。

  • _
    1文字にマッチします。
  • %
    任意の文字列にマッチします。


SELECT *
FROM 商品情報
WHERE 商品名 LIKE '%シャツ%';

結果の取得方法

SELECT プログラミングを実行すると、結果セットと呼ばれるデータ構造が返されます。この結果セットを様々な方法で処理できます。

  • 集計処理
    COUNTSUMAVG などの集計関数を使用して、結果セットの統計情報を得ることができます。
  • 条件分岐
    結果セットの値に基づいて、処理を分岐できます。
  • ループ処理
    FOR ループを用いて、結果セットの各レコードを順に処理できます。


import sqlite3

# データベースへの接続
conn = sqlite3.connect('顧客情報.db')
cursor = conn.cursor()

# 全レコードを取得
cursor.execute('SELECT * FROM 顧客情報')
results = cursor.fetchall()

# 取得結果の処理
for row in results:
    print(f"氏名: {row[0]}、年齢: {row[1]}、住所: {row[2]}")

# データベースのクローズ
conn.close()
import java.sql.*;

public class SelectExample {

    public static void main(String[] args) {
        try {
            // データベースへの接続
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:顧客情報.db");
            Statement stmt = conn.createStatement();

            // 全レコードを取得
            ResultSet rs = stmt.executeQuery("SELECT * FROM 顧客情報");
            while (rs.next()) {
                System.out.println("氏名: " + rs.getString("氏名") +
                        ", 年齢: " + rs.getInt("年齢") +
                        ", 住所: " + rs.getString("住所"));
            }

            // データベースのクローズ
            rs.close();
            stmt.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
using System.Data.SQLite;

namespace SelectExample {
    class Program {
        static void Main(string[] args) {
            try {
                // データベースへの接続
                using (var conn = new SQLiteConnection("顧客情報.db")) {
                    conn.Open();
                    using (var cmd = new SQLiteCommand(conn)) {
                        cmd.CommandText = "SELECT * FROM 顧客情報";

                        // 結果セットの取得
                        using (var reader = cmd.ExecuteReader()) {
                            while (reader.Read()) {
                                Console.WriteLine("氏名: {0}, 年齢: {1}, 住所: {2}",
                                    reader.GetString(0), reader.GetInt32(1), reader.GetString(2));
                            }
                        }
                    }
                }
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            }
        }
    }
}

説明

上記のコードは、それぞれ Python、Java、C# で記述された、SQLite の SELECT プログラミングの例です。

  • データベースのクローズ
  • 取得結果の処理
  • 全レコードの取得
  • データベースへの接続

といった基本的な操作を、それぞれの言語でどのように実装するかを示しています。

  • より複雑なクエリを実行するには、WHERE 句や ORDER BY 句などのオプションを使用できます。
  • エラー処理や接続プーリングなどの機能を追加することもできます。
  • 上記のコードはあくまで一例であり、状況に合わせて変更する必要があります。


頻繁に使用する複雑な SELECT クエリを、ビューとして定義することで、シンプルな SELECT ステートメントで置き換えることができます。


CREATE VIEW 顧客情報_詳細 AS
SELECT 氏名, 年齢, 住所, 電話番号, メールアドレス
FROM 顧客情報;

SELECT * FROM 顧客情報_詳細;

サブクエリ

部分的な集計や条件絞り込みを必要とする場合、サブクエリを利用することで、シンプルな SELECT ステートメント内に複雑な処理を記述できます。


SELECT 氏名, 年齢, AVG(注文金額) AS 平均注文金額
FROM 顧客情報
JOIN 注文情報 ON 顧客情報.顧客ID = 注文情報.顧客ID
GROUP BY 氏名, 年齢;

COMMON TABLE EXPRESSION (CTE)

複数のサブクエリを組み合わせる必要がある場合、CTE を利用することで、可読性とメンテナンス性を向上させることができます。


WITH 顧客情報_詳細 AS (
    SELECT 氏名, 年齢, 住所, 電話番号, メールアドレス
    FROM 顧客情報
)
SELECT c.氏名, c.年齢, c.住所, o.注文日, o.商品名
FROM 顧客情報_詳細 AS c
JOIN 注文情報 AS o ON c.顧客ID = o.顧客ID;

マテリアライズドビュー

頻繁にアクセスされる集計結果などを、あらかじめデータベースに格納しておくことで、パフォーマンスを向上させることができます。


CREATE MATERIALIZED VIEW 顧客情報_集計 AS
SELECT 氏名, 年齢, COUNT(*) AS 注文件数
FROM 顧客情報
JOIN 注文情報 ON 顧客情報.顧客ID = 注文情報.顧客ID
GROUP BY 氏名, 年齢;

導出列

テーブル定義に導出列を追加することで、計算結果を列として格納することができます。


ALTER TABLE 顧客情報
ADD COLUMN 平均注文金額 AS (
    SELECT AVG(注文金額)
    FROM 注文情報
    WHERE 顧客情報.顧客ID = 注文情報.顧客ID
    GROUP BY 顧客情報.顧客ID
);

ウィンドウ関数

分析処理において、前後のレコードを参照するような集計やランキングなどを、ウィンドウ関数を利用することで実現できます。


SELECT 氏名, 年齢, RANK() OVER (ORDER BY 注文金額 DESC) AS 順位
FROM 顧客情報
JOIN 注文情報 ON 顧客情報.顧客ID = 注文情報.顧客ID;

仮想テーブル

外部データソースや複雑なクエリ結果を、一時的なテーブルとして扱うことで、シンプルな SELECT ステートメントで処理することができます。


CREATE TEMPORARY TABLE 顧客情報_絞り込み AS
SELECT *
FROM 顧客情報
WHERE 年齢 >= 20 AND 年齢 <= 30;

SELECT * FROM 顧客情報_絞り込み;

それぞれの方法の選択

上記の代替方法はそれぞれ、異なる利点と欠点があります。状況に合わせて適切な方法を選択することが重要です。

  • 仮想テーブル
    外部データソースや複雑なクエリ結果を一時的に扱うことができる。
  • ウィンドウ関数
    分析処理において柔軟な集計やランキングを実現できる。
  • 導出列
    計算結果を列として永続的に保持できる。
  • マテリアライズドビュー
    集計結果を格納することでパフォーマンスを向上できる。
  • CTE
    複数のサブクエリを組み合わせた処理を可読性高く記述できる。
  • サブクエリ
    部分的な集計や条件絞り込みを柔軟に行える。
  • ビュー
    頻繁に使用する複雑なクエリを簡潔に記述できる。