C言語DB入門|データベースの基本を知ろう

C言語DB入門|データベースの基本を知ろう

第2章では、Windowsに開発環境を整え、C言語のプログラムを作成して実行しました。

ここからは、書籍管理アプリで使うデータベースについて学んでいきます。

データベースを操作するには、まず、データをどのように整理して保存するのかを理解することが大切です。この記事では、書籍の情報を例に、次の言葉を説明します。

  • データベース
  • テーブル
  • 行
  • 列
  • 主キー
  • ID

最初は、書籍の一覧表を作り、それぞれの書籍情報に識別用の番号を付けるイメージで読み進めてみてください。

データベースは、データを整理して管理する仕組み

データベースとは、必要なときに検索したり更新したりできるように、データを整理して蓄積したものです。

たとえば、書籍管理アプリでは、次のような情報を扱います。

  • 書籍のタイトル
  • 著者名
  • それぞれの書籍情報を区別するためのID

数件であれば、紙に書いた一覧でも確認できます。しかし、件数が増えると、目的の書籍を探したり、特定の情報だけを修正したりするのが大変になります。

データベースを使うと、条件に合うデータの検索や、指定したデータの変更・削除などを行えます。

やりたいこと書籍管理での例
データを登録する新しく購入した書籍の情報を追加する
データを検索する特定の著者が書いた書籍を探す
データを変更する入力を間違えたタイトルを修正する
データを削除する管理対象から外した書籍の情報を取り除く

SQLiteとデータベースの関係

本教材では、データベースを管理するソフトウェアとしてSQLiteを使用します。

SQLiteと、SQLiteが扱うデータベースは、役割を分けて考えると理解しやすくなります。

名前役割
SQLiteデータの保存や検索などを行うソフトウェア
データベース整理されたデータや、テーブルの定義などをまとめたもの
books.db本教材で使用するデータベースファイルの名前

SQLiteでは、テーブルやその中のデータなどを、基本的に1つのデータベースファイルに保存できます。

本教材では、そのファイルをbooks.dbという名前で作成します。

この記事に登場する表は、仕組みを理解するための例です。実際のデータベースファイルの作成は、次の記事で行います。

テーブルは、データを表の形で整理する場所

データベースの中で、データを行と列のある表として管理する単位をテーブルといいます。

書籍を管理するなら、書籍の情報を保存するテーブルを用意します。本教材では、その名前をbooksにします。

books.dbとbooksは名前が似ていますが、指しているものが違います。

名前表しているもの
books.dbデータベースファイル
booksデータベースの中に作成する書籍テーブル

1つのデータベースには、複数のテーブルを作成できます。

たとえば、図書館のシステムなら、書籍、利用者、貸し出し記録を、それぞれ別のテーブルで管理する設計が考えられます。

本教材では、まずbooksテーブルを中心に学習します。

図1:データベースの中にテーブルがある

この図から分かること

データベースは、テーブルなどをまとめて管理する入れ物として考えられます。

books.dbというデータベースファイルの中に、booksという書籍テーブルを作成し、そのテーブルに書籍の情報を保存していきます。

書籍テーブルを見てみよう

次の表を、booksテーブルの例として使います。書籍名と著者名は、説明用の架空のデータです。

idtitleauthor
1はじめてのC言語佐藤花子
2SQLite入門田中太郎
3GTK 4入門鈴木一郎
4はじめてのC言語山田次郎

各項目の意味は、次のとおりです。

項目名日本語での意味保存する値の例
idID1、2、3などの整数
titleタイトルはじめてのC言語
author著者名佐藤花子

本教材では、SQLやC言語のプログラムから扱いやすいように、テーブル名や項目名に英字を使います。

ここから、この表を行と列に分けて見ていきましょう。

行は、1件分のデータ

テーブルの横方向のまとまりを行といいます。行は、レコードと呼ばれることもあります。

今回のbooksテーブルでは、1行が1件分の書籍情報です。

たとえば、次の横一列で1行になります。

idtitleauthor
2SQLite入門田中太郎

この行には、次の情報がまとまっています。

  • IDは2
  • タイトルはSQLite入門
  • 著者名は田中太郎

タイトルだけ、著者名だけではなく、それらを組み合わせたものが1件のデータです。

データを登録すると行が増える

先ほどのbooksテーブルには、4件の書籍情報があるため、データの行数は4行です。

新しい書籍情報を1件登録すると、データの行数は5行になります。

なお、表の見出しにあるid、title、authorは項目名です。見出しの部分を、データの1行として数えることはありません。

列は、データの項目

テーブルの縦方向のまとまりを列といいます。列は、カラムと呼ばれることもあります。

今回のbooksテーブルには、次の3つの列があります。

  • id
  • title
  • author

title列には各書籍のタイトル、author列には各書籍の著者名が入ります。

列名と値を区別する

たとえば、titleは列の名前です。一方、はじめてのC言語は、その列に保存されている値です。

区別例
列名title
列に保存される値はじめてのC言語
列名author
列に保存される値佐藤花子

列名は、どの種類の情報を扱うかを示します。値は、個々の行に入っている具体的な情報です。

この違いをつかんでおくと、後でSQLを読むときに分かりやすくなります。

行が増えても、列が増えるわけではない

書籍情報を4件から10件に増やした場合、データの行数は10行になります。

ただし、保存する項目がid、title、authorのままであれば、列数は3列のままです。

一方、発売日という新しい項目を追加したい場合は、テーブルの構造を変更して列を追加することになります。

変更したいこと変わるもの
新しい書籍情報を登録する行数が増える
書籍情報を削除する行数が減る
発売日という管理項目を追加する列数が増える

図2:行は1件分のデータ、列は情報の項目

イラスト作成用プロンプト

この図から分かること

行を見ると、1件の書籍情報を確認できます。列を見ると、タイトルや著者名など、同じ項目の値を確認できます。

今回の例は、4件のデータを、3つの項目で管理している表です。

タイトルだけで書籍を区別できるだろうか

ここで、booksテーブルにある次の2行を見てみましょう。

idtitleauthor
1はじめてのC言語佐藤花子
4はじめてのC言語山田次郎

どちらもタイトルは、はじめてのC言語です。

この状態で、はじめてのC言語を変更する、と指定しただけでは、どちらの行を変更したいのか決まりません。

著者名も条件に加えれば、この例では区別できます。しかし、同じタイトルと著者名を持つ情報を複数登録する場合も考えられます。

また、タイトルや著者名は、入力間違いの修正によって変わる可能性があります。

そこで、各行を確実に区別するための目印を用意します。それが、今回のidです。

IDは、データを識別するための値

IDは、対象を識別するために使う値です。

本教材のbooksテーブルでは、各行に整数のIDを付けます。

ID識別する書籍情報
1佐藤花子による、はじめてのC言語
2田中太郎による、SQLite入門
3鈴木一郎による、GTK 4入門
4山田次郎による、はじめてのC言語

IDを使えば、同じタイトルの書籍情報があっても、IDが1の行、IDが4の行という指定で区別できます。

ただし、列の名前をidにしただけでは、値の重複を防ぐ仕組みは付きません。

重複しない識別用の値として使うために、データベース側にもルールを設定します。

主キーは、各行を識別するためのルール

テーブルの各行を一意に識別するために選ぶ列、または列の組み合わせを主キーといいます。

一意に識別するとは、どの1行なのかを、ほかの行と区別して特定できるという意味です。

本教材では、id列を主キーとして設定します。

本教材のidに持たせる性質

booksテーブルのidは、整数の主キーとして、次の性質を持つようにします。

  • 保存された各行にIDの値がある
  • 同じテーブル内でIDの値が重複しない
  • IDを指定すれば、対応する行を特定できる

たとえば、IDが2の行がすでに存在する場合、別の行にも同じIDの2を保存することはできません。

SQLiteでは、主キーの重複を生じさせる登録や変更は、制約違反になります。SQLite公式:主キー

IDと主キーは、同じ意味ではない

IDと主キーは一緒に使われることが多いものの、意味は異なります。

用語意味
IDデータを識別するために使う値
主キー各行を一意に識別するために選び、テーブルに設定するもの

今回の設計では、id列に識別用の整数を保存し、その列を主キーにします。

主キーの列名を必ずidにする必要はありません。また、主キーには複数の列を組み合わせる設計もあります。

まずは、本教材ではid列を主キーにして、1行ずつ区別すると理解しておきましょう。

IDは、画面の行番号ではない

IDについて、もう1つ大切なことがあります。

IDはデータの識別用の値であり、一覧の上から何番目かを表す番号ではありません。

たとえば、IDが2の行を削除すると、残るデータは次のようになります。

idtitleauthor
1はじめてのC言語佐藤花子
3GTK 4入門鈴木一郎
4はじめてのC言語山田次郎

この表では、上から2番目に表示されている行のIDは3です。

削除した行の番号を埋めるために、IDを付け直す必要はありません。IDが変わらなければ、その行を引き続き同じ値で指定できます。

同じ理由で、タイトル順などに表示を並べ替えても、各行のIDは変えません。

IDの最大値と件数も別のもの

上の表には3件のデータがありますが、最大のIDは4です。

このように、IDには途中の番号が抜けることがあるため、最大のIDをそのままデータの件数として扱うことはできません。

また、IDの重複を防ぐ範囲は、ここではbooksテーブル内です。別のテーブルにIDが1の行があっても、それだけで問題になるわけではありません。

図3:同じタイトルでもIDで区別できる

この図から分かること

同じタイトルの書籍情報があっても、IDが異なれば、それぞれの行を区別できます。

書籍管理アプリで変更や削除を行うときも、対象のIDを使うことで、どの行を操作するのかを明確にできます。

書籍管理アプリでは、この構造をどう使うのか

本教材で作るアプリでは、タイトルと著者名を入力して、書籍情報を登録します。

登録した情報はbooksテーブルの行になり、一覧画面に表示されます。変更や削除では、選択した行のIDを使って対象を指定します。

アプリでの操作データベースで行うこと
書籍を登録するbooksテーブルに新しい行を追加する
書籍を一覧表示するbooksテーブルから行を取得する
タイトルを修正する対象のIDを持つ行のtitleの値を変更する
著者名を修正する対象のIDを持つ行のauthorの値を変更する
書籍を削除する対象のIDを持つ行を削除する

タイトルや著者名の修正では、対象の行を残したまま、必要な列の値を変更します。

一方、書籍情報の削除では、その1件を表す行を取り除きます。

このように、行が操作の対象となり、列が情報の項目となり、IDが対象を見分ける目印になります。

データベースへの操作はSQLで伝える

テーブルの作成やデータの登録・検索などを、データベースへ伝えるために使う言語がSQLです。

この後の記事では、次のSQLを順番に学習します。

SQL主な役割
CREATE TABLEテーブルを作成する
INSERT新しい行を登録する
SELECT条件に合うデータを取得する
UPDATE保存されている値を変更する
DELETE行を削除する

まずはSQLiteのコマンドラインでSQLを実行し、表の中身がどう変わるかを確かめます。その後、C言語のプログラムから同じデータベースを操作していきます。

次の記事では、SQLiteを起動し、学習用のデータベースファイルbooks.dbを作成しましょう。

Follow me!