はじめに
これまで、ブログの管理でデータベースに命令を送る場面が何度かありました。記事の状態を数えたり、タイトルをまとめて書き換えたり。ただ、正直に言うと、そのたびに AI に教わったコマンドをコピーして実行していただけで、何をしているのかはほとんど理解していませんでした。
この先の実践編では、血液検査の記録をデータベースに保存していきます(全体の流れは入門編 第1回のロードマップを参照)。その前に、データベースの基本をきちんと自分のものにしておきたいと考え、「データベース編」として、小さな回に分けて学ぶことにしました。
| 回 | テーマ | 主な SQL |
|---|---|---|
| 1 | つなぐ仕組みと、練習用のデータベースを作る(この記事) | CREATE DATABASE、CREATE USER、GRANT |
| 2 | 表を作る | CREATE TABLE、データの型 |
| 3 | データを入れる | INSERT |
| 4 | 見る・絞り込む・並べる | SELECT、WHERE、LIKE、ORDER BY |
| 5 | 数える・まとめる | COUNT、GROUP BY |
| 6 | 書き換える・消す | UPDATE、DELETE |
| 7 | 退避と復元 | mysqldump |
練習は、ブログの WordPress が使っているデータベースとは別に、練習専用のデータベースを作って行います。どんなに打ち間違えても、ブログには影響しません。組み込みでいえば、量産品の EEPROM ではなく、評価ボードの上で読み書きを試すのと同じです。
環境について:使っているのは、自宅の Linux サーバー(仮想マシン)で動いている MariaDB 10.11 です。MariaDB は MySQL から分かれたデータベースで、コマンドの多くは MySQL と共通です。
データベースを組み込みの言葉で言うと
最初に、言葉をそろえておきます。

| データベースの言葉 | 意味 | 組み込みでいうと |
|---|---|---|
| データベース | データの入れ物全体(今回は sql_practice) | 不揮発メモリの1つの領域 |
| 表(テーブル) | 同じ形のデータを並べたもの | 構造体の配列 |
| 行(レコード) | 表の1件 | 配列の1要素 |
| 列(カラム) | 1件の中の項目 | 構造体のメンバ |
| SQL | データベースへの命令の書き方 | コマンドフレームの書式 |
| MariaDB | データベースを管理する常駐プログラム | 不揮発メモリを管理するファームウェア |
ただの不揮発メモリと違うのは、「この日付のデータだけ」「この項目の件数」のように、条件を付けて探したり、数えたり、並べ替えたりする機能を、データベース側が持っていることです。C なら自分で for ループを書いて探すところを、SQL の1行で頼めます。
つなぐ仕組みと、mysql コマンドの読み方
データベースに命令を送るときは、mysql というコマンドを使います。ただし、mysql はデータベースそのものではありません。

| 登場するもの | 役割 | 組み込みでいうと |
|---|---|---|
mysql コマンド | 命令を送って、返ってきた結果を表示する窓口のプログラム | ホスト側のターミナルソフト |
| MariaDB | データベースを管理する常駐プログラム。サーバーの中からの接続だけを受け付ける | ターゲット側の管理ファームウェア |
| データベース | MariaDB の中にある入れ物。いくつも持てる | 不揮発メモリの領域 |
いつものコマンドを分解する
これまでブログの管理で何度も実行していたのは、次のような形のコマンドでした。
$ mysql -u wordpress -p wordpress -e "SELECT post_status, COUNT(*) FROM wp_posts GROUP BY post_status;"行頭の $ は、一般ユーザーで実行するコマンドであることを示す記号(プロンプト)です。実際に入力するのは $ の後ろからです。
| 部分 | 意味 |
|---|---|
mysql | 窓口のプログラムを起動する |
-u wordpress | ユーザー名 wordpress でつなぐ(u は user) |
-p | パスワードを聞いてもらう(p は password)。後ろに何も書かないので、入力を求められる |
wordpress(2つ目) | 使うデータベースの名前。この例ではユーザー名と同じ名前なので紛らわしい |
-e "…" | "…" の中の SQL を1回だけ実行して、すぐに終わる(e は execute) |
2つ目の wordpress がデータベースの名前だとわかれば、このコマンドは読めるようになります。
-e のあり・なしで、動きが変わる
mysql コマンドには、2つの使い方があります。
| 書き方 | 動き | 行頭の表示 |
|---|---|---|
-e "…" あり | 命令を1回実行して、自動で終了する | 終わると bash の [devuser@myserver ~]$ に戻る |
-e なし | MariaDB の中に入ったままになり、次の命令を待ち続ける | MariaDB [データベース名]> |
組み込みでいえば、-e ありは「コマンドを1発送って切断」、-e なしは「対話モードのモニタに入りっぱなし」です。
-e なしで中に入ると、SQL を1つずつ打って、その場で結果を見られます。いろいろ試すときに便利なので、このシリーズの練習はこちらで行います。抜けるときは exit と打ちます。
抜けられなくなった話
この違いを知らなかったころ、MariaDB の中に入ったままだと気づかずに、bash のコマンドを打ち込んでしまったことがあります。
MariaDB [wordpress]> for s in deploy-react-node-almalinux-1 deploy-react-node-almalinux-2; do
ERROR 1327 (42000): Undeclared variable: deploy
-> printf "%-32s " "$s"
-> curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" "https://…/$s/"
-> done
->bash のコマンドが SQL として解釈されてエラーになり、その後は行頭が -> のまま、何を打っても抜けられなくなりました。Ctrl + C も exit も、「SQL の続き」として受け取られてしまったのです。
原因は、SQL の命令が ;(セミコロン)で終わる決まりになっていることでした。MariaDB は、; が来るまで「命令の途中だ」と考えて、続きを待ち続けます。-> は、その「続きを待っている」印です。
この状態からの抜け方は、次の3つです。上から順に試します。
| 順 | 打つもの | 何が起きるか |
|---|---|---|
| 1 | ; だけを打って Enter | 命令がいったん終わる(中身がでたらめなのでエラーにはなるが、何も変わらない)。行頭が MariaDB [wordpress]> に戻ったら、exit で抜ける |
| 2 | \q を打って Enter | MariaDB の「すぐに終了する」という命令。入力の途中でも効く |
| 3 | ターミナルを閉じて、開き直す | 確実に抜けられる。何も書き込んでいなければ、閉じても問題ない |
| 行頭の表示 | 今いる場所 | 打てるもの |
|---|---|---|
[devuser@myserver ~]$ | bash | Linux のコマンド(mysql、curl、git など) |
MariaDB [wordpress]> | MariaDB の中 | SQL の命令(; で終わる)と exit |
-> | MariaDB の中で、命令の続きを待っている | SQL の続き。終わらせるなら ; |
行頭の表示を見て、今どこにいるかを確かめる。これが、データベースを触るときの最初の習慣です。
練習用のデータベースとユーザーを作る
いよいよ手を動かします。最初に、練習専用のデータベースと、そこだけを扱えるユーザーを作ります。
① 管理者として MariaDB に入る
データベースやユーザーを作るのは、管理者(root)の仕事です。私のサーバーでは、Linux の管理者権限(sudo)があれば、パスワードなしで MariaDB の管理者として入れる設定にしています。
$ sudo mysql行頭が MariaDB [(none)]> に変わります。(none) は、まだどのデータベースも選んでいない、という意味です。
② データベースとユーザーを作り、権限を与える
次の命令を、1行ずつ入力します。<パスワード> の部分は、自分で決めたパスワードに置き換えます。
CREATE DATABASE sql_practice CHARACTER SET utf8mb4;
CREATE USER 'practice'@'localhost' IDENTIFIED BY '<パスワード>';
GRANT ALL PRIVILEGES ON sql_practice.* TO 'practice'@'localhost';
exitこのブロックの命令は、すべて MariaDB の中(行頭が MariaDB [(none)]>)で打ちます。それぞれ Query OK と表示されれば成功です。
| 命令 | 意味 | 組み込みでいうと |
|---|---|---|
CREATE DATABASE sql_practice … | 練習用のデータベース sql_practice を作る。utf8mb4 は、日本語や記号も入る文字コード | 不揮発メモリに新しい領域を確保する |
CREATE USER 'practice'@'localhost' … | ユーザー practice を作る。@'localhost' は「このサーバーの中からだけ接続できる」という意味 | アクセス用の ID を発行する |
GRANT ALL PRIVILEGES ON sql_practice.* … | practice に、sql_practice の中だけを自由に扱う権限を与える | その領域にだけ書き込み許可を出す |
exit | MariaDB から抜ける |
practice ユーザーは、sql_practice の中のことしかできません。万一コマンドを間違えても、ブログのデータベースには届かないので安全です。
③ 練習用のユーザーで入り直す
$ mysql -u practice -p sql_practice② で決めたパスワードを入力すると、行頭が MariaDB [sql_practice]> になります。中に入ったら、次の2つを試します。
SELECT DATABASE();
SHOW TABLES;
exit| 命令 | 意味 | 結果 |
|---|---|---|
SELECT DATABASE(); | 今使っているデータベースの名前を表示する | sql_practice |
SHOW TABLES; | このデータベースにある表の一覧を表示する | Empty set(まだ表が1つもない) |
Empty set は「空っぽ」という意味です。何もない練習場が、これで用意できました。
付録:練習用のデータを、いつでも最初の状態に戻す
このシリーズでは、回を追うごとに、練習用のデータを書き換えたり消したりしていきます。後から別の回をやり直したくなったとき、データが変わったままだと、記事と同じ結果になりません。
そこで、表を作り直して、最初のダミーデータを入れ直すファイルを1つ用意しておきます。何度でも、どの回からでも、同じ状態から始められます。組み込みでいえば、評価ボードを工場出荷状態に戻すための書き込みスクリプトです。
① 戻すためのファイルを作る(最初に1回だけ)
次のブロックを、まとめて貼り付けて実行します(パスワードを聞かれないコマンドなので、まとめて貼っても大丈夫です)。
$ cat > ~/work/sql_practice_reset.sql <<'EOF'
DROP TABLE IF EXISTS measurements;
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
);
INSERT INTO measurements (measured_on, item_name, value_text, value_num, unit) VALUES
('2026-09-01', '血糖', '98', 98, 'mg/dL'),
('2026-09-01', 'CRP', '0.05', 0.05, 'mg/dL'),
('2026-09-01', '尿蛋白', '(-)', NULL, NULL),
('2026-10-01', '血糖', '104', 104, 'mg/dL'),
('2026-10-01', 'CRP', '0.03未満', 0.03, 'mg/dL'),
('2026-10-01', '尿蛋白', '(+-)', NULL, NULL);
EOF| 部分 | 意味 |
|---|---|
cat > ファイル <<'EOF' | 次の行から EOF だけの行までを、そのままファイルに書き込む(bash のヒアドキュメント) |
DROP TABLE IF EXISTS measurements; | 表があれば消す。なければ何もしない |
CREATE TABLE … | 表を作り直す(第2回の内容) |
INSERT INTO … | 最初のダミーデータ6行を入れる(第3回の内容) |
値はすべて練習用の架空のものです。
② 最初の状態に戻す(やり直したいときに、何度でも)
$ mysql -u practice -p sql_practice < ~/work/sql_practice_reset.sql< は、ファイルの中身を、コマンドへの入力として流し込む指定です。パスワードを入力して、何も表示されずに行頭に戻れば完了です。
$ mysql -u practice -p sql_practice -e "SELECT * FROM measurements;"id が 1〜6 の6行が表示されれば、最初の状態に戻っています。表を作り直すので、id の番号も 1 から振り直されます。
注意:このファイルを流し込むと、
measurements表の中身は、それまでの内容がすべて消えて最初の6行に戻ります。練習用のデータベース(sql_practice)専用のファイルなので、ブログなど別のデータベースには使わないでください。
まとめと次回予告
| この回で覚えたこと | 組み込みでいうと |
|---|---|
| データベース・表・行・列 | 不揮発メモリの領域・構造体の配列・配列の要素・メンバ |
mysql は窓口、MariaDB が本体 | ホストのターミナルソフトと、ターゲットの管理ファームウェア |
-e ありは1発実行、なしは対話モード | コマンドを1発送って切断/モニタに入りっぱなし |
SQL の命令は ; で終わる | コマンドフレームの終端文字 |
| 練習用のデータベースと、そこだけを扱えるユーザー | 評価ボードと、その領域だけの書き込み許可 |
次回は、この空っぽの練習場に、最初の表を作ります。C の構造体の型定義と並べながら、データの型(整数、文字列、日付、小数)を選んでいきます。
この記事は、シリーズ「組み込みエンジニアの Web 開発入門」の1本です。ほかの回は、シリーズの目次からどうぞ。



コメント