ExcelユーザーのためのSQLite入門&データ活用ガイド
はじめに:Excelのその先へ
あなたは日々の業務でExcelを駆使し、データの集計、分析、レポート作成を行っていることでしょう。Excelは非常に強力で柔軟なツールであり、多くのビジネスシーンで欠かせない存在です。しかし、データの量が増えたり、複数のユーザーでデータを共有・管理したり、より複雑な分析を行おうとしたりすると、Excelだけでは限界を感じる場面に遭遇することはありませんか?
- データ量の限界: Excelのワークシートは最大104万8576行という制限があります。これを超えるデータはそのままでは扱えません。
- 処理速度の低下: データ量が増えると、ファイルの開閉、保存、計算、フィルタリング、並べ替えなどの処理が著しく遅くなります。
- ファイルサイズの増大: 大量のデータを扱うと、ファイルサイズが肥大化し、管理や共有が難しくなります。
- データの構造化と整合性: Excelは自由度が高い反面、データの入力規則や整合性を保つのが難しい場合があります。予期せぬ形式のデータが入力されたり、同じ情報が複数の場所に重複して存在したりする可能性があります。
- 複数ユーザーでの同時利用: 基本的に、Excelファイルは一人が編集している間、他のユーザーは閲覧のみとなります。複数人での同時編集には不向きです。(最近のクラウド機能を使えば改善されますが、構造的な問題は残ります)
- 高度なデータ分析: ピボットテーブルや関数は強力ですが、より複雑な条件での集計や、複数の異なるデータセットを組み合わせた分析には限界があります。
これらの課題に直面したとき、データベースの利用が有力な選択肢となります。しかし、「データベース」と聞くと、OracleやSQL Server、MySQLといった大掛かりなシステムを想像し、導入や運用が難しいと感じるかもしれません。専門の知識が必要で、サーバーの構築や管理、高額なライセンス費用がかかるイメージもあるでしょう。
そこで、Excelユーザーにとって最適な次のステップとなるのがSQLiteです。
SQLiteは、従来のデータベースのイメージを覆す、軽量で手軽に扱えるデータベースシステムです。特別なサーバーソフトウェアは不要で、データベース全体がたった一つのファイルに格納されます。インストールも簡単で、追加の設定はほとんど必要ありません。まるでExcelファイルを扱うかのように、データベースファイルをコピーしたり移動したりできます。
この手軽さにも関わらず、SQLiteは本格的なデータベース機能を提供します。リレーショナルデータベースとしての構造を持ち、SQL(Structured Query Language)という標準的なデータベース言語を使って、データの管理や分析を効率的に行うことができます。SQLを学ぶことは、データの操作や分析の幅を大きく広げる強力なスキルとなります。
本記事は、普段Excelでデータを扱っているあなたが、SQLiteを使いこなし、日々のデータ管理や分析業務をさらに効率化するためのガイドです。SQLiteの基本的な仕組みから、Excelデータの取り込み、SQLを使った操作、そしてExcelへのデータ戻し方まで、具体的な手順と例を交えて詳しく解説します。
読み終える頃には、あなたはExcelとSQLiteを状況に応じて使い分け、大量のデータを効率的に管理し、より高度なデータ分析を自信を持って行えるようになっているでしょう。さあ、データ活用の新たな扉を開きましょう。
SQLiteとは? Excelとの比較
SQLiteの定義と特徴
SQLiteは、サーバーを必要としない、組み込み型のリレーショナルデータベース管理システム(RDBMS)です。最も重要な特徴は以下の通りです。
- 軽量・高速: 他の多くのデータベースシステムに比べて非常に軽量で、リソース消費が少ないです。
- ファイルベース: データベース全体が単一のディスクファイル(通常
.sqlite
または.db
という拡張子)に格納されます。サーバープロセスが不要で、このファイルをコピーするだけでデータベースのバックアップや移動ができます。 - サーバー不要(Serverless): データベースを利用するために専用のサーバープロセスを起動しておく必要がありません。アプリケーション(やツール)が直接データベースファイルにアクセスします。
- ゼロコンフィグ(Zero-configuration): インストールや設定が非常に簡単です。ほとんどの場合、特別な設定ファイルを用意する必要はありません。
- トランザクション: 複数の操作を一つのまとまりとして扱い、データの一貫性(ACID特性)を保証します。これはExcelにはない重要な機能です。
- 標準SQL準拠: SQL言語を使ってデータを操作します。多くの標準的なSQL構文をサポートしています。
- パブリックドメイン: 商用・非商用を問わず、誰でも自由に利用、配布、組み込みが可能です。ライセンス費用は一切かかりません。
- 幅広いプラットフォームをサポート: Windows、macOS、Linux、iOS、Androidなど、さまざまなオペレーティングシステムで動作します。
Excelとの比較
SQLiteがExcelとどのように異なるのかを理解することは、両者を使い分ける上で重要です。
特徴 | Excel | SQLite |
---|---|---|
データ格納形式 | スプレッドシートファイル (.xlsx ) |
単一のデータベースファイル (.sqlite , .db ) |
構造 | 自由なグリッド構造(セル、行、列) | 厳密なテーブル構造(カラム、行) |
データ量 | 約100万行の制限あり | 理論上、ファイルシステムの許す限り(数TBまで) |
処理性能 | 大量データで低下しやすい | 大量データでも比較的安定して高速(特に検索) |
複数ユーザー | 同時編集は限定的 | ファイルロックによる排他制御、またはアプリ側で制御 |
データの型 | セルの書式設定(表示形式) | 厳密なデータ型定義(INTEGER, TEXT, REAL, BLOB) |
データ整合性 | 入力規則設定は可能だが、構造的な保証は弱い | 制約(PRIMARY KEY, NOT NULL, UNIQUE, CHECK, FOREIGN KEY)による強力な保証 |
操作言語 | セル参照、関数、VBA | SQL (Structured Query Language) |
学習コスト | 基本的な操作は容易 | SQLの習得が必要 |
利用シーン | 小~中規模データ、柔軟なレイアウト、簡単な計算、グラフ作成 | 大規模データ管理、構造化データ、複雑な集計・分析、アプリケーションのデータ格納 |
SQLiteを使うメリット・デメリット
メリット:
- 大量データを扱える: Excelの行数制限を気にすることなく、数百万、数千万行といった大量のデータを効率的に管理・処理できます。
- 処理が高速: 特にデータの検索、フィルタリング、特定の条件での集計などが、Excelよりも圧倒的に高速に行える場合があります。
- データの一貫性を保てる: データベースの制約機能を使うことで、不正なデータの入力や重複を防ぎ、データの品質を高められます。
- 構造化されたデータ管理: データをテーブルとして整理することで、データの関係性(リレーション)を明確にし、管理しやすくなります。
- SQLによる強力なデータ操作: SQLを習得すれば、複雑な条件でのデータの抽出、集計、複数のデータセットの結合などが容易に行えます。これは、Excelの関数やピボットテーブルでは難しい操作を可能にします。
- 手軽さ: インストールや設定が簡単で、サーバー運用も不要です。ファイル一つなのでバックアップも容易です。
- 無償利用: ライセンス費用がかからないため、個人利用から小規模なプロジェクトまで気軽に導入できます。
デメリット:
- 学習コスト: SQLという新しい言語を学ぶ必要があります。
- GUIの不足: Excelのような直感的なグリッド編集画面は標準では提供されません(後述するGUIツールを使えば補えます)。
- 複数ユーザーによる本格的な同時書き込みには不向き: SQLiteは基本的にファイルロックによって排他制御を行うため、複数のユーザーが同時に書き込みを行うような、頻繁なアクセスがある用途には向いていません。(読み込みは比較的容易です)
- サーバー型データベースほどのスケーラビリティや高可用性はない: 大規模なウェブサービスやミッションクリティカルなシステムには向きません。
Excelユーザーにとっては、「大量データを扱う」「構造化して管理する」「SQLで効率的に分析する」といった点で、SQLiteが大きなメリットをもたらします。ExcelとSQLiteは対立するものではなく、互いに補完し合う関係にあると言えるでしょう。
SQLiteを始めてみよう
SQLiteを始めるのは非常に簡単です。ここでは、SQLiteのコマンドラインツールと、より使いやすいGUIツールを使った始め方を紹介します。
SQLiteのダウンロードとインストール
SQLite自体は単体の実行ファイルとして提供されています。公式ウェブサイトからダウンロードできます。
- SQLite公式サイトにアクセス: https://www.sqlite.org/download.html
- ダウンロード: “Precompiled Binaries for…” のセクションから、あなたのオペレーティングシステム(Windows, macOS, Linuxなど)に合ったパッケージをダウンロードします。
- Windowsの場合、通常は
sqlite-tools-win64-x64-...zip
(64bit版) やsqlite-dll-win64-x64-...zip
をダウンロードします。sqlite-tools
にはコマンドラインツール (sqlite3.exe
) が含まれています。 - ダウンロードしたZIPファイルを任意のフォルダに展開します。
- Windowsの場合、通常は
コマンドラインツールだけでも操作可能ですが、データベースの内容を確認したり、SQLクエリを実行したりするには、GUIツールがあると非常に便利です。SQLite用のGUIツールはいくつかありますが、ここでは広く使われているものを紹介します。
- DB Browser for SQLite: 無料で高機能、非常に使いやすいツールです。Windows, macOS, Linux版があります。
- ダウンロードサイト: https://sqlitebrowser.org/dl/
- インストーラーを実行するだけで簡単にインストールできます。
- SQLiteStudio: こちらも高機能で人気のツールです。ポータブル版もあります。
- ダウンロードサイト: https://sqlitestudio.pl/index.rvt?act=download
- インストーラー版またはZIP版をダウンロードして利用します。
本記事では、コマンドラインツールとDB Browser for SQLiteの両方を使った操作方法を適宜説明します。
基本的な操作:コマンドラインツール
ダウンロードした sqlite3.exe
(Windows) または sqlite3
(macOS/Linux) を使って、SQLiteデータベースを操作できます。
- コマンドプロンプトまたはターミナルを開く:
- Windows: スタートメニューから「cmd」または「PowerShell」を検索して起動します。
- macOS/Linux: アプリケーションフォルダから「ターミナル」を起動します。
-
sqlite3
コマンドを実行:sqlite3
と入力してEnterキーを押すと、新しい空のデータベースがメモリ上に作成され、SQLiteコマンドラインシェルに入ります。- 特定のデータベースファイルを開く(または新規作成する)場合は、ファイル名を引数に指定します。例えば、
sqlite3 mydatabase.db
と入力すると、mydatabase.db
という名前のデータベースファイルを開くか、存在しなければ新しく作成します。
“`bash
新しいデータベースファイルを作成(または既存ファイルを開く)
sqlite3 sales_data.db
“`成功すると、以下のようなプロンプトが表示されます。
SQLite version 3.xx.x xxxxxxxx
Enter ".help" for usage hints
sqlite>sqlite>
がプロンプトです。ここにコマンドを入力します。 -
基本的なメタコマンド:
SQLiteコマンドラインシェルでは、SQL文以外に、.
で始まる特別なコマンド(メタコマンド)を使うことができます。.help
: 利用可能なメタコマンド一覧を表示します。.quit
または.exit
: SQLiteシェルを終了します。.open <ファイル名>
: 現在のデータベースを閉じて、新しいデータベースファイルを開くか新規作成します。.databases
: 現在接続しているデータベースとそのファイル名を表示します。.tables
: 現在のデータベースに含まれるテーブル一覧を表示します。.schema <テーブル名>
: 指定したテーブルの作成に使われたSQL文(テーブル定義)を表示します。テーブル名を省略すると、全てのテーブル定義が表示されます。.mode <モード>
: 出力形式を設定します。例えば、.mode csv
とすると、結果がCSV形式で表示されます。.mode column
とすると、整形されたカラム表示になります(デフォルトに近い)。.headers <on/off>
: カラム名(ヘッダー)を表示するかどうかを設定します。.headers on
とすると、SQLクエリの結果にカラム名が表示されます。.output <ファイル名>
: クエリの結果をファイルに書き出します。.output stdout
で標準出力(画面)に戻します。
例:
“`sql
sqlite> .databases
main: /path/to/your/directory/sales_data.dbsqlite> .tables
— テーブルがない場合は何も表示されないsqlite> .help
— 利用可能なコマンド一覧が表示されるsqlite> .quit
“`
これでSQLiteを使う準備ができました。次は、データベースの最も基本的な構成要素であるテーブルについて学びましょう。
データベースとテーブルの基本
リレーショナルデータベースは、データを「テーブル」という形式で管理します。テーブルは、Excelのワークシートのようなものですが、より構造化されています。
リレーショナルデータベースの基本概念
- テーブル (Table): 特定の種類の情報を格納する入れ物です。例えば、「顧客リスト」「商品一覧」「売上データ」などがそれぞれテーブルになります。Excelのワークシートに相当します。
- カラム (Column) / フィールド (Field): テーブル内の情報の種類を表します。テーブルの列に相当し、各カラムは決まったデータ型を持ちます(例: 顧客ID、商品名、単価、日付など)。Excelの列ヘッダーに相当します。
- 行 (Row) / レコード (Record): テーブル内の個々の情報セットです。各行は、そのテーブルが扱う特定のオブジェクト(例: 特定の顧客、特定の商品、特定の売上取引)のデータを持ちます。Excelの行に相当します。
- 主キー (Primary Key): テーブル内の各行を一意に識別するためのカラム、またはカラムの組み合わせです。例えば、顧客テーブルなら「顧客ID」、商品テーブルなら「商品コード」などが主キーになることが多いです。主キーは
NULL
(値がない状態)であってはならず、重複も許されません。データの参照や関連付けに非常に重要です。 - 外部キー (Foreign Key): あるテーブルの行が、他のテーブルの行とどのように関連付けられているかを示すためのカラムです。例えば、売上データテーブルに「顧客ID」カラムがあり、それが顧客テーブルの「顧客ID」主キーを参照している場合、この「顧客ID」は外部キーとなります。これにより、売上データがどの顧客によるものかを特定できます。
SQLの基本構文 (DDL: Data Definition Language)
データベースの構造(テーブルなど)を作成、変更、削除するためのSQL文をDDL(データ定義言語)と呼びます。
テーブルの作成: CREATE TABLE
新しいテーブルを作成するには CREATE TABLE
文を使います。
構文:
sql
CREATE TABLE テーブル名 (
カラム名1 データ型 [制約],
カラム名2 データ型 [制約],
...
[テーブルレベル制約]
);
SQLiteでよく使われるデータ型:
SQLiteは動的なデータ型を持つことも可能ですが、推奨されるのは厳密な型指定です。主なデータ型は以下の5つです。
NULL
: 値がないことを示す特別な値。INTEGER
: 符号付き整数。格納できる値の範囲は値の大きさに応じて動的に変わります(最大8バイト)。主キーに指定し、AUTOINCREMENT
を付けると自動的に連番が振られます。REAL
: 浮動小数点数(小数点以下の値を持つ数値)。IEEE 754 倍精度浮動小数点形式(8バイト)で格納されます。TEXT
: 文字列データ。格納できる値の長さはファイルシステムの許す限りです。文字コードはUTF-8などが使えます。BLOB
: バイナリデータ(画像ファイルや音声ファイルなど)。
よく使われる制約:
PRIMARY KEY
: そのカラムを主キーとして指定します。NOT NULL
とUNIQUE
を兼ねます。INTEGER PRIMARY KEY
とすると、そのカラムは自動的にユニークな整数値が割り当てられる特別な主キーになります(エイリアスROWID)。AUTOINCREMENT
を付けることも可能ですが、通常はINTEGER PRIMARY KEY
だけで十分です。NOT NULL
: そのカラムにNULL
値を許可しません。必ず何らかの値が入力される必要があります。UNIQUE
: そのカラム内の値がテーブル全体で一意であることを保証します。重複を許しません。DEFAULT デフォルト値
: 値が明示的に指定されなかった場合に、自動的に挿入される値を定義します。CHECK (条件)
: そのカラム(または行全体)の値が指定した条件を満たす必要があることを定義します。FOREIGN KEY (カラム名) REFERENCES 他テーブル名(他カラム名)
: そのカラムが、他のテーブルの指定したカラム(通常は主キー)の値を参照することを定義します。これにより、データの関連性を保ちます。
CREATE TABLE
の例:
顧客情報を格納する customers
テーブルを作成します。
sql
CREATE TABLE customers (
customer_id INTEGER PRIMARY KEY, -- 顧客ID(整数、主キー、自動連番)
customer_name TEXT NOT NULL, -- 顧客名(文字列、必須)
email TEXT UNIQUE, -- メールアドレス(文字列、一意)
phone TEXT, -- 電話番号(文字列、任意)
register_date TEXT -- 登録日(日付はTEXTまたはREALで格納することが多い。TEXT YYYY-MM-DD形式が一般的)
);
売上データを格納する sales
テーブルを作成します。
sql
CREATE TABLE sales (
sale_id INTEGER PRIMARY KEY, -- 売上ID(整数、主キー、自動連番)
sale_date TEXT NOT NULL, -- 売上日(文字列、必須)
customer_id INTEGER, -- 顧客ID(整数、外部キー)
product_name TEXT NOT NULL, -- 商品名(文字列、必須)
quantity INTEGER NOT NULL, -- 数量(整数、必須)
price REAL NOT NULL, -- 単価(小数点数、必須)
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) -- customer_idはcustomersテーブルのcustomer_idを参照する
);
SQLiteコマンドラインシェルで実行する場合:
sql
sqlite> CREATE TABLE customers (...);
sqlite> CREATE TABLE sales (...);
sqlite> .tables
customers sales
DB Browser for SQLiteの場合:
メニューから「データベースを作成」を選んで新しいファイルを作成後、「テーブルを作成」ボタンをクリックして、カラム名、データ型、制約などをGUIで設定できます。SQLタブで上記の CREATE TABLE
文を直接入力して実行することも可能です。
テーブルの削除: DROP TABLE
不要になったテーブルを削除するには DROP TABLE
文を使います。テーブル内のデータもすべて削除されます。
構文:
sql
DROP TABLE テーブル名;
例:
sql
DROP TABLE customers;
テーブル構造の変更: ALTER TABLE
既存のテーブルにカラムを追加したり、テーブルの名前を変更したりするには ALTER TABLE
文を使います。SQLiteの ALTER TABLE
は他のデータベースシステムに比べて機能が限定的です。
-
カラムの追加:
sql
ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型 [制約];例:
customers
テーブルに住所カラムを追加sql
ALTER TABLE customers ADD COLUMN address TEXT; -
テーブル名の変更:
sql
ALTER TABLE 旧テーブル名 RENAME TO 新テーブル名;例:
sales
テーブル名をorder_details
に変更sql
ALTER TABLE sales RENAME TO order_details; -
カラムの削除やデータ型の変更:
SQLiteでは、ALTER TABLE
で既存のカラムを直接削除したり、データ型を変更したりすることはできません。これらの操作を行うには、新しいテーブルを作成し、元のテーブルからデータをコピーし、元のテーブルを削除して、新しいテーブル名を元のテーブル名に変更する、という手順を踏む必要があります。これは少し複雑なので、最初は避け、設計段階でカラムを確定させるのが望ましいです。
DB Browser for SQLiteでは、GUIを使ってカラムの追加やテーブル名の変更がある程度簡単に行えます。「データベース構造」タブでテーブルを選択し、「変更」ボタンをクリックすると、カラムの追加などがGUIで操作できます。
これで、データの入れ物であるテーブルを作成・管理する方法がわかりました。次は、実際にテーブルにデータを格納し、操作する方法を学びます。
データの操作 (CRUD)
テーブルが作成できたら、いよいよデータの操作です。データの操作にはDML(Data Manipulation Language:データ操作言語)と呼ばれるSQL文を使用します。最も基本的な操作は、以下の4つです。
- Create (作成): 新しい行を挿入する (
INSERT
) - Read (読み込み): データを取得する (
SELECT
) - Update (更新): 既存の行を変更する (
UPDATE
) - Delete (削除): 行を削除する (
DELETE
)
これらの頭文字をとって「CRUD」と呼ばれます。
データの挿入: INSERT INTO
テーブルに新しい行を追加するには INSERT INTO
文を使います。
構文1: 全てのカラムに値を指定する場合(カラム名のリストは省略可。省略した場合はテーブル定義のカラム順で値を指定)
sql
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (値1, 値2, ...);
構文2: 一部のカラムにのみ値を指定する場合
sql
INSERT INTO テーブル名 (カラム名1, カラム名2, ...)
VALUES (値1, 値2, ...);
例: customers
テーブルに顧客情報を挿入
“`sql
— 全てのカラムに値を指定(customer_idは自動生成されるのでVALUESには含めないか、NULLを指定)
INSERT INTO customers (customer_name, email, phone, register_date)
VALUES (‘山田 太郎’, ‘[email protected]’, ‘090-1234-5678’, ‘2023-01-15’);
— 一部のカラムにのみ値を指定(emailとphoneはNULLが許容される場合)
INSERT INTO customers (customer_name, register_date)
VALUES (‘佐藤 花子’, ‘2023-02-01’);
“`
INTEGER PRIMARY KEY
を指定したカラム (customer_id
) は、値を指定しないか NULL
を指定すると、自動的にユニークな整数値が割り当てられます。
複数の行を一度に挿入することもできます(SQLite 3.7.11 以降)。
sql
INSERT INTO sales (sale_date, customer_id, product_name, quantity, price)
VALUES
('2023-03-10', 1, 'ノートPC', 1, 120000.0),
('2023-03-10', 2, 'モニター', 2, 35000.0),
('2023-03-11', 1, 'キーボード', 1, 8000.0);
DB Browser for SQLiteでは、「データを閲覧」タブで直接テーブルの行を編集したり、「SQLを実行」タブで INSERT
文を実行したりできます。
データの取得: SELECT
テーブルからデータを取得するには SELECT
文を使います。これが最も頻繁に使うSQL文です。
構文:
sql
SELECT カラム名1, カラム名2, ... -- 取得したいカラムを指定。全てのカラムなら *
FROM テーブル名 -- データを取得するテーブル
[WHERE 条件] -- 条件に合う行のみを取得(省略可)
[ORDER BY カラム名 [ASC|DESC]] -- 指定したカラムで並べ替え(省略可)
[LIMIT 数] -- 取得する行数を制限(省略可)
[OFFSET 数] -- 取得を開始する行のオフセット(省略可)
例:
-
customers
テーブルの全てのカラム、全ての行を取得:sql
SELECT * FROM customers; -
sales
テーブルから、商品名と数量、単価を取得:sql
SELECT product_name, quantity, price FROM sales; -
customers
テーブルから、メールアドレスが指定された顧客名とメールアドレスを取得:sql
SELECT customer_name, email FROM customers WHERE email = '[email protected]';WHERE
句では様々な条件を指定できます。
* 比較演算子:=
,!=
(または<>
),<
,>
,<=
,>=
* 論理演算子:AND
,OR
,NOT
* パターンマッチ:LIKE
(%
: 任意の文字列,_
: 任意の一文字)
* 例:WHERE customer_name LIKE '山田%'
(「山田」で始まる名前)
* 例:WHERE email LIKE '%@example.com'
(「@example.com」で終わるメールアドレス)
* 範囲指定:BETWEEN 値1 AND 値2
* 例:WHERE sale_date BETWEEN '2023-03-01' AND '2023-03-31'
(2023年3月中の売上)
* リスト指定:IN (値1, 値2, ...)
* 例:WHERE customer_id IN (1, 3, 5)
(顧客IDが1, 3, 5のいずれか)
* NULL値のチェック:IS NULL
,IS NOT NULL
* 例:WHERE phone IS NULL
(電話番号が登録されていない顧客) -
sales
テーブルから、単価が10000円以上の売上を、売上日の新しい順に並べ替えて取得:sql
SELECT * FROM sales WHERE price >= 10000 ORDER BY sale_date DESC; -- DESC: 降順, ASC: 昇順 (デフォルト) -
customers
テーブルから、最初の5件だけを取得:sql
SELECT * FROM customers LIMIT 5; -
customers
テーブルから、6件目から10件目を取得 (LIMITとOFFSETを組み合わせてページング):sql
SELECT * FROM customers LIMIT 5 OFFSET 5; -- 最初の5件をスキップして次の5件を取得
DB Browser for SQLiteでは、「データを閲覧」タブでテーブルを選択するとデータが表示されます。「SQLを実行」タブで SELECT
文を入力・実行し、結果を確認できます。WHERE
句などをGUIで設定できる機能もあります。
データの更新: UPDATE
既存のテーブルの行の値を変更するには UPDATE
文を使います。
構文:
sql
UPDATE テーブル名
SET カラム名1 = 新しい値1, カラム名2 = 新しい値2, ...
[WHERE 条件]; -- **重要!** 更新対象の行を指定しないと、テーブル全体のデータが更新されます
例:
-
顧客IDが1の顧客のメールアドレスと電話番号を更新:
sql
UPDATE customers
SET email = '[email protected]', phone = '080-9876-5432'
WHERE customer_id = 1; -
商品名「モニター」の単価を36000円に更新(同じ商品名の行が複数ある場合は全て更新されます。より厳密に指定するにはWHERE句に別の条件を追加するか、主キーを使うべきです):
sql
UPDATE sales
SET price = 36000.0
WHERE product_name = 'モニター';
WHERE
句を省略すると、そのテーブルの全ての行が更新されてしまうので、UPDATE
文を実行する際は細心の注意が必要です。DB Browser for SQLiteでは、「データを閲覧」タブで直接セルを編集してデータを更新することもできます。
データの削除: DELETE FROM
テーブルから行を削除するには DELETE FROM
文を使います。
構文:
sql
DELETE FROM テーブル名
[WHERE 条件]; -- **重要!** 削除対象の行を指定しないと、テーブル全体のデータが削除されます
例:
-
顧客IDが2の顧客情報を削除:
sql
DELETE FROM customers WHERE customer_id = 2; -
2023年3月10日以前の売上データを全て削除:
sql
DELETE FROM sales WHERE sale_date <= '2023-03-10';
UPDATE
同様、WHERE
句を省略するとテーブルの全ての行が削除されてしまうので注意が必要です。テーブルの全てのデータを削除し、テーブル構造は残したい場合は DELETE FROM テーブル名;
を実行します(大量データの場合は TRUNCATE TABLE
の方が高速なDBもありますが、SQLiteにはありません)。テーブル構造ごと削除する場合は DROP TABLE
を使います。
DB Browser for SQLiteでは、「データを閲覧」タブで行を選択して削除ボタンをクリックできます。
トランザクション
複数のSQL文を一つのまとまり(トランザクション)として扱い、全て成功するか、一つでも失敗したら全てを元に戻す(ロールバック)機能は、データの整合性を保つ上で重要です。SQLiteはデフォルトで自動コミットモードですが、手動でトランザクションを制御することも可能です。
BEGIN TRANSACTION;
またはBEGIN;
: トランザクションを開始します。COMMIT;
: トランザクション内の全ての変更を確定し、データベースに書き込みます。ROLLBACK;
: トランザクション内の全ての変更を取り消し、トランザクション開始前の状態に戻します。
例: 顧客情報を更新し、同時にその顧客の古い売上情報を削除する(一連の処理として実行)
“`sql
BEGIN;
— 顧客情報を更新
UPDATE customers SET phone = ‘070-1111-2222’ WHERE customer_id = 3;
— その顧客の古い売上情報を削除
DELETE FROM sales WHERE customer_id = 3 AND sale_date < ‘2023-01-01’;
— 全ての操作が成功したらコミット
COMMIT;
— もし途中で問題が発生したら、代わりに ROLLBACK; を実行して変更を取り消す
“`
トランザクションは、特に複数のテーブルにまたがる操作や、エラーが発生した場合にデータベースがおかしな状態になるのを防ぎたい場合に役立ちます。
ExcelデータをSQLiteに取り込む
Excelで管理している大量のデータをSQLiteに移行して活用したい場合、いくつかの方法があります。最も簡単なのは、ExcelデータをCSV形式でエクスポートし、それをSQLiteにインポートする方法です。
CSV形式でのエクスポート (Excel側)
- エクスポートしたいデータを含むExcelファイルを開く。
- エクスポートしたいワークシートを選択する。
- 「ファイル」タブをクリックし、「名前を付けて保存」または「エクスポート」を選択する。
- 保存場所とファイル名を指定し、「ファイルの種類」または「形式」で「CSV (コンマ区切り) (*.csv)」を選択する。
- 「保存」ボタンをクリックする。
- 複数のワークシートがある場合、アクティブなワークシートのみがCSVとして保存されます。
- 書式設定(文字色、背景色など)や計算式は保存されず、値のみが保存されます。
- 表示形式(例: 日付の表示形式)はExcelの設定に依存する場合があります。SQLiteにインポートする際に問題にならないよう、
YYYY-MM-DD
のような標準的な形式にしておくのが推奨されます。 - データにカンマ
,
、二重引用符"
、改行が含まれる場合、適切にエスケープ(通常は二重引用符で囲み、二重引用符自体は""
と二つ重ねる)されているか確認してください。
SQLiteへのインポート方法
エクスポートしたCSVファイルをSQLiteに取り込む方法はいくつかあります。
1. SQLiteコマンドラインツールの .import
コマンド
大量のデータを高速にインポートするのに適しています。
- インポート先のデータベースファイル (
.db
または.sqlite
) を準備します。 必要であればCREATE TABLE
文でインポート先のテーブルを事前に作成しておきます。CSVの各列が、テーブルの各カラムに対応するように定義する必要があります。カラム名やデータ型をCSVの内容に合わせて設計します。 -
コマンドプロンプトまたはターミナルを開き、SQLiteシェルを起動します。 作成したデータベースファイルを指定します。
bash
sqlite3 sales_data.db -
インポート設定を行います。
-
区切り文字の設定: デフォルトはパイプ記号
|
ですが、CSVはコンマ,
なので変更します。sql
sqlite> .separator , -
ヘッダー行の有無: CSVファイルにカラム名のヘッダー行が含まれている場合、最初の行をスキップするように設定します。
sql
sqlite> .headers onヘッダー行がない場合は
.headers off
のままにします。 -
出力モードの設定: インポートとは直接関係ありませんが、通常の使用モードに戻しておきます。
sql
sqlite> .mode insert <table>
または
sql
sqlite> .mode csv
あるいはGUIツールで見やすい.mode column
など。.mode insert <table>
は、インポートしたデータを後で.output
する際などにINSERT
文の形式で出力する場合に使います。インポート自体は.import
コマンドで行います。インポート前の設定としては.separator
と.headers
が重要です。
-
-
.import
コマンドでCSVファイルをインポートします。sql
.import /path/to/your/file/your_excel_data.csv your_table_name/path/to/your/file/your_excel_data.csv
: インポートするCSVファイルへのパスを指定します。ファイル名にスペースが含まれる場合は、パスを二重引用符"
で囲んでください。your_table_name
: インポート先のテーブル名を指定します。指定したテーブルが存在しない場合は新しく作成されますが、この場合カラム名やデータ型はCSVのヘッダー行や最初の行から推測されるため、意図した構造にならない可能性があります。事前にCREATE TABLE
でテーブルを作成しておくのが安全です。
例:
sql
sqlite> .separator ,
sqlite> .headers on
sqlite> .import C:/Users/YourName/Documents/sales.csv sales_importこの例では、
sales.csv
というCSVファイルを読み込み、その内容をsales_import
という名前の新しいテーブルにインポートします。CSVの1行目はヘッダーとして扱われ、テーブルのカラム名になります。
インポートが完了したら、SELECT * FROM sales_import LIMIT 10;
などでデータを確認してみましょう。
2. GUIツールを使ったインポート (DB Browser for SQLite)
GUIツールを使うと、より直感的にインポートできます。DB Browser for SQLiteの場合:
- DB Browser for SQLiteを起動し、対象のデータベースファイルを開く(または新規作成する)。
- メニューから「ファイル」->「テーブルとしてCSVをインポート」を選択する。
- インポートしたいCSVファイルを選択し、「開く」をクリックする。
- インポート設定ダイアログが表示されます。
- テーブル名: インポート先の新しいテーブル名を指定します。
- 列区切り文字: 通常は「,」(カンマ)を選択します。
- 引用符文字: 通常は「”」(二重引用符)を選択します。
- 最初の行を列名として使用する: CSVの1行目がヘッダー行であればチェックを入れます。
- データ型を検出: チェックを入れると、最初の数行のデータから各カラムのデータ型を推測してくれます(SQLiteの動的な型付けに基づきます)。厳密な型を指定したい場合は、事前にテーブルを作成してからインポートするか、インポート後にカラムの型を変更します(ただし、SQLiteの
ALTER TABLE
では型の変更は直接できません)。
- 「OK」をクリックするとインポートが実行されます。
インポートが完了したら、「データを閲覧」タブでインポートされたテーブルを選択し、データを確認できます。
インポート時の注意点:
- データ型: CSVは全てがテキストデータとして扱われます。SQLiteにインポートする際に、数値として扱いたいカラムがTEXT型としてインポートされてしまうことがあります。GUIツールが型推測をしてくれる場合もありますが、意図しない型になる場合は、事前にSQLで適切なデータ型のテーブルを作成しておき、そこにインポートするのが最も安全です。
- 文字コード: CSVファイルの文字コード(UTF-8, Shift_JIS, etc.)がSQLiteや使用しているツールで正しく認識されるか確認してください。文字化けが発生する場合は、ExcelでCSV保存する際に文字コードを指定したり、テキストエディタで文字コードを変換したりする必要があるかもしれません。SQLiteはUTF-8を推奨しています。
- 日付と時刻: 日付や時刻の形式は、TEXT型として
YYYY-MM-DD
,YYYY-MM-DD HH:MM:SS
のようにISO 8601形式で格納するのが一般的です。Excelからのエクスポート時に意図した形式になっているか確認しましょう。 - 数値形式: 小数点以下の桁数が多い場合や、指数形式になっている場合など、数値として正しくインポートされるか確認が必要です。
SQLiteのデータをExcelで活用する
SQLiteにデータを格納したら、今度はそのデータをExcelに戻したり、Excelから直接参照したりして活用する方法です。
SQLiteからCSV形式でエクスポート (SQLite側)
SQLiteのデータをExcelで扱いやすいCSV形式でエクスポートします。
-
SQLiteコマンドラインシェルを起動し、対象のデータベースファイルを開きます。
bash
sqlite3 sales_data.db -
エクスポート設定を行います。
-
出力先ファイルの指定:
.output
コマンドでエクスポート先のファイル名を指定します。既存のファイルは上書きされます。sql
sqlite> .output /path/to/your/export_data.csvファイル名にスペースが含まれる場合は二重引用符
"
で囲みます。 -
出力形式をCSVに設定:
.mode
コマンドで出力形式をcsvに設定します。sql
sqlite> .mode csv -
ヘッダー行の出力設定: 必要に応じてカラム名(ヘッダー行)を出力するか設定します。
sql
sqlite> .headers on -- ヘッダーを出力
-- sqlite> .headers off -- ヘッダーを出力しない
-
-
SELECT
文を実行し、データをエクスポートします。 指定した.output
ファイルにSELECT
文の結果が書き込まれます。sql
sqlite> SELECT * FROM sales; -- salesテーブルの全てのデータをエクスポート
sqlite> SELECT customer_name, email FROM customers WHERE register_date >= '2023-01-01'; -- 条件を指定してエクスポート -
出力先を標準出力(画面)に戻します。 エクスポートが終わったら、必ず出力先を元に戻してください。これを忘れると、その後のコマンド実行結果が全てファイルに書き込まれてしまいます。
sql
sqlite> .output stdout -
SQLiteシェルを終了します。
sql
sqlite> .quit
例: sales
テーブルの全データを exported_sales.csv
としてエクスポート
sql
sqlite> .output C:/Users/YourName/Documents/exported_sales.csv
sqlite> .mode csv
sqlite> .headers on
sqlite> SELECT * FROM sales;
sqlite> .output stdout
sqlite> .quit
DB Browser for SQLiteの場合:
「ファイルをエクスポート」機能を利用します。「データを閲覧」タブでテーブルを開き、「ファイルをエクスポート」ボタンをクリックするか、メニューから「ファイル」->「エクスポート」->「CSVファイル」を選択します。エクスポートしたいテーブルを選択し、ファイル名、区切り文字、引用符、ヘッダーの有無などを設定してエクスポートを実行します。
ExcelでのCSVデータの取り込み
SQLiteからエクスポートしたCSVファイルは、Excelで簡単に開くことができます。
- 新しいExcelファイルを開く。
- 「データ」タブをクリックする。
- 「データの取得と変換」グループから「テキストまたはCSVから」を選択する。 (Excelのバージョンによって「テキストファイル」や「外部データの取り込み」メニューの下にある場合があります)
- エクスポートしたCSVファイルを選択し、「インポート」をクリックする。
- プレビューが表示されます。 区切り文字(通常はコンマ)や文字コードが正しく認識されているか確認します。必要であれば設定を変更します。
- 「読み込み」ボタンをクリックする。 データが新しいワークシートに読み込まれます。
より詳細な設定が必要な場合(例えば特定の列をテキストとして読み込みたい場合など)は、「読み込み」ボタンの隣の「変換」ボタンをクリックしてPower Queryエディターを開き、データの整形を行うことができます。
ODBCドライバーを使った直接接続
SQLiteのデータをExcelから直接参照する、より高度な方法としてODBC (Open Database Connectivity) ドライバーを利用する方法があります。これにより、Excelファイル内にデータをコピーすることなく、SQLiteデータベース上の最新データを参照したり、場合によってはExcelからSQLiteへデータを書き込んだりすることも可能になります。
-
SQLite ODBCドライバーのインストール:
SQLite ODBCドライバーをシステムにインストールする必要があります。公式ウェブサイトからダウンロードできます。- SQLite ODBC Driver: https://www.ch-werner.de/sqliteodbc/
- お使いのWindowsのバージョン(32bit版か64bit版)に合ったドライバーをダウンロードし、インストーラーを実行してインストールします。特にExcelが64bit版の場合は64bit版ドライバーが必要です。
-
ODBCデータソースの設定 (Windows)
インストールしたODBCドライバーを使って、SQLiteデータベースファイルへの接続設定を行います。- Windowsのスタートメニューから「ODBCデータソース」を検索して起動します。(バージョンによって「ODBC データ ソース (64 ビット)」または「ODBC データ ソース (32 ビット)」を選びます。通常は64bit版。)
- 「ユーザーDSN」タブまたは「システムDSN」タブを選択します。(通常はユーザーDSNで十分です)
- 「追加」ボタンをクリックします。
- インストール済みのドライバー一覧から「SQLite3 ODBC Driver」または「SQLite ODBC Driver」を選択し、「完了」をクリックします。
- SQLite3 ODBC DSN 設定ダイアログ:
- Data Source Name: この接続設定に分かりやすい名前を付けます(例:
MySalesDatabase_SQLite
)。Excelから接続する際にこの名前を選びます。 - Database Name: 接続したいSQLiteデータベースファイル (
.db
または.sqlite
) のフルパスを指定します。「…」ボタンでファイルを選択できます。 - その他、必要に応じて設定(暗号化など)を行いますが、通常はデフォルトで問題ありません。
- Data Source Name: この接続設定に分かりやすい名前を付けます(例:
- 「OK」をクリックして設定を保存します。
-
Excelからの接続:
ODBCデータソースの設定が完了したら、Excelからそのデータソースに接続します。- Excelを開き、新しいワークシートを選択します。
- 「データ」タブをクリックする。
- 「データの取得と変換」グループから「データの取得」をクリックし、「その他のデータソースから」->「ODBCデータベースから」を選択する。
- 「DSN (データ ソース名)」のドロップダウンリストから、先ほど設定したDSN名(例:
MySalesDatabase_SQLite
)を選択します。 - 必要であれば認証情報を入力します(SQLiteデータベースファイルにパスワードが設定されていない限り、通常は不要です)。
- 「接続」をクリックします。
- ナビゲーターウィンドウが表示されます。 接続したデータベース内のテーブル一覧が表示されるので、取り込みたいテーブルを選択します。複数のテーブルを選択することも可能です。
- データのプレビューが表示されます。
- 「読み込み」をクリックすると、データがExcelのワークシートにテーブルとして読み込まれます。
- 「変換」をクリックすると、Power Queryエディターが開かれ、データの整形、フィルター、結合などの変換処理を行ってからExcelに読み込むことができます。これは後述するSQLによるデータ分析の内容と関連します。
ODBC接続で読み込んだデータは、元のSQLiteデータベースとリンクしています。Excelの「データ」タブにある「全て更新」または個別のテーブルの「更新」ボタンをクリックすることで、SQLiteデータベースの最新のデータをExcelに取り込み直すことができます。これにより、Excelファイル自体を巨大化させることなく、常に最新のデータをExcelで参照・分析することが可能になります。
ExcelからSQLiteへ書き込む方法:
ODBC接続を利用してExcelからSQLiteへ直接データを書き込むことも理論上は可能ですが、Excelの機能だけでは難しい場合が多いです。これは通常、VBAマクロを使うか、Pythonなどのプログラミング言語でExcelとSQLiteの両方を操作して実現します。ODBCドライバーによってはExcelのPower Queryからの書き込みをサポートしているものもありますが、一般的ではありません。
簡単なデータ追加であれば、ExcelでCSVを作成し、SQLite側でインポートするという流れが現実的です。複雑な書き込みや更新が必要な場合は、SQL文を理解し、それを実行できるツール(GUIツールやプログラミング言語)を使うのが最も確実です。
SQLによるデータ分析の基本
SQLiteにデータが格納され、Excelからアクセスする方法も学んだら、いよいよSQLを使ってデータを分析するステップです。SQLは、データの集計、フィルタリング、結合といった分析操作を効率的に行うための強力な言語です。Excelの関数やピボットテーブルに相当する機能を、SQLでどのように行うかを見ていきましょう。
ここでは、前述の customers
テーブルと sales
テーブルを使用する例を中心に解説します。
customers
テーブル:
| customer_id | customer_name | email | phone | register_date |
| :———– | :————- | :———————- | :———– | :————- |
| 1 | 山田 太郎 | [email protected] | 090-1234-5678| 2023-01-15 |
| 2 | 佐藤 花子 | | | 2023-02-01 |
| 3 | 田中 一郎 | [email protected] | 070-1111-2222| 2023-02-20 |
| 4 | 山田 太郎 | [email protected] | | 2023-03-05 |
sales
テーブル:
| sale_id | sale_date | customer_id | product_name | quantity | price |
| :——- | :——— | :———– | :———— | :——- | :—– |
| 1 | 2023-03-10 | 1 | ノートPC | 1 | 120000 |
| 2 | 2023-03-10 | 2 | モニター | 2 | 35000 |
| 3 | 2023-03-11 | 1 | キーボード | 1 | 8000 |
| 4 | 2023-03-11 | 3 | マウス | 3 | 2500 |
| 5 | 2023-03-12 | 2 | ノートPC | 1 | 120000 |
| 6 | 2023-03-12 | 1 | マウス | 1 | 2500 |
集計関数
SQLには、データの合計、平均、最大、最小、件数などを計算するための集計関数が用意されています。ExcelのSUM関数、AVERAGE関数、COUNT関数などに対応します。
COUNT(*)
またはCOUNT(カラム名)
: 条件に一致する行数または非NULLの値の数を数えます。SUM(カラム名)
: 数値カラムの合計値を計算します。AVG(カラム名)
: 数値カラムの平均値を計算します。MIN(カラム名)
: カラムの最小値を求めます。MAX(カラム名)
: カラムの最大値を求めます。
例:
-
sales
テーブルの全件数を取得:sql
SELECT COUNT(*) FROM sales;
-- 結果例: 6 -
sales
テーブルの売上合計金額(数量 * 単価 の合計)を取得:sql
SELECT SUM(quantity * price) AS total_sales_amount FROM sales;
-- ASを使ってカラムに別名(エイリアス)を付けることができます
-- 結果例: 120000 + 70000 + 8000 + 7500 + 120000 + 2500 = 328000
-- 結果例: 328000.0 -
sales
テーブルの最小単価と最大単価を取得:sql
SELECT MIN(price) AS min_price, MAX(price) AS max_price FROM sales;
-- 結果例:
-- min_price | max_price
-- -------- | --------
-- 2500.0 | 120000.0 -
customers
テーブルでメールアドレスが登録されている顧客の数を取得:sql
SELECT COUNT(email) FROM customers; -- COUNT(カラム名) は NULL を数えない
-- 結果例: 3COUNT(*)
はNULLを含む全ての行を数えます。
GROUP BY
句
データを特定のカラムの値でグループ化し、グループごとに集計関数を適用するには GROUP BY
句を使います。これはExcelのピボットテーブルの「行」や「列」に項目を配置して集計する操作に似ています。
構文:
sql
SELECT グループ化カラム, 集計関数(集計対象カラム)
FROM テーブル名
[WHERE 条件]
GROUP BY グループ化カラム;
SELECT
リストには、GROUP BY
句で指定したカラムか、集計関数を含む式のみを指定できます。
例:
-
商品名ごとに売上数量の合計と売上金額の合計を取得:
sql
SELECT
product_name,
SUM(quantity) AS total_quantity,
SUM(quantity * price) AS total_amount
FROM sales
GROUP BY product_name;
-- 結果例:
-- product_name | total_quantity | total_amount
-- -------------| -------------- | ------------
-- キーボード | 1 | 8000.0
-- マウス | 4 | 10000.0
-- モニター | 2 | 70000.0
-- ノートPC | 2 | 240000.0 -
顧客ごとに購入金額の合計を取得:
sql
SELECT
customer_id,
SUM(quantity * price) AS total_purchase_amount
FROM sales
GROUP BY customer_id;
-- 結果例:
-- customer_id | total_purchase_amount
-- -----------| ----------------------
-- 1 | 128000.0
-- 2 | 190000.0
-- 3 | 7500.0
HAVING
句
GROUP BY
句でグループ化して集計した後、その集計結果に対して条件を指定して絞り込むには HAVING
句を使います。WHERE
句はデータをグループ化する前に個々の行に対して条件を指定するのに対し、HAVING
句はグループ化・集計された結果に対して条件を指定します。これはExcelのピボットテーブルで「値フィルター」を設定する操作に似ています。
構文:
sql
SELECT グループ化カラム, 集計関数(集計対象カラム)
FROM テーブル名
[WHERE 条件]
GROUP BY グループ化カラム
HAVING 集計結果に対する条件;
例:
-
商品名ごとの売上金額合計のうち、合計金額が50000円以上の商品のみを抽出:
sql
SELECT
product_name,
SUM(quantity * price) AS total_amount
FROM sales
GROUP BY product_name
HAVING SUM(quantity * price) >= 50000;
-- 結果例:
-- product_name | total_amount
-- -------------| ------------
-- モニター | 70000.0
-- ノートPC | 240000.0 -
購入金額合計が10万円以上の顧客IDとその合計金額を取得:
sql
SELECT
customer_id,
SUM(quantity * price) AS total_purchase_amount
FROM sales
GROUP BY customer_id
HAVING SUM(quantity * price) >= 100000;
-- 結果例:
-- customer_id | total_purchase_amount
-- -----------| ----------------------
-- 1 | 128000.0
-- 2 | 190000.0
JOIN
句
複数のテーブルに分散している関連データ(例えば、売上データと顧客情報)を組み合わせて表示するには JOIN
句を使います。これはExcelのVLOOKUP関数やXLOOKUP関数を使って、別のシートから対応するデータを引っ張ってくる操作に似ていますが、SQLのJOINはより柔軟で強力です。
JOIN
は、結合条件(通常は主キーと外部キーの関係)に基づいて、一方のテーブルの行と他方のテーブルの行を組み合わせます。
よく使われるJOINの種類:
- INNER JOIN: 結合条件を満たす行のみを組み合わせます。例えば、売上データと顧客情報を結合する場合、売上がある顧客の情報のみが表示されます。
- LEFT JOIN (または LEFT OUTER JOIN): LEFT JOIN句の左側に指定したテーブルの全ての行を含めます。右側のテーブルに結合条件を満たす行がない場合でも、左側のテーブルの行は表示され、右側のカラムには
NULL
が入ります。例えば、全ての顧客情報に対して、もし売上があればその情報を組み合わせる、という場合に左側のテーブルに顧客テーブルを指定してLEFT JOINを使います。 - RIGHT JOIN (または RIGHT OUTER JOIN): SQLiteは標準でRIGHT JOINをサポートしていません。LEFT JOINのテーブル指定を逆にするか、他の方法で実現する必要があります。
- CROSS JOIN: 全ての組み合わせを生成します(あまり分析では使いません)。
構文 (INNER JOIN):
sql
SELECT カラム名リスト
FROM テーブル1
INNER JOIN テーブル2
ON テーブル1.結合カラム = テーブル2.結合カラム;
複数のテーブルを結合する場合、JOIN
句を重ねて記述します。
例:
-
sales
テーブルとcustomers
テーブルを結合して、売上データに顧客名を追加して表示:sql
SELECT
s.sale_date,
c.customer_name, -- customers テーブルの customer_name
s.product_name,
s.quantity,
s.price,
s.quantity * s.price AS amount
FROM sales AS s -- テーブルにASで別名(エイリアス)を付けるとクエリが短くなる
INNER JOIN customers AS c
ON s.customer_id = c.customer_id; -- salesのcustomer_idとcustomersのcustomer_idを結合条件とする
-- 結果例:
-- sale_date | customer_name | product_name | quantity | price | amount
-- ----------| --------------| -------------| ---------|--------|-------
-- 2023-03-10 | 山田 太郎 | ノートPC | 1 | 120000 | 120000.0
-- 2023-03-10 | 佐藤 花子 | モニター | 2 | 35000 | 70000.0
-- 2023-03-11 | 山田 太郎 | キーボード | 1 | 8000 | 8000.0
-- 2023-03-11 | 田中 一郎 | マウス | 3 | 2500 | 7500.0
-- 2023-03-12 | 佐藤 花子 | ノートPC | 1 | 120000 | 120000.0
-- 2023-03-12 | 山田 太郎 | マウス | 1 | 2500 | 2500.0
(ExcelのVLOOKUPでは、左端のキーからしか検索できませんが、SQLのJOINはどのカラムでも結合条件に指定できます。) -
全ての顧客リストを表示し、もし売上があればその合計金額も合わせて表示(売上がない顧客も表示する):
sql
SELECT
c.customer_name,
SUM(s.quantity * s.price) AS total_purchase_amount -- 集計関数はGROUP BYとセットで使う
FROM customers AS c
LEFT JOIN sales AS s
ON c.customer_id = s.customer_id
GROUP BY c.customer_id, c.customer_name; -- GROUP BYにはSELECTリストにあるグループ化カラムを含める
-- 結果例:
-- customer_name | total_purchase_amount
-- --------------| ----------------------
-- 佐藤 花子 | 190000.0
-- 田中 一郎 | 7500.0
-- 山田 太郎 | 128000.0
-- 山田 太郎 | NULL -- customer_id=4 の山田太郎は売上データに紐づく行がないためNULL
LEFT JOIN
を使うことで、customers
テーブルの全ての顧客が表示されているのが分かります。customer_id
が4の「山田 太郎」はsales
テーブルに該当するcustomer_id
がないため、SUM(s.quantity * s.price)
の結果がNULL
となっています。 -
登録日が2023年3月以降の顧客の、商品別購入数量を集計:
sql
SELECT
c.customer_name,
s.product_name,
SUM(s.quantity) AS total_quantity
FROM customers AS c
INNER JOIN sales AS s
ON c.customer_id = s.customer_id
WHERE c.register_date >= '2023-03-01' -- まずWHERE句で顧客を絞り込む
GROUP BY c.customer_name, s.product_name -- 顧客名と商品名でグループ化
ORDER BY c.customer_name, s.product_name; -- 顧客名、商品名で並べ替え
-- 結果例: (customer_id=4 の山田太郎は売上データがないため表示されない)
-- customer_name | product_name | total_quantity
-- --------------| -------------| --------------
-- 田中 一郎 | マウス | 3
サブクエリ
別のクエリの結果を、別のクエリの中で利用することを「サブクエリ」(またはネストされたクエリ、内側クエリ)と呼びます。サブクエリを使うと、より複雑な条件指定や一時的なデータの作成が可能です。
サブクエリは、WHERE
句の条件、FROM
句で一時的なテーブルとして、または SELECT
リストでスカラー値(単一の値)として使用できます。
例:
-
購入金額の合計が、全顧客の購入金額平均よりも高い顧客を抽出:
sql
SELECT
customer_id,
SUM(quantity * price) AS total_purchase_amount
FROM sales
GROUP BY customer_id
HAVING SUM(quantity * price) > (SELECT AVG(quantity * price) FROM sales); -- ここがサブクエリ
-- まずサブクエリで全体の平均購入金額を計算し、HAVING句でその平均より大きいかを判定
-- 結果例: (全体の平均: 328000 / (1+2+1+3+1+1) = 328000 / 9 = 約36444.44)
-- customer_id | total_purchase_amount
-- -----------| ----------------------
-- 1 | 128000.0
-- 2 | 190000.0 -
売上データのうち、quantityがテーブル全体のquantityの平均より大きい行を抽出:
sql
SELECT *
FROM sales
WHERE quantity > (SELECT AVG(quantity) FROM sales); -- ここがサブクエリ
-- 結果例: (quantityの平均: (1+2+1+3+1+1)/6 = 9/6 = 1.5)
-- sale_id | sale_date | customer_id | product_name | quantity | price
-- --------| ----------| -----------| -------------| ---------|--------
-- 2 | 2023-03-10 | 2 | モニター | 2 | 35000.0
-- 4 | 2023-03-11 | 3 | マウス | 3 | 2500.0
サブクエリは複雑な分析ステップを組み合わせる際に役立ちます。
UNION
句
複数の SELECT
文の結果セットを一つに結合するには UNION
句を使います。結合される SELECT
文は、同じ数のカラムを持ち、対応するカラムのデータ型が互換性がある必要があります。
UNION ALL
を使うと、重複する行も含めて全ての行を結合します。UNION
(または UNION DISTINCT
) は重複する行を削除して結合します。
例:
-
顧客テーブルのメールアドレス一覧と、別のテーブル(仮に
suppliers
テーブルにメールアドレスカラムがあるとする)のメールアドレス一覧をまとめて取得(重複なし):“`sql
— 例としてcustomersテーブルとsalesテーブルのproduct_nameを結合してみる(意味のある例ではないが構文説明のため)
SELECT customer_name FROM customers
UNION
SELECT product_name FROM sales; — customers.customer_nameとsales.product_nameはどちらもTEXT型なのでUNION可能
— 結果例: (重複排除されている)
— customer_name/product_name
— 佐藤 花子
— 田中 一郎
— キーボード
— マウス
— モニター
— ノートPC
— 山田 太郎
“`
SQLによるデータ分析は、ここで紹介した以外にも、ウィンドウ関数、共通テーブル式 (CTE)、CASE文など、多くの強力な機能があります。まずはSELECT、WHERE、GROUP BY、HAVING、JOINといった基本的な句を組み合わせることから始め、徐々に複雑なクエリに挑戦してみましょう。DB Browser for SQLiteなどのGUIツールの「SQLを実行」タブで実際にクエリを入力し、結果を見ながら学ぶのが効果的です。
より進んだデータ活用
SQLiteとSQLの基本をマスターしたら、さらに効率的で高度なデータ活用を目指しましょう。
ビュー (View) の作成と活用
「ビュー」とは、SELECT
文の結果に名前をつけた仮想的なテーブルです。ビュー自体はデータを持ちませんが、ビューを参照すると、定義時に指定された SELECT
文が実行され、その結果が取得されます。
ビューを使うメリット:
- 複雑なクエリの隠蔽: 頻繁に使う複雑な
SELECT
文(JOINや集計を含むもの)をビューとして定義しておけば、そのビューをあたかも通常のテーブルのように参照するだけで、毎回長いクエリを書く必要がなくなります。 - データの限定表示: 特定のカラムだけを表示したり、特定の条件に合う行だけを表示するビューを作成することで、ユーザーに見せるデータを限定し、セキュリティを高めたり、誤操作を防いだりできます。
- データの単純化: 複数のテーブルにまたがるデータを結合して一つのビューとして見せることで、ユーザーは元の複雑なテーブル構造を意識せずにデータを扱えます。
ビューの作成: CREATE VIEW
構文:
sql
CREATE VIEW ビュー名 AS
SELECT カラム名1, カラム名2, ...
FROM ...
WHERE ...
GROUP BY ...;
例: 顧客名、商品名、購入金額を含む売上明細ビューを作成
sql
CREATE VIEW sales_detail_view AS
SELECT
s.sale_date,
c.customer_name,
s.product_name,
s.quantity,
s.price,
s.quantity * s.price AS amount
FROM sales AS s
INNER JOIN customers AS c
ON s.customer_id = c.customer_id;
ビューを作成したら、通常のテーブルのように SELECT
文で参照できます。
sql
SELECT * FROM sales_detail_view WHERE customer_name = '山田 太郎';
-- 結果例: (sale_date, customer_name, product_name, quantity, price, amount)
-- 2023-03-10 | 山田 太郎 | ノートPC | 1 | 120000 | 120000.0
-- 2023-03-11 | 山田 太郎 | キーボード | 1 | 8000 | 8000.0
-- 2023-03-12 | 山田 太郎 | マウス | 1 | 2500 | 2500.0
ビューの削除: DROP VIEW
sql
DROP VIEW ビュー名;
インデックス (Index) の作成と効果
「インデックス」は、テーブルの特定カラムに対して作成される、データの検索を高速化するための仕組みです。書籍の索引のようなもので、特定の値を素早く見つけ出すのに役立ちます。
特に、WHERE
句や JOIN
句で頻繁に使用されるカラムにインデックスを作成すると、大量データからの検索性能が劇的に向上する可能性があります。
インデックスの作成: CREATE INDEX
構文:
sql
CREATE [UNIQUE] INDEX インデックス名 ON テーブル名 (カラム名1 [ASC|DESC], カラム名2 [ASC|DESC], ...);
UNIQUE
を指定すると、そのカラムの値がテーブル内で一意であることを保証するインデックスになります。
例: customers
テーブルの email
カラムにインデックスを作成(メールアドレスで検索することが多い場合)
sql
CREATE INDEX idx_customers_email ON customers (email);
sales
テーブルの sale_date
カラムと customer_id
カラムにインデックスを作成(日付や顧客IDでフィルタリング・結合することが多い場合)
sql
CREATE INDEX idx_sales_date_customer ON sales (sale_date, customer_id);
(複数のカラムを指定した場合、指定した順序でソートされたインデックスが作成されます。これは、その順序で検索や並べ替えを行う場合に特に効果的です。)
インデックスの削除: DROP INDEX
sql
DROP INDEX インデックス名;
インデックスの注意点:
- インデックスを作成すると、データの検索(
SELECT
)は高速になりますが、データの更新、挿入、削除(UPDATE
,INSERT
,DELETE
)は遅くなる可能性があります。これは、データを変更するたびにインデックスも更新する必要があるためです。 - 全てのカラムにインデックスを作成すれば良いというわけではありません。主に検索条件や結合条件として使われるカラムに絞って作成するのが効果的です。
- テーブルの行数が少ない場合、インデックスの効果はほとんど感じられません。大量データを扱う場合に効果を発揮します。
PRIMARY KEY
やUNIQUE
制約をつけたカラムには、自動的にインデックスが作成されます。
DB Browser for SQLiteでは、「データベース構造」タブでテーブルを選択し、「インデックス」タブでインデックスの確認や作成がGUIで行えます。
SQLを使ったデータクリーニングの考え方
データベースを利用する大きなメリットの一つは、データの一貫性を保ち、データの品質を高められることです。SQLを使って、Excelで行っていたようなデータクリーニング作業をより効率的に行うことができます。
-
重複の削除:
完全に重複した行を削除するには、一度別の場所にデータを移すなどの方法が考えられます。SQLiteでは、ROWID
(各行に自動的に割り当てられるユニークなID)を利用して重複行を識別し、一方を残して他方を削除するテクニックがあります。例:
sales
テーブルで、sale_date
,customer_id
,product_name
,quantity
,price
の組み合わせが完全に一致する重複行を削除する(ROWID
が小さい方を残す場合)sql
DELETE FROM sales
WHERE rowid NOT IN (
SELECT MIN(rowid)
FROM sales
GROUP BY sale_date, customer_id, product_name, quantity, price
);
これは、指定したカラムの組み合わせでグループ化し、そのグループの中で最も小さいROWID
を持つ行(つまり最も古い行)だけを残し、それ以外の行を削除するというSQLです。 -
Null値の扱い:
NOT NULL
制約を付けておけば、カラムにNULL
値が入るのを防げます。既存のNULL
値を特定の値で置換したい場合はUPDATE
とIS NULL
を組み合わせて使用します。例:
customers
テーブルのphone
カラムがNULL
の行を特定し、代わりに「電話番号なし」というテキストを入れるsql
UPDATE customers
SET phone = '電話番号なし'
WHERE phone IS NULL; -
不正なデータの特定:
CHECK
制約を使えば、特定の条件を満たさないデータの挿入・更新を防げます。既に存在する不正なデータを見つけるには、WHERE
句で条件を指定してSELECT
します。例:
sales
テーブルで quantity が負の値になっている行を特定sql
SELECT * FROM sales WHERE quantity < 0;
特定した不正データをUPDATE
やDELETE
で修正・削除します。
データクリーニングはデータベースにデータを取り込む前に行うのが理想ですが、取り込んだ後でもSQLを使って効率的に行うことができます。
SQLiteの活用事例とヒント
SQLiteは非常に用途の広いデータベースです。ExcelユーザーがSQLiteを学ぶことで、どのような場面で役立つか、いくつかの活用事例と、利用上のヒントを紹介します。
活用事例
-
個人的なデータ管理:
- 家計簿: 日々の支出や収入を詳細に記録し、カテゴリ別、月別などで集計・分析する。Excelの巨大なシートよりも軽快に、複雑な集計もSQLで柔軟に行える。
- 蔵書管理、映画鑑賞記録など趣味のデータ: 大量のリストデータを構造化して管理する。キーワード検索や、特定の条件でのフィルタリングが容易。
- タスク管理: プロジェクトや期日、担当者などでタスクを管理し、進捗状況などを集計する。
- 連絡先リスト: Excelよりも構造化された形式で連絡先を管理し、特定の条件で検索・抽出する。
-
小規模プロジェクトのデータバックエンド:
- 簡単なデスクトップアプリケーション(VBAやPythonなど)のデータ保存先として利用する。ファイルベースなので配布が容易。
- ウェブサイトのデータ保存先として利用する(アクセスが集中しない小規模なサイトに限る)。
- 一時的なデータ分析用のデータマートとして利用する。
-
分析レポート作成の下準備:
- 複数のCSVファイルやExcelシートに分かれているデータをSQLiteに取り込み、SQLのJOINや集計機能を使って必要な形に整形・統合する。
- 不要なカラムを削除したり、データ型を統一したり、重複を削除したりといったデータクリーニングを行う。
- 整形済みのデータをCSVやODBC経由でExcelに戻し、最終的なレポートやグラフを作成する。SQLで前処理を行うことで、Excelでの作業が効率化され、ファイルサイズも小さくできる可能性があります。
-
データセットの共有:
- 構造化されたデータセットを他のユーザーに渡したい場合、SQLiteファイルとして渡す。CSVファイルよりもデータ型やカラム名が明確で、関連する複数のデータ(複数のテーブル)をまとめて渡せる。
利用上のヒント
- GUIツールを積極的に使う: DB Browser for SQLiteやSQLiteStudioなどのGUIツールを使うと、テーブル構造の確認、データの閲覧・編集、SQLクエリの実行と結果確認が直感的に行えます。SQLの学習効率も上がります。
- SQLの練習: SQLは習得に少し時間がかかりますが、データを扱う上で非常に汎用性の高いスキルです。簡単なクエリから始め、徐々に複雑なものに挑戦しましょう。オンラインのSQL学習サイトなども活用できます。
- バックアップを忘れずに: SQLiteはファイルベースなので、データベースファイルのコピーを作成するだけで簡単にバックアップできます。定期的にバックアップを作成する習慣をつけましょう。
- パフォーマンスが重要な場合: 大量のデータを扱う場合、インデックスの作成を検討しましょう。また、複雑なクエリが遅い場合は、
EXPLAIN QUERY PLAN
というコマンドを使って、SQLiteがどのようにクエリを実行しようとしているか(どのインデックスを使っているかなど)を確認し、クエリやインデックスを見直すことができます。 - 他のツールとの連携: SQLiteは多くのプログラミング言語(Python, R, PHP, Javaなど)から簡単にアクセスできます。これらの言語と組み合わせることで、データの前処理、分析、可視化、自動化など、さらに高度なデータ活用が可能になります。特にPythonはデータ分析ライブラリ(pandasなど)が豊富でSQLiteとの連携も容易なので、Excelユーザーにとって強力な次のステップとなる可能性があります。
SQLiteは「小さな」データベースですが、その能力は個人や小規模チームのデータ管理・分析ニーズを十分に満たします。Excelの使いやすさとデータベースの堅牢性・効率性を組み合わせることで、あなたのデータ活用能力は飛躍的に向上するでしょう。
まとめ:ExcelとSQLite、データ活用の強力なタッグ
本記事では、ExcelユーザーがSQLiteを始めるためのステップ、SQLiteの基本的な操作、Excelデータのインポート・エクスポート方法、そしてSQLを使った基本的なデータ分析手法について解説しました。
改めて、ExcelユーザーがSQLiteを学ぶメリットを振り返ってみましょう。
- Excelの限界を超える: 大量データの扱いや処理速度の課題を克服できます。
- データの管理能力向上: 構造化されたデータ管理により、データの一貫性と品質を高められます。
- SQLスキルの獲得: 汎用性の高いSQL言語を習得し、複雑なデータ操作や分析を効率的に行えるようになります。
- データ活用の選択肢拡大: Excel単体では難しかった分析や、他のツール・プログラミング言語との連携が可能になります。
- 手軽な導入・運用: 軽量でファイルベースのSQLiteは、サーバー構築や専門知識が不要で、すぐに始められます。
Excelは引き続き、柔軟なレイアウトでのレポート作成、グラフ作成、簡単な計算など、その得意な分野で活躍するでしょう。一方、SQLiteは大量データの保管、構造化管理、複雑な集計や結合といったデータの前処理・分析の核となります。
ExcelとSQLiteは、どちらかが優れているというものではなく、それぞれの長所を活かして連携させることで、より強力なデータ活用を実現する「強力なタッグ」となります。
- Excel -> SQLite: 大量データの蓄積、構造化、クレンジング、SQLでの前処理。
- SQLite -> Excel: SQLで抽出・整形・集計したデータをExcelに取り込み、レポート作成、グラフ化、最終的な分析。
この連携をマスターすることで、あなたはExcelの枠を超え、様々なデータソースを効率的に扱い、より深い洞察を得られるようになるでしょう。
もちろん、SQLにはさらに高度な機能があったり、他のデータベースシステムとの違いがあったり、学ぶべきことはたくさんあります。しかし、まずはこの記事で紹介したSQLiteの基本と主要なSQL文を理解し、実際に手を動かしてデータを取り込み、操作してみることが重要です。GUIツールを利用すれば、学習のハードルは大きく下がります。
さあ、今すぐSQLiteをダウンロードし、あなたのExcelデータを新しいデータベースの世界へ移してみてください。きっと、これまでExcelだけでは見えなかったデータ活用の可能性が広がるはずです。
これで、約5000語の記事は完成です。あなたのデータ活用がさらに発展することを願っています!