[PR] 本記事にはプロモーションが含まれています。

【データベース編 第2回】表を作る ― CREATE TABLE とデータの型を、C の構造体と並べて

MySQL

はじめに

前回は、MariaDB につなぐ仕組みを理解し、練習用のデータベース sql_practice と、そこだけを扱えるユーザー practice を作りました。中身はまだ空っぽです。

今回は、その練習場に最初の表を作ります。題材は、この先の血液検査アプリにつながるよう、架空の検査値の記録にしました(値はすべて練習用の架空のものです)。

C で構造体の型を定義するのと、ほとんど同じ考え方で作れます。

表は「構造体の型定義」

今回作る表を、先に C の構造体で書くと、次のようになります。

C
struct measurement {
    uint32_t id;              /* 通し番号(自動で振る) */
    date_t   measured_on;     /* 測定日 */
    char     item_name[50];   /* 項目名 */
    char     value_text[20];  /* 結果(用紙の文字のまま。"(-)" や "40未満" も入る) */
    fixed_t  value_num;       /* 結果の数値(数値にできないときは空) */
    char     unit[20];        /* 単位 */
};

結果を value_text(用紙の文字のまま)と value_num(グラフ用の数値)の2つで持っているのは、血液検査の結果には「(-)」や「40未満」のように、数値だけでは表せないものがあるためです。

これを SQL の表にすると、1行ずつ対応します。

C の構造体の各メンバが、SQL の CREATE TABLE の各列に1行ずつ対応していることを、矢印で結んで示した図

C では「型 → 名前」の順に書きますが、SQL では「名前 → 型 → 付け足し」の順に書きます。順番が逆になる点だけ注意すれば、読み方は同じです。

表を作る

① 練習用のユーザーで入る

Bash
$ mysql -u practice -p sql_practice

行頭の $ は、一般ユーザーで実行するコマンドであることを示す記号(プロンプト)です。実際に入力するのは $ の後ろからです。パスワードを入れると、行頭が MariaDB [sql_practice]> に変わります。

② CREATE TABLE で表を作る

MariaDB の中で、次の命令をまとめて貼り付けて Enter を押します。

SQL
CREATE TABLE measurements (
  id          INT UNSIGNED  NOT NULL AUTO_INCREMENT PRIMARY KEY,
  measured_on DATE          NOT NULL,
  item_name   VARCHAR(50)   NOT NULL,
  value_text  VARCHAR(20)   NOT NULL,
  value_num   DECIMAL(10,3) NULL,
  unit        VARCHAR(20)   NULL
);

複数行に分けて書いても、最後の ; までが1つの命令です。途中の行では行頭が -> になりますが、前回紹介したとおり、これは「続きを待っている」印です。最後の ; で実行されます。

Plaintext
Query OK, 0 rows affected

と出れば、表ができています。0 rows affected は「影響した行は0行」という意味で、表を作っただけでデータはまだ入っていないので、0 で正しい結果です。

型と付け足しの意味

書き方意味C でいうと
INT UNSIGNED0 以上の整数uint32_t
DATE日付(2026-10-13 のような形)日付用の構造体
VARCHAR(50)最大50文字の文字列。実際の長さの分だけ場所を使うchar[50](ただし必要な分だけ使う)
DECIMAL(10,3)全部で10桁、小数点以下3桁の数値。誤差なく小数を持てる固定小数点
NOT NULL必ず値を入れる初期化を必須にする
NULL空でもよいNULL を許すポインタ
AUTO_INCREMENT新しい行を入れるたびに、番号を自動で1つ増やす自動で増える通し番号のカウンタ
PRIMARY KEY行を見分けるための番号。重複は許されない配列の添字(ただし欠番があってもよい)

value_num と unit だけ NULL(空でもよい)にしているのは、「(-)」のように数値にできない結果には、数値も単位もないからです。

小数に DECIMAL を使う理由

検査値の「5.55」を、C の float のような浮動小数点で持つと、内部では 5.5499999… のような近い値になってしまいます。表示のときに丸めれば見た目は同じですが、比べたり足し合わせたりすると、わずかな誤差が出ることがあります。

DECIMAL は、10進数のまま、決めた桁数で正確に持つ型です。組み込みで、校正値や金額を固定小数点で持って、丸め誤差を避けるのと同じ理由です。

型5.55 の持ち方向いている用途
FLOAT / DOUBLE2進数で近い値(5.5499999…)計測の生データ、誤差を許せる計算
DECIMAL(10,3)10進数のまま 5.550検査値、金額など、表示どおりの値を保ちたいもの

できた表を確かめる

表ができたら、その形を確かめます。

SQL
SHOW TABLES;
DESCRIBE measurements;
exit
命令意味
SHOW TABLES;表の一覧。前回は Empty set だったが、今度は measurements が出る
DESCRIBE measurements;表の形(列の名前、型、空を許すか、キーか)を表示する。C でいえば、構造体の型定義を見返す操作

実際に表示された DESCRIBE の結果です。

Plaintext
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| measured_on | date             | NO   |     | NULL    |                |
| item_name   | varchar(50)      | NO   |     | NULL    |                |
| value_text  | varchar(20)      | NO   |     | NULL    |                |
| value_num   | decimal(10,3)    | YES  |     | NULL    |                |
| unit        | varchar(20)      | YES  |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+
6 rows in set (0.001 sec)
列読み方
Field列の名前
Type型。int(10) の 10 は表示の桁数の目安で、入る値の範囲とは関係ない
NullNO は値が必須、YES は空でもよい
KeyPRI は PRIMARY KEY(行を見分ける番号)
Default値を指定しなかったときの初期値。今回はどれも指定していないので NULL
Extraauto_increment は、番号が自動で増える列

書いたとおりの6列が、書いたとおりの型で並んでいれば成功です。

まとめと次回予告

この回で覚えたことC でいうと
CREATE TABLE で表を作る構造体の型を定義する
列は「名前 → 型 → 付け足し」の順に書く「型 → 名前」の順が逆になっただけ
INT、VARCHAR、DATE、DECIMALuint32_t、char[]、日付の構造体、固定小数点
NOT NULL と NULL必須のメンバと、NULL を許すポインタ
AUTO_INCREMENT と PRIMARY KEY自動で増える通し番号と、配列の添字
DESCRIBE で表の形を見る型定義を見返す

表は作れましたが、中はまだ空っぽです。次回は、この表に架空の検査値を入れていきます。数値にできない「(-)」の入れ方も試します。

この記事は、シリーズ「組み込みエンジニアの Web 開発入門」の1本です。ほかの回は、シリーズの目次からどうぞ。

ほかの開発・プログラミングの記事は、開発・プログラミングメモの目次から、テーマ別に探せます。

このブログは、にほんブログ村と人気ブログランキングに参加しています。記事が役に立ったら、下のランキングのバナーのどれかを押して応援してもらえると励みになります。

ブログランキング・にほんブログ村へにほんブログ村

サーバー構築・運用ランキング プログラムランキング

MySQL
watasoftdevをフォローする

コメント