この章では、データベースとは何か、データをどのような形で保存するのか、そしてデータベースに指示を出す言葉である SQL とは何かを学びます。あわせて、この教材で作る2つのテーブルの設計を確認します。SQL の入力は第2章から始まるので、この章は読んで理解する章です。
この章で学ぶこと
- データベースと DBMS の役割
- テーブル・行・列という、リレーショナルデータベースのデータの形
- 主キーと外部キー
- SQL の役割と、SQL 文の4つの種類
- この教材で作る部署テーブルと社員テーブル
1.1 データベースとは
データベース は、たくさんのデータを決まった形で保存し、必要なときに取り出せるようにした、データの集まりです。たとえば、会社の社員の情報(氏名、年齢、所属する部署など)を社員管理アプリで扱うとき、その情報はデータベースに保存されます。
データを保存するだけなら、表計算ソフトのファイルやテキストファイルでもできます。しかし、業務のシステムでは、次のようなことが求められます。
- 何万件、何百万件のデータの中から、条件に合うものを 速く 取り出す
- 複数の人やプログラムが 同時に 読み書きしても、データが壊れない
- 「年齢に文字を入れてはいけない」「存在しない部署を指定してはいけない」といった 決まりを守らせる
- 途中で失敗したときに、中途半端な状態にならないように 元に戻せる
これらを引き受けてくれるソフトウェアが DBMS(Database Management System:データベース管理システム)です。この教材で使う Oracle Database は、DBMS のひとつです。「データベース」という言葉は、データの集まりそのものを指すことも、DBMS を含めた仕組み全体を指すこともあります。
1.2 テーブル・行・列
Oracle Database のように、データを 表の形 で保存するデータベースを リレーショナルデータベース(RDB)といいます。表のことを テーブル と呼びます。この教材で作る社員テーブルは、次のような形です。
| EMP_ID | NAME | GENDER | AGE | BIRTH_DATE | DEPT_ID | ADDRESS |
|---|---|---|---|---|---|---|
| 1 | 雷禅 海皇 | 1 | 26 | 2000-06-22 | 2 | 大阪府 |
| 2 | 院照 心愛 | 2 | 27 | 1999-07-11 | 1 | 京都府 |
| 3 | 林檎 星飛 | 1 | 24 | 2001-12-24 | 3 | 東京都 |
| 用語 | 意味 | 上の表では |
|---|---|---|
| テーブル(表) | 同じ種類のデータを集めた表。名前を持つ | 社員テーブル(EMPLOYEE) |
| 行(レコード) | 1件分のデータ。横1列 | 「1、雷禅 海皇、1、26、…」が1行 |
| 列(カラム) | データの項目。縦1列。名前とデータ型を持つ | EMP_ID、NAME、AGE など7列 |
テーブルを作るときに、「どんな列があり、それぞれの列にどんな種類の値(数、文字、日付)が入るか」を決めます。これを テーブルの定義 といいます。行は、データを登録するたびに増えていきます。
【知識メモ】列の名前が英語なのはなぜか
列の名前は日本語でも付けられますが、業務のシステムでは、プログラムから扱いやすいように EMP_ID・NAME のような英語の名前を付けるのが一般的です。この教材の列名は、Spring入門で作る社員管理アプリの Java のプログラムから使う名前に合わせています。単語の区切りは _(アンダースコア)で書きます。
1.3 主キーと外部キー
主キー
テーブルの中の1行を 確実に特定できる列 を 主キー(プライマリキー)といいます。社員テーブルの主キーは、社員ID(EMP_ID)です。
氏名は主キーにできません。同じ氏名の社員が2人いるかもしれないからです。主キーの列には、次の決まりがあります。
- 同じ値を持つ行が 2つ以上あってはならない(一意である)
- 値が 空であってはならない
「社員IDが 3 の社員」と言えば、必ず1人に決まります。データを変更したり削除したりするときは、この主キーで対象の行を指定します。
外部キー
社員テーブルの DEPT_ID の列には、「1」「2」「3」のような部署IDが入っています。部署の名前(総務部、営業部、…)は、社員テーブルには書かず、別の 部署テーブル に持たせます。
| DEPT_ID | DEPT_NAME |
|---|---|
| 1 | 総務部 |
| 2 | 営業部 |
| 3 | 開発部 |
| 4 | 人事部 |
社員テーブルの DEPT_ID のように、別のテーブルの主キーを参照する列 を 外部キー といいます。外部キーには、「参照先のテーブルに存在する値しか入れられない」という決まりを付けられます。この決まりがあると、存在しない部署ID(たとえば 9)を持つ社員は登録できなくなり、データの食い違いを防げます。

図1-2 社員テーブルの DEPT_ID は、部署テーブルの DEPT_ID を参照する
【知識メモ】部署名を社員テーブルに書かない理由
社員テーブルに部署名をそのまま書くと、同じ「営業部」という文字が社員の数だけ繰り返し保存されます。部署の名前が変わったときは、該当するすべての社員の行を書き換えなければならず、1行でも直し忘れると食い違いが生まれます。部署テーブルに1回だけ書いておけば、直すのは1か所で済みます。このように、繰り返しをなくすようにテーブルを分けることを 正規化 といいます。この教材では、部署と社員の2つに分けた形をそのまま使います。
【知識メモ】ER 図
テーブルと、テーブル同士のつながりを表した図を ER 図(Entity-Relationship Diagram)といいます。この教材の2つのテーブルを ER 図で表すと、図1-3 のようになります。四角1つが1つのテーブルで、主キー(PK)と外部キー(FK)の列に印を付け、外部キーでつながるテーブル同士を線で結びます。線の両端の「1」と「多」は、1つの部署に社員が何人もいることを表します。
現場の設計書には ER 図がよく載っていて、どのテーブルをどの列で結合すればよいか(第10章)を ER 図で確かめます。線の端の記号などの書き方は、使う道具によって違います。
1.4 SQL とは
SQL(エスキューエル)は、DBMS に指示を出すための言葉です。「テーブルを作れ」「この行を登録しろ」「年齢が30以上の社員を取り出せ」といった指示を、決まった書き方の文で書きます。1つの指示を SQL 文 といいます。
SELECT NAME, AGE FROM EMPLOYEE WHERE AGE >= 30;
この SQL 文は、「社員テーブル(EMPLOYEE)から、年齢(AGE)が30以上の行の、氏名(NAME)と年齢(AGE)を取り出せ」という意味です。英語の文に近い形をしているので、読めば意味が推測できるのが SQL の特徴です。
SQL は、Oracle Database だけでなく、MySQL、PostgreSQL、SQL Server など、ほとんどのリレーショナルデータベースで使えます。基本の書き方は共通ですが、細かい部分(データ型の名前、関数の名前など)はデータベースごとに少しずつ違います。この教材では Oracle Database の書き方で説明します。Oracle Database の SQL の正式な書き方は、Oracle の公式ドキュメント「SQL言語リファレンス」にまとめられています(1.5 の「公式ドキュメント」)。
【知識メモ】ネットの SQL は、ほかのデータベースの書き方のことがある
ネットで見つかる SQL の例は、MySQL や PostgreSQL のものが多く、Oracle Database ではそのまま動かないことがあります。たとえば、先頭から3行だけ取り出すとき、MySQL では最後に LIMIT 3 と書きますが、Oracle Database では FETCH FIRST 3 ROWS ONLY と書きます。ネットの例を参考にするときは、どのデータベースの書き方かを確かめてください。
SQL 文の種類
SQL 文は、何をするかによって、大きく次のように分けられます。
| 分類 | 役割 | 主な SQL 文 | 章 |
|---|---|---|---|
| DDL (データ定義) |
テーブルなどの入れ物を作る・消す |
CREATE TABLE・DROP TABLE・CREATE SEQUENCE
|
第3章 |
| DML (データ操作) |
テーブルの中のデータを登録する・取り出す・変更する・削除する |
INSERT・SELECT・UPDATE・DELETE
|
第4章〜第10章 |
| TCL (トランザクション制御) |
データの変更を確定する・取り消す |
COMMIT・ROLLBACK
|
第4章・第7章 |
| DCL (データ制御) |
ユーザーに権限を与える | GRANT |
第2章 |
この教材で特によく使うのは、DDL と DML の2つです。
- DDL(Data Definition Language)は、テーブルという 入れ物の形 を決める SQL 文です。どんな列があり、それぞれにどんな値が入るかを決めます。テーブルを作るときに一度実行し、普段の操作ではあまり使いません
- DML(Data Manipulation Language)は、入れ物の 中のデータ を扱う SQL 文です。業務のアプリは、画面の操作のたびに DML を実行します
【便利な使い方】「このテーブルの DDL をください」
現場では、テーブルを作る CREATE TABLE 文そのものを指して「DDL」と呼ぶことがよくあります。「このテーブルの DDL をください」「DDL を見ればテーブルの定義が分かる」のように使います。テーブルの列やデータ型、制約を確かめたいとき、DDL を見るのがいちばん確実だからです。SQL Developer では、テーブルを開いて「SQL」タブを選ぶと、そのテーブルの DDL が表示されます(第3章)。
CRUD
DML の4つの SQL 文は、データに対して行う4つの操作にあたります。この4つの操作は、英語の頭文字を取って CRUD(クラッド)と呼ばれます。
| CRUD | 操作 | SQL 文 | 章 |
|---|---|---|---|
| C(Create) | データを登録する | INSERT |
第4章 |
| R(Read) | データを取り出す(読み取る) | SELECT |
第5章 |
| U(Update) | データを変更する | UPDATE |
第7章 |
| D(Delete) | データを削除する | DELETE |
第7章 |
業務のアプリが行うデータベースの操作は、ほとんどがこの4つの組み合わせです。社員管理アプリなら、社員の登録が C、一覧の表示が R、変更が U、削除が D です。この教材の中心も、この4つです。CRUD の C が CREATE ではなく INSERT であることに注意してください。CREATE TABLE は入れ物を作る DDL で、データを登録する CRUD の C とは別のものです。
【知識メモ】SQL の読み方
SQL は「エスキューエル」と読みます。「シークェル」と読む人もいます。どちらも通じます。
1.5 Oracle Database と SQL Developer
この教材では、次の2つのソフトウェアを使います。
- Oracle Database 21c Express Edition(XE):DBMS 本体です。企業のシステムで広く使われている Oracle Database の、無償で使える版です。機能や容量に制限がありますが、学習には十分です。パソコンの裏側で常に動き続け、SQL の指示を待ちます
- Oracle SQL Developer:Oracle Database に接続して、SQL を入力して実行し、結果を表の形で確認するためのツールです。無償で使えます
Oracle Database には画面がありません。この教材では、SQL Developer の画面で SQL を書き、Oracle Database に送って実行します。この2つのインストール手順は、入門シリーズ共通の 「開発環境の準備」 にまとめています。第2章に進む前に、インストールを済ませておいてください。
【知識メモ】Spring入門では
Spring入門で作る社員管理アプリは、Java のプログラムの中から Oracle Database に SQL を送って、社員の一覧表示や登録を行います。SQL Developer で手で実行する SQL と、アプリが送る SQL は同じものです。この教材で SQL を身に付けておくと、アプリがデータベースに対して何をしているのかが読めるようになります。
公式ドキュメント
この教材の内容をさらに詳しく調べたいときは、次の公式ドキュメントを引きます。今は読まなくてかまいません。困ったときや、教材で扱わなかったことを調べるときに使ってください。
| 資料 | 内容 | 言語 |
|---|---|---|
| Oracle Database SQL言語リファレンス 21c | SQL 文・データ型・関数の正式な書き方 | 日本語 |
| Oracle Database エラー・メッセージ 21c |
ORA- で始まるエラーの原因と対処 |
日本語 |
どちらも、この教材で使う Oracle Database 21c の資料です。SQL の書き方を確かめたいときは SQL言語リファレンス、エラーの意味を調べたいときはエラー・メッセージを引きます。
1.6 この教材で作るテーブル
この教材では、部署テーブルと社員テーブルの2つを作ります。第3章でこの定義のとおりにテーブルを作り、第4章で部署4件・社員10人のサンプルデータを登録します。
部署テーブル(DEPARTMENT)
| 項目 | 列名 | データ型 | 説明 |
|---|---|---|---|
| 部署ID | DEPT_ID | NUMBER(4) | 主キー。1 から順に番号を振る |
| 部署名 | DEPT_NAME | VARCHAR2(20 CHAR) | 例:総務部。必ず入れる |
社員テーブル(EMPLOYEE)
| 項目 | 列名 | データ型 | 説明 |
|---|---|---|---|
| 社員ID | EMP_ID | NUMBER(6) | 主キー。1 から順に番号を振る |
| 氏名 | NAME | VARCHAR2(20 CHAR) | 例:雷禅 海皇。必ず入れる |
| 性別 | GENDER | NUMBER(1) | 1:男、2:女。それ以外は入れられない。必ず入れる |
| 年齢 | AGE | NUMBER(3) | 例:26。必ず入れる |
| 生年月日 | BIRTH_DATE | DATE | 例:2000-06-22。必ず入れる |
| 部署ID | DEPT_ID | NUMBER(4) | 部署テーブルの部署ID(外部キー)。必ず入れる |
| 住所 | ADDRESS | VARCHAR2(10 CHAR) | 都道府県。例:東京都。必ず入れる |
データ型(NUMBER・VARCHAR2・DATE)の意味は、第3章で学びます。今は、「列ごとに、入れられる値の種類と大きさが決まっている」ことだけ押さえておいてください。
【知識メモ】年齢と生年月日の両方がある理由
年齢は生年月日から計算できるので、本来はどちらか一方で足ります。この教材では、数の列を使った絞り込みや集計を練習するために、年齢の列も持たせています。Spring入門のアプリも、この2つの列を持つ同じテーブルを使います。
1.7 まとめと確認問題
まとめ
- データベース はデータの集まり。DBMS(Oracle Database など)がデータを管理し、速く取り出す・同時に使う・決まりを守らせる・元に戻す、といったことを引き受ける
- リレーショナルデータベースは、データを テーブル(表)の形で持つ。1件分が 行、項目が 列
- 主キー は1行を特定する列。同じ値は入れられず、空も許されない
- 外部キー は別のテーブルの主キーを参照する列。参照先に存在する値しか入れられない
- SQL は DBMS への指示を書く言葉。テーブルの形を決める DDL と、中のデータを扱う DML が中心
- DML の4つ、登録(INSERT)・取り出し(SELECT)・変更(UPDATE)・削除(DELETE)を CRUD という
- この教材では、部署テーブル(DEPARTMENT)と社員テーブル(EMPLOYEE)を作る
この章の用語は、付録C「用語集」 にまとめています。
確認問題
問1 社員テーブルの「雷禅 海皇、26歳、営業部」の1件分のデータは、「行」と「列」のどちらですか。
解答を見る
行 です。1件分のデータが行で、氏名・年齢・部署といった項目が列です。
問2 社員テーブルの主キーに氏名(NAME)を使えないのはなぜですか。
解答を見る
同じ氏名の社員が2人以上いる可能性があるためです。主キーは、同じ値を持つ行が2つ以上あってはならず、1行を確実に特定できなければなりません。
問3 社員テーブルの DEPT_ID の列は、主キーと外部キーのどちらですか。また、何を参照していますか。
解答を見る
外部キー です。部署テーブル(DEPARTMENT)の主キーである DEPT_ID を参照しています。
問4 データの登録・取り出し・変更・削除を行う SQL 文を、それぞれ答えてください。
解答を見る
登録は INSERT、取り出しは SELECT、変更は UPDATE、削除は DELETE です。この4つを CRUD と呼び、それぞれ C(Create)・R(Read)・U(Update)・D(Delete)にあたります。
問5 CREATE TABLE は DDL と DML のどちらですか。また、CRUD の C にあたる SQL 文は何ですか。
解答を見る
CREATE TABLE は、テーブルという入れ物の形を決める DDL です。CRUD の C(Create:データの登録)にあたるのは INSERT です。名前が似ていますが、CREATE TABLE は CRUD には入りません。
問6 Oracle Database と SQL Developer の役割の違いを説明してください。
解答を見る
Oracle Database はデータを管理する DBMS 本体で、画面を持たず裏側で動きます。SQL Developer は、Oracle Database に接続して SQL を入力・実行し、結果を表で確認するためのツールです。

