はじめに
前回は、MariaDB につなぐ仕組みを理解し、練習用のデータベース sql_practice と、そこだけを扱えるユーザー practice を作りました。中身はまだ空っぽです。
今回は、その練習場に最初の表を作ります。題材は、この先の血液検査アプリにつながるよう、架空の検査値の記録にしました(値はすべて練習用の架空のものです)。
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 では「名前 → 型 → 付け足し」の順に書きます。順番が逆になる点だけ注意すれば、読み方は同じです。
表を作る
① 練習用のユーザーで入る
$ mysql -u practice -p sql_practice行頭の $ は、一般ユーザーで実行するコマンドであることを示す記号(プロンプト)です。実際に入力するのは $ の後ろからです。パスワードを入れると、行頭が MariaDB [sql_practice]> に変わります。
② CREATE TABLE で表を作る
MariaDB の中で、次の命令をまとめて貼り付けて Enter を押します。
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つの命令です。途中の行では行頭が -> になりますが、前回紹介したとおり、これは「続きを待っている」印です。最後の ; で実行されます。
Query OK, 0 rows affectedと出れば、表ができています。0 rows affected は「影響した行は0行」という意味で、表を作っただけでデータはまだ入っていないので、0 で正しい結果です。
型と付け足しの意味
| 書き方 | 意味 | C でいうと |
|---|---|---|
INT UNSIGNED | 0 以上の整数 | 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 / DOUBLE | 2進数で近い値(5.5499999…) | 計測の生データ、誤差を許せる計算 |
DECIMAL(10,3) | 10進数のまま 5.550 | 検査値、金額など、表示どおりの値を保ちたいもの |
できた表を確かめる
表ができたら、その形を確かめます。
SHOW TABLES;
DESCRIBE measurements;
exit| 命令 | 意味 |
|---|---|
SHOW TABLES; | 表の一覧。前回は Empty set だったが、今度は measurements が出る |
DESCRIBE measurements; | 表の形(列の名前、型、空を許すか、キーか)を表示する。C でいえば、構造体の型定義を見返す操作 |
実際に表示された DESCRIBE の結果です。
+-------------+------------------+------+-----+---------+----------------+
| 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 は表示の桁数の目安で、入る値の範囲とは関係ない |
| Null | NO は値が必須、YES は空でもよい |
| Key | PRI は PRIMARY KEY(行を見分ける番号) |
| Default | 値を指定しなかったときの初期値。今回はどれも指定していないので NULL |
| Extra | auto_increment は、番号が自動で増える列 |
書いたとおりの6列が、書いたとおりの型で並んでいれば成功です。
まとめと次回予告
| この回で覚えたこと | C でいうと |
|---|---|
CREATE TABLE で表を作る | 構造体の型を定義する |
| 列は「名前 → 型 → 付け足し」の順に書く | 「型 → 名前」の順が逆になっただけ |
INT、VARCHAR、DATE、DECIMAL | uint32_t、char[]、日付の構造体、固定小数点 |
NOT NULL と NULL | 必須のメンバと、NULL を許すポインタ |
AUTO_INCREMENT と PRIMARY KEY | 自動で増える通し番号と、配列の添字 |
DESCRIBE で表の形を見る | 型定義を見返す |
表は作れましたが、中はまだ空っぽです。次回は、この表に架空の検査値を入れていきます。数値にできない「(-)」の入れ方も試します。
この記事は、シリーズ「組み込みエンジニアの Web 開発入門」の1本です。ほかの回は、シリーズの目次からどうぞ。



コメント