わからないなりに理解したいデータベース③:RDB編:MariaDB

◆ Live配信スケジュール ◆
サイオステクノロジーでは、Microsoft MVPの武井による「わかりみの深いシリーズ」など、定期的なLive配信を行っています。
⇒ 詳細スケジュールはこちらから
⇒ 見逃してしまった方はYoutubeチャンネルをご覧ください
【4/18開催】VSCode Dev Containersで楽々開発環境構築祭り〜Python/Reactなどなど〜
Visual Studio Codeの拡張機能であるDev Containersを使ってReactとかPythonとかSpring Bootとかの開発環境をラクチンで構築する方法を紹介するイベントです。
https://tech-lab.connpass.com/event/311864/

こんにちは。サイオステクノロジー OSS サポート担当 山本 です。

今回は MySQL と同じく RDBMS の一種である、MariaDB の基本的な使い方を見ていこうと思います。
時間があれば、前々回の MySQL の回と比べながら試していただくと少しだけ面白いかもしれません。

■MariaDB のインストール

まずはインストール…ですが、OS によってインストール方法は異なりますので、こちらこちらなどからお使いの OS に合わせたインストール方法を確認してください。

なお、今回の例では Red Hat Enterprise Linux 8 を使用しますが、Red Hat Enterprise Linux 8 の場合は以下のコマンドを実行すれば OK です。

$ sudo dnf -y install mariadb-server

■MariaDB の起動とログ

次は起動方法を確認します。
systemd をサポートする OS (Red Hat Enterprise Linux, Fedora など) では以下のコマンドで MariaDB を起動できます。

$ sudo systemctl start mariadb

systemd をサポートしない OS では、以下のコマンドで MariaDB を起動できるはずです。
※コマンドの実行場所と “mysqld_safe” のパスに応じて、コマンドは調整する必要があります。

$ bin/mysqld_safe --user=mysql &

万が一うまくいかない場合は、ログで原因を確認しましょう。
MariaDB のログの配置場所は、設定ファイル “mariadb-server.cnf” から確認できます。基本的には “datadir” で指定したディレクトリの配下にログが保存されます。”log_xxxx (例えば、log_error)” のような名前の設定がある場合、xxxx に該当するログだけはその設定で指定したパスに配置されます。

例えば、以下のような設定なら error のログは “/var/log/mariadb/mariadb.log” に、それ以外のログは “/var/lib/mysql/” の配下にそれぞれ保存されます。

[mysqld]
datadir=/var/lib/mysql
log_error=/var/log/mariadb/mariadb.log

■MariaDB への接続とパスワード変更

MariaDB のデータベースを操作するには、MariaDB に接続する必要があります。
MariaDB への接続は以下のコマンドで行います。

$ mysql -u <ユーザ名> -p
Enter password:<パスワード>

デフォルトではパスワードなしの “root” というユーザが作られているはずなので、以下のコマンドで接続できるはずです。

$ mysql -u root

以下のように表示されれば、接続成功です。

$ mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.32-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

接続できたら、まずはこのデフォルトユーザにパスワードを設定しておきましょう。
デフォルトの “root” ユーザのパスワードを変更するには、以下のコマンドを実行します。

MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY '<パスワード>';

その後、念のため以下のコマンドを実行し、”Password” の列が空のユーザがいないことを確認してください。
もし “Password” の列が空のユーザがいた場合、適宜パスワードを変更しましょう。
※ バージョンによっては以下のコマンドがエラーになる場合もありますので、ご留意ください。

MariaDB [(none)]> select User, Host, Password from mysql.user;

パスワードをセットできたら、以下のコマンドで一度ログアウトして、パスワードなしではログインできなくなっていることと設定したパスワードでログインできることを確認しましょう。

MariaDB [(none)]> exit

■データベースの基本的な操作

MariaDB のデータベースの基本的な使い方も見ていきましょう。

MariaDB もまた RDB であるため、データを入れるためにはどういうデータを入れるかを決めるテーブル” と、そのテーブルを複数で一つの組として管理するための “データベース” が予め必要になります。

■データベースの作成:CREATE DATABASE 文

データベースの作成は以下のコマンドで行えます。

MariaDB [<接続中の DB 名>]> CREATE DATABASE <データベース名>;

今回は以下のように、”test” という名前でデータベースを作ってみます。

MariaDB [(none)]> CREATE DATABASE test character set utf8mb4 collate utf8mb4_bin;
Query OK, 1 row affected (0.000 sec)

後ろの “character set utf8mb4 collate utf8mb4_bin” は…日本語を使うためのおまじないのようなもの、とでも思ってください。

■使用するデータベースの変更:USE 文

作成したデータベースを使用する状態にするには、以下のコマンドを実行します。

MariaDB [<接続中の DB 名>]> USE <データベース名>;

先ほど作ったデータベース “test” を使用するなら、以下のようになります。

MariaDB [(none)]> USE test;
Database changed
MariaDB [test]>

または、MariaDB に接続する際にデータベース名を指定すると、指定したデータベースを使用する状態になります。

$ mysql -u root -p test
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.3.32-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [test]>

■テーブルの作成:CREATE TABLE 文

次は入れるデータについての情報や制限を決めるテーブル” を作成します。

テーブルの作成は、基本的には以下のようなコマンドで行います。

MariaDB [<接続中の DB 名>]> CREATE TABLE <テーブル名> (
  <カラム1の名前> <カラム1の定義>,
  <カラム2の名前> <カラム2の定義>, 
    :
);

今回は…架空の通販用の商品リストを簡素な形で作ってみます。
テーブル名は “items” で持つ要素はこんな感じでしょうか。

 ・商品ID (itemID):任意の文字 (8文字以内)
 ・商品名 (name):任意の文字 (30文字以内)
 ・メーカーID (ManufacturerID):任意の文字 (4文字以内)
 ・値段 (price):数字

この場合はこのような感じになります。

MariaDB [test]> CREATE TABLE items (
     itemID varchar(8),
     name varchar(30),
     ManufacturerID varchar(4),
     price int
   );
Query OK, 0 rows affected (0.011 sec)

■データの追加:INSERT 文

続いて、実際にデータをテーブルに入れていきます。
データを入れる場合の基本は、以下のようなコマンドです。

MariaDB [<接続中の DB 名>]> INSERT INTO <テーブル名> VALUES (<カラム1の値>, <カラム2の値>, …);

先に作ったテーブルで試してみましょう。

MariaDB [test]> INSERT INTO items VALUES ("00000001", "冷蔵庫", "0001", 30000);
Query OK, 1 row affected (0.002 sec)

なお、”VALUES” の後ろの実際に入れるデータの部分は、”()” を “,” で区切ることで複数のデータを同時に入れることができます。

MariaDB [test]> INSERT INTO items VALUES
   ("00000002", "冷蔵庫", "0002", 40000),
   ("00000003", "電子レンジ", "0001", 6000);
Query OK, 2 rows affected (0.002 sec)
Records: 2  Duplicates: 0  Warnings: 0

また、テーブル作成時に設定したカラムの定義に反する場合、エラーとなりデータは登録できません。
例えば、今回の “items” テーブルでは第3カラムは4文字以内と制限をかけましたが、ここに5文字以上を入れようとすると、このようにエラーになります。

MariaDB [test]> INSERT INTO items VALUES ("00000004", "エアコン", "00003", 70000);
ERROR 1406 (22001): Data too long for column 'ManufacturerID' at row 1

■データの取得:SELECT 文

続いて、登録したデータを見る方法です。
データを見るためのコマンドの基本は、以下のような形です。

MariaDB [<接続中の DB 名>]> SELECT
    <表示するカラムの名前1>, <表示するカラムの名前2>,…
  FROM <テーブル名>;

例えば、先の “items” テーブルから “name” と “price” カラムの情報を取りたいなら以下のようになります。

MariaDB [test]> SELECT name, price FROM items;
+-----------------+-------+
| name            | price |
+-----------------+-------+
| 冷蔵庫          | 30000 |
| 冷蔵庫          | 40000 |
| 電子レンジ      |  6000 |
+-----------------+-------+
3 rows in set (0.000 sec)

全てのカラムの情報を取る場合、カラム名を列挙する代わりに “*” を使用することもできます。

MariaDB [test]> SELECT * FROM items;
+----------+-----------------+----------------+-------+
| itemID   | name            | ManufacturerID | price |
+----------+-----------------+----------------+-------+
| 00000001 | 冷蔵庫          | 0001           | 30000 |
| 00000002 | 冷蔵庫          | 0002           | 40000 |
| 00000003 | 電子レンジ      | 0001           |  6000 |
+----------+-----------------+----------------+-------+
3 rows in set (0.000 sec)

■絞り込み:WHERE 句

SELECT 文などの結果を特定の条件で絞り込みたい場合には、”WHERE 句” を使用します。

“WHERE 句” は単独では使用することはできず、SELECT 文や後述の UPDATE 文、DELETE 文などと合わせて使用します。
例えば、SELECT と一緒に使う場合は以下のような形になります。

MariaDB [<接続中の DB 名>]> SELECT
    <表示するカラムの名前1>, <表示するカラムの名前2>,…
  FROM <テーブル名>
  WHERE <条件式>;

これを使えば、例えば指定したカラムに特定の名前を持つデータ (レコード) や、指定したカラムの値が一定以上のデータ…と言った条件に沿ったデータのみを取得することができます。

MariaDB [test]> SELECT * FROM items WHERE name = "冷蔵庫";
+----------+-----------+----------------+-------+
| itemID   | name      | ManufacturerID | price |
+----------+-----------+----------------+-------+
| 00000001 | 冷蔵庫    | 0001           | 30000 |
| 00000002 | 冷蔵庫    | 0002           | 40000 |
+----------+-----------+----------------+-------+
2 rows in set (0.000 sec)

MariaDB [test]> SELECT * FROM items WHERE name = "冷蔵庫" AND price < 40000;
+----------+-----------+----------------+-------+
| itemID   | name      | ManufacturerID | price |
+----------+-----------+----------------+-------+
| 00000001 | 冷蔵庫    | 0001           | 30000 |
+----------+-----------+----------------+-------+
1 row in set (0.000 sec)

■データの更新:UPDATE 文

登録済みのデータの内容を変更する場合は、UPDATE 文を使います。
UPDATE の基本的な使用法は、以下のような形です。

MariaDB [<接続中の DB 名>]> UPDATE <テーブル名> SET
  <変更するカラムの名前> = <新しい値>;

WHERE 句を使用しないと全てのデータが更新されるため、基本的には WHERE 句で条件を絞って使用することになるかと思います。

例として、先の items テーブルの ID:"00000003" の値段を、確認しながら変更してみます。

MariaDB [test]> SELECT * FROM items;
+----------+-----------------+----------------+-------+
| itemID   | name            | ManufacturerID | price |
+----------+-----------------+----------------+-------+
| 00000001 | 冷蔵庫          | 0001           | 30000 |
| 00000002 | 冷蔵庫          | 0002           | 40000 |
| 00000003 | 電子レンジ      | 0001           |  6000 |
+----------+-----------------+----------------+-------+
3 rows in set (0.000 sec)

MariaDB [test]> UPDATE items SET price = 5500 WHERE itemID = "00000003";
Query OK, 1 row affected (0.002 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [test]> SELECT * FROM items;
+----------+-----------------+----------------+-------+
| itemID   | name            | ManufacturerID | price |
+----------+-----------------+----------------+-------+
| 00000001 | 冷蔵庫          | 0001           | 30000 |
| 00000002 | 冷蔵庫          | 0002           | 40000 |
| 00000003 | 電子レンジ      | 0001           |  5500 |
+----------+-----------------+----------------+-------+
3 rows in set (0.000 sec)

■データの削除:DELETE 文

登録済みのデータを削除したい場合は、DELETE 文を使用します。
DELETE は、基本的には以下のように使います。

MariaDB [<接続中の DB 名>]> DELETE FROM <テーブル名>;

WHERE 句なしだと指定したテーブルの中身が丸ごと吹き飛ぶので、基本的には WHERE 句で条件を絞り込んで使うことになるでしょう。

例えば、先の items テーブルから「冷蔵庫」の商品を、確認しながら削除してみます。

MariaDB [test]> SELECT * FROM items;
+----------+-----------------+----------------+-------+
| itemID   | name            | ManufacturerID | price |
+----------+-----------------+----------------+-------+
| 00000001 | 冷蔵庫          | 0001           | 30000 |
| 00000002 | 冷蔵庫          | 0002           | 40000 |
| 00000003 | 電子レンジ      | 0001           |  5500 |
+----------+-----------------+----------------+-------+
3 rows in set (0.000 sec)

MariaDB [test]> DELETE FROM items WHERE name = "冷蔵庫";
Query OK, 2 rows affected (0.002 sec)

MariaDB [test]> SELECT * FROM items;
+----------+-----------------+----------------+-------+
| itemID   | name            | ManufacturerID | price |
+----------+-----------------+----------------+-------+
| 00000003 | 電子レンジ      | 0001           |  5500 |
+----------+-----------------+----------------+-------+
1 row in set (0.000 sec)

■他にも…

この他にも、複数のテーブルを特定の条件で繋げて表示する "JOIN 句" や、複数の SQL による更新が一括で行われるようにする操作 "トランザクション" などの標準的なものをはじめ、様々な操作方法がありますので実際に使っていく場合はドキュメントも必要に応じて確認するようにしてください。

MariaDB [test]> SELECT * FROM items;
+----------+-----------------+----------------+-------+
| itemID   | name            | ManufacturerID | price |
+----------+-----------------+----------------+-------+
| 00000001 | 冷蔵庫          | 0001           | 30000 |
| 00000002 | 冷蔵庫          | 0002           | 40000 |
| 00000003 | 電子レンジ      | 0001           |  6000 |
+----------+-----------------+----------------+-------+
3 rows in set (0.000 sec)

MariaDB [test]> SELECT * FROM Manufacturer;
+------+--------+
| ID   | name   |
+------+--------+
| 0001 | foo社  |
| 0002 | bar社  |
+------+--------+
2 rows in set (0.000 sec)

MariaDB [test]> SELECT * FROM items INNER JOIN Manufacturer ON items.ManufacturerID = Manufacturer.ID;
+----------+-----------------+----------------+-------+------+--------+
| itemID   | name            | ManufacturerID | price | ID   | name   |
+----------+-----------------+----------------+-------+------+--------+
| 00000001 | 冷蔵庫          | 0001           | 30000 | 0001 | foo社  |
| 00000002 | 冷蔵庫          | 0002           | 40000 | 0002 | bar社  |
| 00000003 | 電子レンジ      | 0001           |  6000 | 0001 | foo社  |
+----------+-----------------+----------------+-------+------+--------+
3 rows in set (0.000 sec)

■最後に

今回は MariaDB の、基本的な使い方を見てきました。

前々回、前回に紹介した MySQL の基本的な使い方と比べてみると、前回もお話ししたとおり基本的な部分ではほとんど同じ使い方ができることがわかるかと思います。もちろん、各ソフトウェアで用意された高度な操作方法や、操作方法以外の細かいところを見ていくと違う部分はいくつも出てくるはずなので、全く同じものというわけではありません。

[他の回]
わからないなりに理解したいデータベース①:RDB編:MySQL①
わからないなりに理解したいデータベース②:RDB編:MySQL②
(今回)わからないなりに理解したいデータベース③:RDB編:MariaDB
わからないなりに理解したいデータベース④:RDB編:PostgreSQL

アバター画像
About 山本 53 Articles
元サーバサイドエンジニアのサポートエンジニア。「物事は理解できれば活路が見出せる可能性がある」という信条のもと、今日も石橋を叩く。
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。


ご覧いただきありがとうございます。
ブログの最新情報はSNSでも発信しております。
ぜひTwitterのフォロー&Facebookページにいいねをお願い致します!



>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

Be the first to comment

Leave a Reply

Your email address will not be published.


*


質問はこちら 閉じる