SQLを一言で言うと
SQL(Structured Query Language)とは、リレーショナルデータベースに対して「欲しい結果」を宣言的に記述する問い合わせ言語です。 1974年にIBMのDonald ChamberlinとRaymond Boyceが発表した「SEQUEL」が原型で、1986年にANSIによって標準化されて以降、 商用DB・オープンソースDB・分析エンジンを問わず事実上の標準として君臨し続けています。
2026年時点でもSQLはStack Overflow Developer Survey 2024で使用言語の第4位(51.0%)、 DB-Engines Rankingの上位4つ(Oracle, MySQL, SQL Server, PostgreSQL)はすべてSQL系。 NoSQLやグラフDBの台頭を経てなお、主要な分散DB(CockroachDB, TiDB, Spanner, Amazon Aurora DSQL)と OLAPエンジン(Snowflake, BigQuery, DuckDB, ClickHouse)はSQLを第一級の問い合わせインターフェースに据えています。
宣言的(Declarative) vs 手続き的(Imperative)
SQLの最大の特徴は、「WHAT(何が欲しいか)」だけを書き、「HOW(どう取るか)」は書かないという点にあります。 この設計哲学が、半世紀にわたってSQLを第一線で戦わせ続けてきた最大の武器です。
同じ問い「30歳以上のユーザの平均年齢」を、手続き的に書いた場合とSQLで書いた場合を比べてみましょう。
# 手続き的なコード(Python) — HOWを全て記述する
total = 0
count = 0
for user in users:
if user.age >= 30:
total += user.age
count += 1
avg = total / count if count > 0 else None -- SQL — WHATだけを記述する
SELECT AVG(age) FROM users WHERE age >= 30; SQLはループも条件分岐も明示せず、「平均を出して欲しい」という結果だけを述べています。 どうやってデータを読むか(インデックスを使うのか、並列で処理するのか、集約を先にするのか)は、 DBMSの「オプティマイザ」が自動で決定します。
graph LR
A["SQL文 (WHAT)"] --> B["Parser"]
B --> C["Optimizer<br/>(HOWを決定)"]
C --> D["Executor"]
D --> E["結果"]
style A fill:#3b82f6,color:#fff
style C fill:#8b5cf6,color:#fff
style E fill:#14b8a6,color:#fff| 観点 | 手続き的コード | SQL (宣言的) |
|---|---|---|
| 記述するもの | アルゴリズム(HOW) | 結果の仕様(WHAT) |
| 実行戦略 | 開発者が明示 | オプティマイザが自動決定 |
| 並列化 | 開発者が明示的に実装 | 自動で並列化可能 |
| 物理変更への追従 | コード変更が必要 | クエリはそのまま、プランだけ変わる |
| 可読性 | 実装詳細に引きずられる | 意図が1行で伝わる |
| デメリット | 変更に弱いが挙動は予測可能 | プランが変わり性能が急変する事がある |
リレーショナルモデル — SQLの数学的基盤
SQLの土台は、1970年6月にE. F. Coddが論文「A Relational Model of Data for Large Shared Data Banks」で提唱したリレーショナルモデルです。 Codd以前のデータベースは階層型(IBM IMS)やネットワーク型(CODASYL)で、 アプリケーションはデータの物理配置(ポインタ)に縛られていました。 Coddはこれを集合論と述語論理の用語で再定義し、物理的な格納方法からアプリケーションを解放しました。
基本語彙 — 関係・タプル・属性
SQLで日常的に使う「テーブル・行・列」という言葉は、実はリレーショナルモデルの数学的概念を実装視点に読み替えたものです。 両者の対応を押さえておくと、関係代数の議論にすんなり入れます。
| 数学的概念 | SQL実装 | 補足 |
|---|---|---|
| 関係 (relation) | テーブル (TABLE) | 属性に対するタプルの集合。概念上は順序なし |
| タプル (tuple) | 行 (ROW) | 1件のエンティティ。属性値の組 |
| 属性 (attribute) | 列 (COLUMN) | 名前 + ドメイン(型) |
| ドメイン (domain) | データ型 + 制約 | INTEGER、VARCHAR(50) + CHECK(x > 0) など |
| 次数 (degree) | 列数 | 関係の属性数 |
| 濃度 (cardinality) | 行数 | タプル数 |
| 候補キー | UNIQUE制約 | タプルを一意に識別する極小属性集合 |
| 主キー | PRIMARY KEY | 候補キーのうち代表として選んだもの |
| 外部キー | FOREIGN KEY | 他関係の主キーを参照する属性 |
集合としての関係 — 順序も重複も無い
純粋なリレーショナルモデルでは、関係は集合であり、行の順序も重複も存在しません。 SQLは実用上この制約を緩め、重複を許す「マルチセット(bag)」を採用していますが、 これは実装上の妥協であり、理論とのズレを生みます(`SELECT DISTINCT` や `UNION` vs `UNION ALL` の存在理由)。
graph TD
subgraph "関係 users"
T1["(1, Alice, 30)"]
T2["(2, Bob, 25)"]
T3["(3, Carol, 42)"]
end
subgraph "属性 (スキーマ)"
A1[id: INTEGER]
A2[name: TEXT]
A3[age: INTEGER]
end
A1 -.-> T1
A2 -.-> T1
A3 -.-> T1閉包性と合成可能性 — なぜSQLは短く書けるのか
リレーショナルモデルが持つ最も強力な性質が「閉包性 (closure)」です。 関係代数の演算子(選択σ、射影π、結合⋈、和∪など)はすべて「関係を入力し、関係を出力する」。 つまり演算の結果もまた関係なので、その結果を次の演算の入力にできます。
これは次の2つの強力な帰結をもたらします。
- 合成可能性 (composability): 複雑なクエリを、単純な演算の合成として表現できる
- 書き換え可能性: 代数法則(可換律・結合律・分配律)を使って、同じ結果を返す別の計算順序に変換できる → これがオプティマイザの理論的根拠
-- サブクエリは「関係を返す式」なので、テーブルが書ける場所ならどこにでも置ける
SELECT name
FROM (
SELECT * FROM users WHERE age >= 30 -- ここが関係を返す
) AS adults -- それを次の演算の入力にする
WHERE name LIKE 'A%'; なぜSQLは半世紀君臨し続けるのか
1974年の誕生から2026年まで52年、NoSQLの挑戦もグラフDBの台頭も、SQLを玉座から引きずり下ろせていません。 その理由は単なる「先行者優位」ではなく、SQL自体が持つ3つの構造的優位性にあります。
| 優位性 | 内容 | 帰結 |
|---|---|---|
| 数学的基盤 | 関係代数と述語論理に根ざす | 意味論が曖昧さなく定義でき、自動書き換えが可能 |
| 物理独立性 | 論理クエリと物理実装の分離 | 行指向→列指向、B+tree→LSM、単一機→分散 と進化してもSQLは変わらない |
| 直交的な文法 | 閉包性による自由な合成 | サブクエリ・CTE・ウィンドウ関数で際限なく表現を拡張できる |
| ISO標準化 | 1986年以降10回の改訂 | 製品を超えた知識の蓄積、ポータビリティ |
| 実行モデル進化 | Volcano→Vectorized→JIT Compiled | SQLは変えずに裏側だけ進化できる |
NoSQLの製品は「水平スケーラビリティ」や「柔軟スキーマ」を武器にSQLを攻撃してきましたが、 その多くが最終的にはSQL-likeな問い合わせ言語(CQL, N1QL, PartiQL)を追加する道を辿りました。 これは「宣言的+集合的+合成可能」という問い合わせモデルの優秀さが、データモデルを越えて普遍的であることの証左です。
第1章のまとめ
- SQLは宣言的言語。WHATを書けばHOWはオプティマイザが決める
- 基盤はE. F. Codd (1970) のリレーショナルモデル。関係=テーブル、タプル=行、属性=列
- 関係代数の閉包性が、サブクエリやCTEの合成可能性と、オプティマイザの書き換え最適化を同時に可能にしている
- SQLが半世紀君臨する理由は数学的基盤・物理独立性・ISO標準化・実行モデル進化の4点セットの構造的優位
次章では、この設計哲学がどのような歴史的な試行錯誤から生まれたのかを追います。 Codd vs SEQUEL、QUEL vs SQLの論争を経て、SQLがどう事実上の標準に育ったのか、半世紀の年表を一気に辿ります。
理解度チェック
SQLを「宣言的言語」と呼ぶ理由として最も適切なものはどれですか?
キーボード: 1〜4 で選択、Enter で回答