🎯 この章で学ぶこと

  • Excelでのデータ管理が破綻する4つの理由
  • データベースとDBMS(データベース管理システム)の役割の違い
  • リレーショナルデータベースの考え方 — 表・行・列・キー
  • 主要なRDBMS製品(SQLite・MySQL・PostgreSQL・SQL Server・Oracle)の位置づけ
  • 学習環境としてSQLiteをセットアップし、最初のSQLを実行する

1.1 なぜ「Excel管理」は限界を迎えるのか

多くの職場で、顧客リストも備品台帳も問い合わせ記録も、まずExcelで管理されます。それ自体は悪いことではありません。数十件・担当者1人のうちは、Excelは最高のツールです。しかしデータと関係者が増えると、必ず次の4つの壁にぶつかります。

何が起きるかデータベースはどう解決するか
① 同時編集「誰かが開いているので読み取り専用です」。共有ブックにすると今度はファイルが壊れる何百人が同時に読み書きしても矛盾しないよう、DBMSが交通整理する(トランザクション)
② 整合性「田中」「田中様」「tanaka」が混在。退職者の行を消したら注文履歴も消えたデータ型・制約・キーの仕組みで「正しくないデータは最初から入らない」ようにする
③ 検索性能10万行を超えたあたりからVLOOKUPが固まる。「先月の部署別合計」を出すのに毎回30分の手作業SQLという言語で「条件・集計・並べ替え」を1行で宣言すれば、百万行でも一瞬で返す
④ 権限とログファイルを渡した瞬間、全データが相手のもの。誰がいつ何を変えたか分からないユーザーごとに「見られる範囲・変えられる範囲」を設定し、操作の記録を残せる

つまりデータベースとは、大量のデータを、複数人で、安全に、矛盾なく、高速に扱うための専用の仕組みです。Excelが「1人の道具」だとすれば、データベースは「組織のインフラ」です。

💡 身の回りはデータベースだらけ

銀行の残高、ECサイトの注文、勤怠打刻、社内の申請システム、スマホの連絡帳——すべて裏側にデータベースがあります。「システムを理解する」とは、かなりの部分「そのシステムがデータをどう持っているかを理解する」ことなのです。

1.2 データベースとDBMS — 「データ」と「番人」

用語を正確にしておきましょう。厳密には、この2つは別物です。

私たちが「MySQLを使う」「PostgreSQLを入れる」と言うとき、指しているのはDBMSのほうです。アプリケーションは直接ファイルを触るのではなく、必ずDBMSを経由してデータを読み書きします。この「必ず番人を通る」構造こそが、整合性と安全性の源泉です。

アプリケーション(Python・Webアプリ・Excelでさえも)
        │  SQL で依頼(「30歳以上の社員を出して」)
        ▼
      DBMS  ←── 権限チェック・同時実行の整理・整合性の保証
        │
        ▼
   データベース(ディスク上のデータ本体)

1.3 リレーショナルデータベースの考え方

現在の主流はリレーショナルデータベース(RDB)です。1970年にE.F.コッドが提案した歴史あるモデルで、データをすべて表(テーブル)の形で持ちます。

たとえば社員データはこうなります。

idnamedept_idhire_date
1佐藤 花子102019-04-01
2鈴木 一郎202021-10-01
3田中 実102023-04-01

ポイントは dept_id です。部署名を毎行に書く代わりに「部署テーブルの何番か」という参照だけを持っています。部署の情報は部署テーブルに1回だけ書く——この「データを重複させず、表と表の関係(リレーション)で表現する」発想がRDBの心臓部で、第2章と第6章でじっくり扱います。

そしてRDBを操作する共通言語がSQL(Structured Query Language)です。製品ごとに方言はあるものの、基本文法は共通なので、一度身につければどのDBMSでも通用します。

1.4 主要なRDBMS製品と選び方

実務で名前を聞く製品を整理しておきます。どれも「SQLで操作するRDBMS」という点は同じです。

製品特徴よく使われる場面
SQLiteサーバー不要。DB全体が1ファイル。Pythonに標準同梱スマホアプリ内、組み込み、小規模ツール、学習
MySQL / MariaDBオープンソースの定番。Webとの相性がよく情報が豊富Webサービス全般、レンタルサーバー
PostgreSQLオープンソース。機能が豊富で標準SQLへの準拠度が高い業務システム、データ分析基盤、近年のWeb開発
SQL ServerMicrosoft製。Windows環境・Office製品との親和性企業の業務システム、社内システム
Oracle Database商用の最大手。大規模・高可用性に強い金融・基幹系など、止められない大規模システム
✅ 「どれを学ぶか」は気にしなくてよい

SQLと設計の考え方は共通です。このコースはSQLiteで学びますが、身につくのは「どの製品でも通用する部分」です。就職先・現場がMySQLでもPostgreSQLでも、方言の差分を調べるだけで対応できます。

1.5 NoSQLという別の世界(予告)

「NoSQL」と呼ばれる、表形式にこだわらないデータベース群もあります。キーと値だけを超高速に出し入れするもの(Redis)、JSONのような柔軟な文書を保存するもの(MongoDB)などが代表です。SNSの「いいね」のように、厳密な整合性より速度と拡張性を優先したい場面で使われます。

ただし、NoSQLを理解する近道もまたRDBの理解です。「RDBの何を諦めて何を得たのか」という比較で初めてNoSQLの価値が分かるからです。詳しくは最終章(第10章)で扱います。

1.6 学習環境の準備 — SQLite

このコースでは、手を動かす環境としてSQLiteを使います。理由は3つ——①サーバーの構築が不要、②DBが1ファイルなので壊しても作り直せる、③Pythonに標準で入っている(第8章で活きます)。

コマンドラインツールの導入

各OSで sqlite3 コマンドを使えるようにします。

# Windows(winget を使う場合)
PS C:\> winget install SQLite.SQLite

# macOS(最初から入っています)
$ sqlite3 --version

# Ubuntu / WSL
$ sudo apt update && sudo apt install -y sqlite3
$ sqlite3 --version
3.45.1 2024-01-30 ...
💡 GUIで見たい人は「DB Browser for SQLite」

テーブルの中身を表計算ソフトのような画面で確認できる無料ツールです。ただし学習の主役はあくまでSQLの手打ちにしてください。GUIのボタン操作は「読めるけど書けない」を生みます。

最初のデータベースを作ってみる

ターミナルで次を実行してみましょう。practice.db というファイルが「あなたの最初のデータベース」です。

$ sqlite3 practice.db
SQLite version 3.45.1
Enter ".help" for usage hints.
sqlite> CREATE TABLE hello (id INTEGER, message TEXT);
sqlite> INSERT INTO hello VALUES (1, 'はじめてのSQL!');
sqlite> SELECT * FROM hello;
1|はじめてのSQL!
sqlite> .quit

3行のSQLで、テーブルを作り、データを入れ、取り出しました。それぞれの文法はこれからの章で丁寧に学ぶので、いまは「対話しながらデータを操作する感覚」だけつかめれば十分です。なお、SQLの文末には ;(セミコロン)を付けます。

⚠️ 「.quit」など先頭がドットの命令はSQLではない

.quit .tables .help などは sqlite3 コマンド専用の操作(ドットコマンド)で、SQLではありません。他のDBMSでは通用しないので、区別して覚えてください。

🛡️ セキュリティ・運用の視点 — データベースは「会社で一番狙われる場所」

情報漏えい事件の報道で「顧客情報◯万件が流出」とあるとき、漏れたのはほぼ間違いなくデータベースの中身です。攻撃者にとってWebサイトやPCへの侵入は通過点にすぎず、最終目的地はデータベースです。だからこそDBを学ぶ人は最初から「このデータは誰が読めるべきか」「漏れたら何が起きるか」を考える癖をつけてください。Excelファイルをメール添付で回す運用と比べて、DBは権限管理も記録もできる分、正しく使えばはるかに安全にできます——「正しく使えば」の中身を、このコース全体で学んでいきます。

まとめ

練習問題

問題 1-1

あなたの職場(または想像上の会社)で「Excelで管理されているが、データベースにすべきだ」と思うデータをひとつ挙げ、1.1節の「4つの壁」のうちどれが実際に起きているか(起きそうか)を説明してください。

解答を見る

解答例:「全社の備品貸出台帳」。①同時編集の壁(拠点ごとにファイルが分裂し、どれが最新か分からない)、②整合性の壁(同じノートPCが「NEC-01」「ノートPC黒」と別名で登録され、貸出中なのに在庫ありに見える)が起きている。データベース化すれば、備品テーブルと貸出履歴テーブルに分け、全拠点が同じデータを同時に更新でき、「存在しない備品の貸出」は制約で防げる。——このように「壁」と「解決の形」をセットで説明できれば正解です。

問題 1-2

1.6節の手順で practice.db を作り、hello テーブルに自分の好きなメッセージをもう1行追加して、2行とも表示されることを確認してください。終わったら、作られた practice.db がただのファイルであることを ls -l(Windowsは dir)で確かめてください。

解答を見る

実行例:

sqlite> INSERT INTO hello VALUES (2, 'データベース学習開始');
sqlite> SELECT * FROM hello;
1|はじめてのSQL!
2|データベース学習開始
sqlite> .quit
$ ls -l practice.db
-rw-r--r-- 1 user user 8192 ...  practice.db

SQLiteではデータベース全体がこの1ファイルに収まっています。つまりこのファイルを盗まれる=全データが漏れるということでもあります(第9章で対策を学びます)。