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

【データベース編 第1回】データベースにつなぐ仕組みと、練習用のデータベースを作る

MySQL

はじめに

これまで、ブログの管理でデータベースに命令を送る場面が何度かありました。記事の状態を数えたり、タイトルをまとめて書き換えたり。ただ、正直に言うと、そのたびに 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 と共通です。

データベースを組み込みの言葉で言うと

最初に、言葉をそろえておきます。

データベースの中の表が、C の構造体の配列にあたり、列が構造体のメンバ、行が配列の1要素にあたることを示した図
データベースの言葉意味組み込みでいうと
データベースデータの入れ物全体(今回は sql_practice)不揮発メモリの1つの領域
表(テーブル)同じ形のデータを並べたもの構造体の配列
行(レコード)表の1件配列の1要素
列(カラム)1件の中の項目構造体のメンバ
SQLデータベースへの命令の書き方コマンドフレームの書式
MariaDBデータベースを管理する常駐プログラム不揮発メモリを管理するファームウェア

ただの不揮発メモリと違うのは、「この日付のデータだけ」「この項目の件数」のように、条件を付けて探したり、数えたり、並べ替えたりする機能を、データベース側が持っていることです。C なら自分で for ループを書いて探すところを、SQL の1行で頼めます。

つなぐ仕組みと、mysql コマンドの読み方

データベースに命令を送るときは、mysql というコマンドを使います。ただし、mysql はデータベースそのものではありません。

ターミナルで起動した mysql コマンドが、SQL の命令を MariaDB に送り、MariaDB が管理するデータベースから結果の表を返してもらう流れを示した図
登場するもの役割組み込みでいうと
mysql コマンド命令を送って、返ってきた結果を表示する窓口のプログラムホスト側のターミナルソフト
MariaDBデータベースを管理する常駐プログラム。サーバーの中からの接続だけを受け付けるターゲット側の管理ファームウェア
データベースMariaDB の中にある入れ物。いくつも持てる不揮発メモリの領域

いつものコマンドを分解する

これまでブログの管理で何度も実行していたのは、次のような形のコマンドでした。

Bash
$ 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 のコマンドを打ち込んでしまったことがあります。

Plaintext
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 を打って EnterMariaDB の「すぐに終了する」という命令。入力の途中でも効く
3ターミナルを閉じて、開き直す確実に抜けられる。何も書き込んでいなければ、閉じても問題ない
行頭の表示今いる場所打てるもの
[devuser@myserver ~]$bashLinux のコマンド(mysql、curl、git など)
MariaDB [wordpress]>MariaDB の中SQL の命令(; で終わる)と exit
->MariaDB の中で、命令の続きを待っているSQL の続き。終わらせるなら ;

行頭の表示を見て、今どこにいるかを確かめる。これが、データベースを触るときの最初の習慣です。

練習用のデータベースとユーザーを作る

いよいよ手を動かします。最初に、練習専用のデータベースと、そこだけを扱えるユーザーを作ります。

① 管理者として MariaDB に入る

データベースやユーザーを作るのは、管理者(root)の仕事です。私のサーバーでは、Linux の管理者権限(sudo)があれば、パスワードなしで MariaDB の管理者として入れる設定にしています。

Bash
$ sudo mysql

行頭が MariaDB [(none)]> に変わります。(none) は、まだどのデータベースも選んでいない、という意味です。

② データベースとユーザーを作り、権限を与える

次の命令を、1行ずつ入力します。<パスワード> の部分は、自分で決めたパスワードに置き換えます。

SQL
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 の中だけを自由に扱う権限を与えるその領域にだけ書き込み許可を出す
exitMariaDB から抜ける

practice ユーザーは、sql_practice の中のことしかできません。万一コマンドを間違えても、ブログのデータベースには届かないので安全です。

③ 練習用のユーザーで入り直す

Bash
$ mysql -u practice -p sql_practice

② で決めたパスワードを入力すると、行頭が MariaDB [sql_practice]> になります。中に入ったら、次の2つを試します。

SQL
SELECT DATABASE();
SHOW TABLES;
exit
命令意味結果
SELECT DATABASE();今使っているデータベースの名前を表示するsql_practice
SHOW TABLES;このデータベースにある表の一覧を表示するEmpty set(まだ表が1つもない)

Empty set は「空っぽ」という意味です。何もない練習場が、これで用意できました。

付録:練習用のデータを、いつでも最初の状態に戻す

このシリーズでは、回を追うごとに、練習用のデータを書き換えたり消したりしていきます。後から別の回をやり直したくなったとき、データが変わったままだと、記事と同じ結果になりません。

そこで、表を作り直して、最初のダミーデータを入れ直すファイルを1つ用意しておきます。何度でも、どの回からでも、同じ状態から始められます。組み込みでいえば、評価ボードを工場出荷状態に戻すための書き込みスクリプトです。

① 戻すためのファイルを作る(最初に1回だけ)

次のブロックを、まとめて貼り付けて実行します(パスワードを聞かれないコマンドなので、まとめて貼っても大丈夫です)。

Bash
$ 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回の内容)

値はすべて練習用の架空のものです。

② 最初の状態に戻す(やり直したいときに、何度でも)

Bash
$ mysql -u practice -p sql_practice < ~/work/sql_practice_reset.sql

< は、ファイルの中身を、コマンドへの入力として流し込む指定です。パスワードを入力して、何も表示されずに行頭に戻れば完了です。

Bash
$ 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本です。ほかの回は、シリーズの目次からどうぞ。

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

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

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

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

MySQL
watasoftdevをフォローする

コメント