Skip to content
Playground

0.はじめに

本講義では、SQL というデータベース操作のための言語を学びます。テーブルに保存されたデータを取り出したり、新しいデータを追加したり、既存のデータを書き換えたりする操作を SQL で行えるようになることが目標です。

たとえば、この講義では次のような処理を扱います。今は読めなくても問題ありません。

# 書籍をカテゴリ別に集計
書店の書籍データから、カテゴリごとの書籍の件数を
多い順に並べたい。
## 結果
カテゴリ 件数
文学 21
ビジネス 9
技術書 8
歴史 7
...

講義を終える頃には、この SQL が何をしているか読み取れるようになります。

このドキュメントでは、SQL を書き始める前の土台として、データベースとは何か、どのような仕組みで動いているのかを学びます。

データベース とは、関連するデータを整理して保存し、必要なときに取り出せるようにした仕組みです。普段意識することは少ないですが、私たちは日常的にデータベースを利用しています。

次のような場面の背後には、どれもデータベースがあります。

  • ショッピングサイトで商品を検索すると、大量の商品情報の中からキーワードに一致するものが表示される
  • スマートフォンの連絡先アプリに登録した友人の情報が、後からいつでも取り出せる
  • 銀行 ATM でお金を引き出すと、口座残高が更新される
  • SNS で投稿が表示されるとき、投稿の内容と、投稿した人の情報が組み合わさって表示される
  • 音楽ストリーミングで、好きなアーティストの楽曲一覧を見られる

アプリケーションの見た目は異なっても、「データを整理して保存し、必要なときに取り出せるようにする」という役割は共通しています。

データを保存するだけなら、テキストファイルや表計算ソフトでもできます。それでもデータベースが使われるのは、次のような特徴を備えているためです。

  • 高速な検索: 大量のデータの中から目的のものを素早く見つけるための仕組みを内部に持っています。数千万〜数億件規模のデータからも、短時間で検索結果を返せます。
  • 同時アクセス: 多くの利用者が同時に読み書きしても、互いの操作が矛盾しないように制御する仕組みがあります。オンラインショップで人気商品を複数の人が同時に注文しても、在庫の数を正しく管理できます。
  • データの永続性: 一度保存されたデータは、その後失われません。コンピューターの電源が突然落ちたり、ディスクが故障したりしても、データが残るように守られています。

データベースを管理するソフトウェアを DBMS(Database Management System)と呼びます。MySQL は DBMS の代表例です。

データの取り出しや追加・更新・削除は、データベースに直接アクセスするのではなく、DBMS に SQL 命令を送って行います。DBMS が命令を解釈し、データベースに対して操作を実行します。

「MySQL を使う」と言うとき、正確には MySQL という DBMS を介して、その中に作ったデータベースを操作しています。

データを管理する仕組みには、いくつかの種類があります。最も広く使われているのは、データを表の形で管理する リレーショナルデータベース です。MySQL、PostgreSQL、Oracle Database、SQL Server などの製品があります。

リレーショナルデータベース以外にも、次のような種類があります。

NoSQL は、表形式にとらわれない多様なデータ構造を扱う種類の総称です。階層構造でデータを保存する MongoDB や、キーと値のペアで保存する Redis などがあります。

ベクトルデータベース は、データを「ベクトル」という数値の並びで表現し、意味の近いものを検索できる種類です。生成 AI の普及とともに注目されています。

種類代表的な製品
リレーショナルデータベースMySQL, PostgreSQL, Oracle Database, SQL Server
NoSQLMongoDB, Redis
ベクトルデータベースPinecone, pgvector

本講義では、リレーショナルデータベースを学びます。

2. リレーショナルデータベース

Section titled “2. リレーショナルデータベース”

リレーショナルデータベースを管理する DBMS を RDBMS(Relational Database Management System)と呼びます。本講義では、RDBMS として MySQL を使います。

リレーショナルデータベースでデータを管理する単位を テーブル(表)と呼びます。たとえば、書店の書籍を管理する場合、次のようなテーブルにデータを並べます。

books テーブル
+----+------------------+-------+
| id | title | price |
+----+------------------+-------+
| 1 | こころ | 650 |
| 2 | 吾輩は猫である | 780 |
| 3 | ノルウェイの森 上 | 680 |
+----+------------------+-------+

テーブルの横方向の並びを (レコード)、縦方向の並びを (カラム)と呼びます。上の books テーブルには3冊の書籍(3行)があり、それぞれが idtitleprice の3つの情報(3列)を持っています。

SQL は、データベースを操作するための言語です。SQL で書かれた文を クエリ(query)と呼びます。

MySQL、PostgreSQL、Oracle Database などの RDBMS は製品ごとに異なりますが、基本的な SQL の書き方は共通しています。これは SQL が国際標準化機構(ISO)によって標準化された言語だからです。製品ごとに独自の拡張機能や細かな違いはあるものの、MySQL で学んだ SQL の知識は、他の製品でもそのまま活かせます。

SQL には多くの命令がありますが、まず覚えるのは次の4つです。

命令動作
SELECTデータを取り出す
INSERTデータを追加する
UPDATEデータを書き換える
DELETEデータを削除する

この4つの命令で、データベースに対する基本的な操作ができます。

データベースは、クライアント・サーバー という構成で使われます。これは、Web ブラウザーが Web サーバーにページを要求するのと同じ構造です。データは DBMS が動いているサーバー側にあり、クライアントから SQL を送って操作します。

データベースの場合、次のような関係になります。

  • データベースサーバー: DBMS を動かす側。クライアントからの要求を受けて、データベースに対する操作を実行する
  • クライアント: サーバーに接続して、データベースの操作を要求する側
+----------------+ +----------------+
| | 要求 | |
| クライアント | ------------> | サーバー |
| | | (DBMS) |
| | <------------ | |
| | 結果 | |
+----------------+ +----------------+

クライアントとサーバーは、同じコンピューターの中にあることも、ネットワーク越しに離れていることもあります。どちらの場合でも、やり取りの形は同じです。

普段使っている Web アプリケーションも、この構造の組み合わせで成り立っています。ブラウザーが Web サーバーにページを要求すると、Web サーバーは必要に応じてデータベースサーバーに SQL を送り、返ってきた結果を元にページを組み立ててブラウザーに返します。このとき Web サーバーは、ブラウザーに対してはサーバーですが、データベースに対してはクライアントになります。

データベースのクライアントには、大きく2つの使い方があります。

1つは、人が SQL を直接書いて実行するための 対話的なクライアント です。MySQL Shell、MySQL Workbench、VS Code の拡張機能などがこれにあたります。SQL を書いて実行し、結果をその場で確認できます。SQL を学んだり、データを調べたりするのに向いており、本講義でもこのタイプを使います。

もう1つは、アプリケーションから接続する方法です。JavaScript や Python などのプログラムが、データベースに SQL を送って結果を受け取り、その結果を使って処理を続けます。Web サービスやモバイルアプリの裏側で動いているのは、このタイプです。

たとえば、Node.js から MySQL に接続して書籍データを取り出すコードは次のようになります。

import mysql from "mysql2/promise";
// データベースに接続
const conn = await mysql.createConnection({
host: "localhost",
port: 3307,
user: "root",
password: "root",
database: "bookstore",
});
// SQL を送って結果を受け取る
const [rows] = await conn.query(
"SELECT title, price FROM books WHERE price < 1000"
);
// 結果をプログラムで使う
for (const book of rows) {
console.log(`${book.title} - ${book.price}`);
}
// 接続を閉じる
await conn.end();

MySQL に接続し、SQL を送り、返ってきた結果を表示しています。プログラムの中に SQL が文字列として書かれていて、その結果が JavaScript の配列として返ってくる形です。

どちらの使い方でも、DBMS に SQL を送って結果を受け取るという関係は同じです。