データベースとは何か
表計算シートの見た目から出発し、「文字列を送ると表が返ってくる」データベースの基本的な仕組みを理解します。
- データベースは、表計算ソフトと何が同じで、何が違うのか
- 何を送ると、どのような形で結果が返ってくるのか
- 「データが入っている」とは、物理的にどこに何があることなのか
まずは動かしてみる: 見慣れた表の姿
細かい説明に入る前に、まずは下の枠内にある「実行する」ボタンを押してみてください。枠の中に書かれた1行のクエリが送信され、結果が表示されます。
10 行 5 列の表が表示されたはずです。1 つの行が 1 人の顧客を表し、列には id、name、email、tier、created_at の 5 つが並んでいます。 これはスプレッドシートを開いたときの見た目とまったく同じで、行が個々のデータ、列が項目の定義、そして空欄(データなし)も存在します。 しかし、決定的な違いが 1 つあります。あなた自身はファイルを開いていません。短い文字列(SQL)を送信しただけで、画面に整った表が届いたのです。
つまり、裏側に「この表を安全に預かり、指示された通りに表を作って返してくれる存在」がいます。この「データを預かり、リクエストに応じてデータを加工・抽出して返す相手」をデータベース(database)と呼びます。 そして、預けている 1 枚 1 枚の表のことをテーブル(table)と呼び、今取得したのが customers(顧客テーブル)です。
表計算ソフトの場合、データは手元のファイルとして存在し、各自が直接開いて編集します。そのため、編集する人の数だけコピーが増え、ズレが生じます。 一方のデータベースでは、データはサーバー側に 1 つだけ存在し、利用者はリクエストを送って必要なデータを受け取ります。この根本的な違いを図で整理してみましょう。
SQL の基本: 文字列で欲しいデータを伝える
データベースへの頼み方(クエリの書き方)を変えると、返ってくる表の内容も変化します。3つのクエリを順番に試してみましょう。実行する前に「期待」の欄を確認し、実行後に返ってきた表の形(行数と列数)に注目してください。
1つ目は「10 行 2 列」、2つ目は「2 行 5 列」、3つ目は「1 行 1 列(値は 10)」という結果が返ってきたはずです。 列を選ぶと横幅が狭まり、行を絞り込むと縦が減り、件数を数えると 1 マス(単一の値)になりました。送ったクエリの違いは、SELECT の後ろと FROM customers の後ろの指定だけです。
この、データベースに対する指示の文法ルールを SQL(エスキューエル)と呼びます。SELECT は「取得せよ」、FROM は「〜というテーブルから」を意味します。SELECT と FROM の間にカンマ区切りで列名を並べれば特定の列だけを取り出すことができ、*(アスタリスク)を指定すれば「すべての列」を取得できます。WHERE は「〜という条件を満たす行だけ」、COUNT(*) は「行数を数えよ」という指示です。英語の日常会話に近い直感的な言葉で書かれていることがわかります。 なお、WHERE や COUNT の詳細な活用法は第2章と第3章でじっくり学んでいきます。
これら 3 つの結果を見比べて、ぜひ覚えておいてほしい重要な共通点があります。列を絞っても、行を絞り込んでも、件数を数えただけでも、返ってくる結果はすべて「表」の形をしているという点です。 単一の数値を問い合わせた場合でも、それは「1行1列の表」として届きます。「どんな指示を出しても、答えは常に表の形式で返ってくる」。文字列を送ると表が返る、というこのやりとりの基本原則は、本教材の最後まで一貫して変わりません。
テーブルの一覧: どんな表が管理されているか
ここまでは顧客テーブル(customers)だけを見てきました。このオンラインショップでは、他にどのようなデータが預けられているのでしょうか。全体の一覧を確認してみましょう。
categories、customers、order_items、orders、product_categories、products、stocks という 7 行が縦に並んで表示されたはずです(第1章で新しいテーブルを作成した後に戻ってくると8行になります)。これも 1 列の表として返ってきています。 このショップで管理されているのは顧客だけではありません。商品、注文、注文明細、在庫、商品カテゴリなど、それぞれのデータが 1 枚の独立したテーブルとして整理されています。
結果の列の見出しを見ると、Tables_in_lab_basics と記載されています。この lab_basics とは、これら 7 枚のテーブルをひとまとめにして格納している「入れ物(スキーマ)」の名前です。 表計算ソフトに例えるなら、「1つのファイルの中に7枚のワークシートが収まっている状態」と言えます。 実務では、この入れ物自体のことも「データベース」と呼びます。つまり「データベース」という言葉には、「リクエストに応じてデータを返すシステム相手」という意味と、「テーブル群をまとめた入れ物(lab_basics)」という2つの意味があります。文脈に応じて使い分けましょう。
チームの先輩が口にしていた「MySQL」とは、まさにこのテーブルの束を厳重に管理し、私たちのリクエストに応じてデータを処理しているプログラム(ソフトウェア)の名称です。 本教材では、第一部で lab_basics、第二部で lab というデータベースを扱っていきます。
裏側の仕組み: データベースサーバーの存在
ここまで「相手」と呼んできたデータベースが、システムのどこでどのように動いているのかを少し覗いてみましょう。次の 2 つのラボは、実行して返ってきた結果をざっと眺めるだけで十分です。内容を細かく解読する必要はありません。
1つ目のクエリを実行すると、8.0.46 のようなバージョン番号が返ってきたはずです。テーブルを指定していないにもかかわらず、結果が返ってきました。これは、データベースが単に保管されている表を返すだけでなく、自ら演算を行って結果を生成できるプログラムであることを示しています。
2つ目のクエリでは複数行の表が表示され、Info 列に SHOW PROCESSLIST と書かれた行があるはずです。それが、今まさにクエリを実行したあなた自身の接続です。 他の行には、同じデータベースに接続している他のクライアントや、データベース自身の内部処理が並んでいます。Time 列を見ると、あなたが操作する前からずっと存在している接続もあります。 データベースは、私たちが画面を操作する前から常に起動しており、操作していない間も動き続けています。 ここで把握しておきたいのは、「データベースという単一の相手に対して、同時に何人ものクライアントが接続して指示を出している」という全体像です。
このように、常にバックグラウンドで起動してリクエストを待ち構えているプログラムをサーバー(server)と呼びます。指示を出す側(このブラウザ画面)がクライアント(client)です。 そして、ブラウザとサーバーの間に結ばれている通信の経路を接続(connection / セッション)と呼び、先ほどのプロセスの表の各行がまさに1本ずつの接続に対応しています。
「データが MySQL に入っている」という言葉の物理的な実態もここにあります。7 枚のテーブルデータは、サーバーが稼働しているマシンのストレージ(ディスク)上に、専用のファイルとして大切に保管されています。 そのファイルを直接開いて読み書きするのはデータベースサーバーだけであり、ユーザーや Web アプリケーションが直接ファイルを開くことはありません。私たちは常にサーバーに SQL で依頼し、結果として作られた表を受け取るのです。
なぜスプレッドシートでは限界があるのか
データを読む、絞り込む、件数を数える。ここまでの操作は、Excel や Google スプレッドシートでも手軽に行えます。顧客がたった 10 人程度であれば、むしろ表計算ソフトの方が簡単かもしれません。 しかし、チームに着任した初日に聞いた「ファイルが壊れた」というトラブルを思い返してみてください。それは、データ量が増えたり複数人で運用する際に生じる、次の4つの典型的な課題に集約されます。データベースは、まさにこの 4 つの破綻を防ぐために生まれました。
- 同時の更新で上書きされる: 2人が同時に同じ行を編集した結果、後から保存した方の内容で上書きされ、もう片方の編集内容が消えてしまう。 → 第7章「途中を見せない(トランザクション)」で解決
- 処理の途中でクラッシュする: 保存処理の途中でエラーが発生し、「注文データは作成されたのに在庫データが減っていない」といったデータの不整合(食い違い)が残ってしまう。 → 同じく第7章で解決
- データ量が膨大で検索が終わらない: データが100万行を超えた結果、特定の顧客の注文を探すだけでも毎回全データを読み込むことになり、極端に遅くなる。 → 第8章「インデックスの正体」、および第二部で解決
- 表ごとのデータ整合性が崩れる: 注文データと商品データの間で商品名の表記揺れが発生したり、すでに削除されたはずの商品を参照する注文が残ってしまう。 → 第4章「テーブルをつなぐ」、第5章「データを変える」で解決
現時点では「実務にはこうした落とし穴がある」ということだけ把握しておけば大丈夫です。今後の各章を通じて、スプレッドシートでは壊れてしまう現象が、データベースによってどのように防がれるのかを実際に体験していきましょう。
① 同時に更新して上書き
後から保存した方の内容で上書きされ、もう片方の編集内容が消える
② 途中で落ちて食い違う
注文はあるのに在庫が減っていない、中途半端な状態で保存される
③ 行数が増えて探せない
100万行を超えると、1件探すだけでも全行を毎回読み込んで固まる
④ データの整合性が崩れる
商品名の表記揺れで別集計されたり、消えた商品を参照する注文が残る
データベースとは、信頼できるデータを一箇所で安全に預かり、指示された条件に応じて表を生成して返し続ける仕組みである。
理解度の確認
FROM 句を書かない SELECT クエリが成立するのはなぜでしょうか?
単に行数を数えるだけのクエリでも、結果が表の形式で返ってくるのはなぜですか?
複数人が同時にデータを閲覧・操作しても内容が食い違わないのはなぜですか?
次の章へ
最初に取得した customers テーブルには、行と列のほかに、左端の管理番号や、NULL と表示された空欄が存在していました。 第1章では、そのテーブルの内部を詳しく観察しながら、行・列・主キー・データ型・NULL といった重要な概念を学んでいきます。これらの意味が理解できるようになると、自分自身で新しいテーブルを設計・作成できるようになります。