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

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

今回からのテーマはデータベースです。
既に熟知しているし使っているという方も、使っておらずともそれ知ってるよという方も多数いるかと思いますし、何なら情報もごろごろ出てくるものではありますが、
だからこそいざ最初からやろうと思った時に「結局なんなんだ…どこから手を付ければいいんだ…」と困ってしまうこともなくはないと思います。私とかです。

そんなわけで、数回に分けて何種類かのデータベースの触りの初歩の部分を見ていきたいと思っています。

■そもそもデータベースって?

まずざっくりと言うと、データベースは一定の法則性を持たせた多数のデータを保存するものです。
“一定の法則性” って何、と思った方は、例えばですが飲食店のメニュー表を思い浮かべてみてください。

 ・メニュー番号1 ハンバーグ 800円
 ・メニュー番号2 とんかつ 1000円
 ・メニュー番号3 ステーキ 1400円
  …etc

この例では各メニューが必ず「メニュー番号、メニュー名、値段」の順で記載されています。
他には例えば、会員制のサービスでは会員の「氏名、住所、性別、年齢、etc…」など、決められた情報を取得したりしますね。

このように、一定のテーマで、かつ決められた要素を持つデータたちを纏めて保存するものがデータベースです。

そして、このデータベースの作成・管理・参照などを行なうソフトウェアたちが、データベース管理システム (DBMS/DataBase Management System、あるいはこれも含めてデータベースと呼ばれる場合もあります) です。

今回はデータベースの一種である関係データベース (RDB/Relational DataBase) を管理する、関係データベース管理システム (RDBMS/Relational DataBase Management System) の MySQL のインストールから基本的な使い方までを見ていこうと思います。

■MySQL のインストール

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

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

$ sudo dnf -y install mysql-server

■MySQL の起動とログ

インストールに成功したら、次は起動方法です。
systemd をサポートする OS (Red Hat Enterprise Linux, Fedora など) では以下のコマンドで MySQL を起動できます。

$ sudo systemctl start mysqld

※ Debian/Ubuntu では “sudo systemctl start mysql” となります。

systemd をサポートしない OS では、以下のコマンドで MySQL を起動できるはずです。

$ bin/mysqld_safe --user=mysql &

万が一うまく起動できない場合は、ログで原因を確認しましょう。
MySQL のログは通常 /usr/local/mysql/data/ または /usr/local/var/ 配下、あるいは Red Hat Enterprise Linux などの場合には /var/log/mysql/ 配下のいずれかに配置されます。

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

MySQL のデータベースを操作するには、MySQL に接続する必要があります。
MySQL を無事起動出来たら、早速接続してみましょう。

MySQL への接続は以下のコマンドで行います。

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

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

$ mysql -u root

※ 初回起動にも関わらず上記で接続できない場合、初回起動時に自動的にパスワードが生成されるように設定されています。この場合、ログファイル (/var/log/mysql/、/usr/local/mysql/data/、/usr/local/var/ いずれかの配下) に、自動的に生成されたパスワードが記録されているはずです。

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

$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>

さて、とりあえず接続はできましたが、(MySQL に限らずですが) パスワード等の認証がなく接続できる状態接続情報がすぐわかってしまう状態を放っておくのは基本的に好ましくありません。
環境自体が十分にセキュアであり、かつ今回のように特に重要なデータも入れずに動作を試してみる程度なら、あるいは問題ないかもしれませんが…

ということで、まずはデフォルトユーザのパスワードを変更しましょう。
デフォルトの “root” ユーザのパスワードを変更するには、以下のコマンドを実行します。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '<パスワード>';

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

mysql> select User, Host, authentication_string from mysql.user;

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

mysql> exit

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

ここからは MySQL のデータベースにデータを入れたり参照したりする方法を確認していきます。

MySQL のデータベースにデータを入れるためには、どういうデータを入れるかを決めるテーブル” と、そのテーブルを複数で一つの組として管理するための “データベース” が予め必要になります。
これらの作成方法も併せて見ていきましょう。>

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

まずは “データベース” を作ります。
これは後述の “テーブル” を一纏めにして管理するための箱のようなものだと思ってもらえれば大丈夫です。

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

mysql> CREATE DATABASE <データベース名>;

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

mysql> CREATE DATABASE test character set utf8mb4 collate utf8mb4_bin;

Query OK, 1 row affected (0.01 sec)

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

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

作ったデータベースを操作するには、そのデータベースを使用する状態にする必要があります。
データベースを使用する状態にするには、以下のコマンドを実行します。

mysql> USE <データベース名>;

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

mysql> USE test;

Database changed

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

$ mysql -u <ユーザ名> -p <データベース名>

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

データベースに接続したら、”テーブル” を作ります。
テーブルはデータを入れる器のようなもので、入力するデータが「どんな要素 (カラム (Column) と呼びます) を持っているか」「各カラムはどんな文字を、何文字まで入力できるのか」「そのカラムは重複してよいのか」「そのカラムの入力は必須か」…などなど、入れるデータについての情報や制限を決める役割を持ちます。

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

mysql> CREATE TABLE <テーブル名> (
  <カラム1の名前> <カラム1の定義>,
  <カラム2の名前> <カラム2の定義>, 
    :
);

今回は…冒頭でお話ししたメニュー表的なものを、簡単な形で作ってみます。
テーブル名は “menu” で持つ要素はこんな感じですね。

 ・メニュー番号 (menuNo):数字
 ・メニュー名 (name):任意の文字 (10文字以内)
 ・値段 (price):数字

この場合はこんな感じのコマンドになります。

mysql> CREATE TABLE menu (
  menuNo int,
  name varchar(10), 
  price int
);

Query OK, 0 rows affected (0.02 sec)

■データの追加:INSERT 文

次は作ったテーブルにデータを入れてみましょう。
データを入れる場合の基本は、以下のようなコマンドです。

mysql> INSERT INTO <テーブル名> VALUES (<カラム1の値>, <カラム2の値>, …);

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

mysql> INSERT INTO menu VALUES (1, "ハンバーグ", 800);

Query OK, 1 row affected (0.00 sec)

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

mysql> INSERT INTO menu VALUES 
  (2, "とんかつ", 1000),
  (3, "ステーキ", 1400);

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

また、テーブル作成時に設定したカラムの定義に反する場合、エラーとなりデータは登録できません。
例えば、今回の “menu” テーブルでは数字を入れるはずの第3カラムに漢字を使おうとするとこのようにエラーとなります。

mysql> INSERT INTO menu VALUES (4, "すき焼き", "九八〇");

ERROR 1366 (HY000): Incorrect integer value: '九八〇' for column 'price' at row 1

■データの取得:SELECT 文

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

mysql> SELECT
    <表示するカラムの名前1>, <表示するカラムの名前2>,…
  FROM <テーブル名>;

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

mysql> SELECT name, price FROM menu;

+-----------------+-------+
| name            | price |
+-----------------+-------+
| ハンバーグ      |   800 |
| とんかつ        |  1000 |
| ステーキ        |  1400 |
+-----------------+-------+
3 rows in set (0.00 sec)

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

mysql> SELECT * FROM menu;

+--------+-----------------+-------+
| menuNo | name            | price |
+--------+-----------------+-------+
|      1 | ハンバーグ      |   800 |
|      2 | とんかつ        |  1000 |
|      3 | ステーキ        |  1400 |
+--------+-----------------+-------+
3 rows in set (0.00 sec)

■絞り込み:WHERE 句

SELECT を使うと、指定したテーブルのデータを全て取得します。
でも、実際に見たいのは特定のデータだけなのに…というケースも考えられますね。

そういった場合に使えるのが “WHERE 句” です。
WHERE 句は SELECT 文などと一緒に使用するもので、後ろに付け足すことで対象となるデータを絞り込むことができます。
例えば、SELECT と一緒に使う場合は以下のような形になります。

mysql> SELECT
    <表示するカラムの名前1>, <表示するカラムの名前2>,…
  FROM <テーブル名>
  WHERE <条件式>;

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

mysql> SELECT * FROM menu WHERE name = "とんかつ";

+--------+--------------+-------+
| menuNo | name         | price |
+--------+--------------+-------+
|      2 | とんかつ     |  1000 |
+--------+--------------+-------+
1 row in set (0.00 sec)

mysql> SELECT * FROM menu WHERE price < 1200;

+--------+-----------------+-------+
| menuNo | name            | price |
+--------+-----------------+-------+
|      1 | ハンバーグ      |   800 |
|      2 | とんかつ        |  1000 |
+--------+-----------------+-------+
2 rows in set (0.00 sec)

この WHERE 句は、SELECT 文の他には例えば後述の UPDATE 文や DELETE 文などと合わせて使うことができます。

■データの更新:UPDATE 文

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

mysql> UPDATE <テーブル名> SET
  <変更するカラムの名前> = <新しい値>;

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

例として、先の menu テーブルの「とんかつ」の値段を、確認しながら変更してみます。

mysql> SELECT * FROM menu;

+--------+-----------------+-------+
| menuNo | name            | price |
+--------+-----------------+-------+
|      1 | ハンバーグ      |   800 |
|      2 | とんかつ        |  1000 |
|      3 | ステーキ        |  1400 |
+--------+-----------------+-------+
3 rows in set (0.00 sec)

mysql> UPDATE menu SET price = 1200 WHERE name = "とんかつ";

Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM menu;

+--------+-----------------+-------+
| menuNo | name            | price |
+--------+-----------------+-------+
|      1 | ハンバーグ      |   800 |
|      2 | とんかつ        |  1200 |
|      3 | ステーキ        |  1400 |
+--------+-----------------+-------+
3 rows in set (0.00 sec)

■データの削除:DELETE 文

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

mysql> DELETE FROM <テーブル名>;

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

例えば、先の menu テーブルから「メニュー番号3」のメニューを、確認しながら削除してみます。

mysql> SELECT * FROM menu;

+--------+-----------------+-------+
| menuNo | name            | price |
+--------+-----------------+-------+
|      1 | ハンバーグ      |   800 |
|      2 | とんかつ        |  1200 |
|      3 | ステーキ        |  1400 |
+--------+-----------------+-------+
3 rows in set (0.00 sec)

mysql> DELETE FROM menu WHERE menuNo = 3;

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM menu;

+--------+-----------------+-------+
| menuNo | name            | price |
+--------+-----------------+-------+
|      1 | ハンバーグ      |   800 |
|      2 | とんかつ        |  1200 |
+--------+-----------------+-------+
2 rows in set (0.00 sec)

■最後に

今回は MySQL の、基本的な使い方を見てきました。
データベースってどんなもの?というところが伝えられていれば幸いです。

今回見てきたとおり、RDB はデータを決められた形式、順番で保存し簡単に検索できるため、データを整然と保管することができます。
また、データの順番や形式が決まっていることから、プログラムとの連携が容易にしやすく、その方法や手法も多数研究・開発されているのも魅力の一つです。

今回扱った操作方法だけでも MySQL を最低限扱うことはできますが、
MySQL (というよりは RDB そのもの) の歴史は極めて長く、複雑な操作やより細かい操作にも対応できるような様々なコマンドが用意されています。
具体的な内容で「こういうことできないかな」と考えながら調べると、意外に簡単に実現できるコマンドだったり、あるいは実現のためのノウハウがあったりすることもあるはずなので、
もし本格的に MySQL (など) を使用していく場合は、ドキュメントともにらめっこしながら進めていくことをおすすめします。

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

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

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

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です