MySQLを使ってみよう

目次

MySQLとは

LAMPのMです。

厳密に説明しようとすると、大学院の「データベース特論」みたいな講義レベルになってしまうので、 簡単のために、あまり正確でない説明が含まれています。

詳しい定義などは、Wikipediaなどを参照してください。

MySQLって何?

関係データベース管理システム(RDBMS)という種類に属するデータベース管理システム(DBMS)のミドルウェアです。

MySQLという名前からもわかるように、 SQLというデータベース向け言語を用いて、データの管理を行うことができます。

そもそもRDBMSって何?

社会一般で用いられているデータベースとして、 下記のようなモノがあります。

  • 住所録
  • 電子カルテ
  • 企業情報データベース

これらのデータベースをサーバー上に構築するためのミドルウェアがDBMSです。

さらに、住所録の例を思い浮かべると、氏名、住所、電話番号...というような一定の表形式で記述されていることが多いと思います。
このような、一定の表形式でデータを管理するDBMSを、特にRDBMSと呼んだりします。

今日のWebサービスの大半は、何らかのDBMSを使用してデータ管理を行っているはずです。

データベースの構造

一般的なRDBMSにおけるデータベースは、基本的に下記のようなデータ構造となっています。

  • データベース(図中のECサイトのデータベースなど)という大きな箱がある
  • データベースの中に、テーブル(図中のユーザなど)が存在する
  • テーブルは表形式で表される
    • 行: レコード
    • 列: カラム

RDBMSの利点

「そんなもの使わなくても、データを保存するだけならば、適当にファイルへ書き込んでおけば良いじゃないか?」
という気がしてきます。

RDBMSを使う利点とは何なのでしょうか。

  • SQLというデータベース言語を使用して、簡単にデータ操作処理(データ検索・保存…)を記述できる
  • データ記録処理(永続化処理とも)の詳細を隠蔽、抽象化できる
    • 「記録場所を サーバー内のファイル から 遠隔地のデータベースサーバー に変更する」のような変更を、アプリケーションの改修をせずに、データベースの設定を変更するだけでサクッとできる
  • データ形式の制約を設定できる
    • ”氏名欄が入力されていない住所録データ”のような不正なデータを検査・検知できる
  • その他…

要するに、よくあるデータ管理に関わる処理を車輪の再発明せずに、 アプリケーションに組み込むことができることが一番の利点だと言えると思います。

SQLって何?

MySQLをはじめとしたRDBMSが理解できる言語です。 MySQLに対して命令(あのデータ検索しろ、このデータを追加しろ…)を伝える際には、SQLという言語により命令内容を記述します。

命令の種類によって、以下に述べる3種類の言語要素があります。

それぞれの要素について、詳しい説明はWikipediaを参照してください。

データ定義言語(DDL)

データベースに格納するデータの構造定義に関する命令です。

  • CREATE文: データベースやテーブルの構造の定義を行う
  • DROP文: 既存のデータベースやテーブルを削除する
  • ALTER文: 既存のデータベースやテーブルの構造を変更する

データ操作言語(DML)

あらかじめ定義したデータベースのテーブルに対して、下記のような操作を行う命令です。

  • SELECT文: レコードを検索する
  • INSERT文: レコードを新規登録する
  • UPDATE文: レコードを更新する
  • DELETE文: レコードを削除する

データ制御言語(DCL)

あらかじめ定義したデータベースのテーブルに対して操作を行うための権限の定義に関する命令です。

  • GRANT文: 指定したユーザーに特定の作業を行う権限を与える
  • REVOKE文: 指定したユーザーから既に与えた権限を剥奪する

データベース(MySQL)に触れてみよう

実際にMySQLにログインしてSQL文を実行してみよう。

参考: MySQLの使い方

MySQLのインストール

下記の2つのパッケージをインストールします。

  • mysql-server: MySQLサーバー本体
  • mysql: MySQLサーバーに接続して作業するためのクライアント

入れる前に、レポジトリを追加しましょう。

# yum -y -d 1 install http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

違うバージョンが入らないよう、mysql5.7だけ有効にします。

# yum-config-manager --disable mysql55-community >/dev/null
# yum-config-manager --disable mysql56-community >/dev/null
# yum-config-manager --enable mysql57-community >/dev/null
# yum install mysql-community-devel mysql-community-server

例によって、自動起動の設定とmysql-serverの起動を行います。 mysql-serverは、サーバー上ではmysqldと表記されている場合が多いです。

# systemctl enable mysqld
# systemctl start mysqld

MySQLにログインしてみよう

インストール時に自動的にパスワードが設定されますので、ログからパスワードを確認します。

# cat /var/log/mysqld.log | grep root

ターミナルで下記のコマンドを入力して、MySQLにログインします。

# mysql -u root -p

なにやらずらずら表示されますが、mysql>のような表示(mysqlのプロンプト)がでていたらログイン成功です。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.46 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

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> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Intern@1234';

これ以降のコマンドは、mysqlのプロンプトに対して実行します。

データベース・テーブルを作ってみよう

下記のような構造のデータベース・テーブルを作成してみましょう。

  • DATABASE : form
  • TABLE : user_info
name   password
 user1   user1
 user2   user2
 user3   user3
 user4   user4

データベース作成

まず、formというデータベースを作ります。

CREATE DATABASE form;という命令実行の後に、formというデータベースが生成されていることがわかります。

# 既存のデータベース確認
mysql> SHOW DATABASES;
> +--------------------+
> | Database           |
> +--------------------+
> | information_schema |
> | mysql              |
> | performance_schema |
> | test               |
> +--------------------+
> 4 rows in set (0.01 sec)

# データベース作成
mysql> CREATE DATABASE form;
> Query OK, 1 row affected (0.00 sec)

# もう一度、データベース確認
mysql> SHOW DATABASES;
> +--------------------+
> | Database           |
> +--------------------+
> | information_schema |
> | form               |
> | mysql              |
> | performance_schema |
> | test               |
> +--------------------+
> 5 rows in set (0.00 sec)

テーブル作成

次に、formデータベース内にuser_infoテーブルを追加してみましょう。

# データベースに接続する
mysql> USE form
> Database changed

# 既存のテーブル確認
mysql> SHOW TABLES;
> Empty set (0.00 sec)

# テーブル生成
# VARCHAR(255) => 255桁の文字列
mysql> CREATE TABLE user_info (name VARCHAR(255), password VARCHAR(255));
> Query OK, 0 rows affected (0.01 sec)

# もう一度確認
mysql> SHOW TABLES;
> +----------------+
> | Tables_in_form |
> +----------------+
> | user_info      |
> +----------------+
> 1 row in set (0.00 sec)

# テーブルの構造を確認
mysql> DESC user_info;
> +----------+--------------+------+-----+---------+-------+
> | Field    | Type         | Null | Key | Default | Extra |
> +----------+--------------+------+-----+---------+-------+
> | name     | varchar(255) | YES  |     | NULL    |       |
> | password | varchar(255) | YES  |     | NULL    |       |
> +----------+--------------+------+-----+---------+-------+
> 2 rows in set (0.00 sec)

テーブルにレコードを追加してみよう

user_infoテーブルにレコードを挿入してみよう。

# レコード挿入
mysql> INSERT INTO user_info (name, password) VALUES ("user1", "user1");
> Query OK, 1 row affected (0.00 sec)

# 同様に他のレコードも挿入してみよう
# INSERT INTO user_info (name, password) VALUES ("user2", "user2");
# INSERT INTO user_info (name, password) VALUES ("user3", "user3");
# INSERT INTO user_info (name, password) VALUES ("user4", "user4");

# 挿入できたか確認
mysql> SELECT * FROM user_info;
> +-------+----------+
> | name  | password |
> +-------+----------+
> | user1 | user1    |
> | user2 | user2    |
> | user3 | user3    |
> | user4 | user4    |
> +-------+----------+
> 3 rows in set (0.00 sec)

追加したレコードを検索してみよう

SELECT文をガシガシ弄ってみよう。

# 全件表示
mysql> SELECT * FROM user_info;
> +-------+----------+
> | name  | password |
> +-------+----------+
> | user1 | user1    |
> | user2 | user2    |
> | user3 | user3    |
> +-------+----------+
> 3 rows in set (0.00 sec)

# nameカラムがuser1のレコードを絞り込み
mysql> SELECT * FROM user_info WHERE name = "user1";
> +-------+----------+
> | name  | password |
> +-------+----------+
> | user1 | user1    |
> +-------+----------+
> 1 row in set (0.00 sec)

# user1さんのパスワードを抜き出し
mysql> SELECT password FROM user_info WHERE name = "user1";
> +----------+
> | password |
> +----------+
> | user1    |
> +----------+
> 1 row in set (0.00 sec)

課題

下記のSQL文を調べて考えてみてください。

  1. user_infoテーブルに追加したuser4のパスワードを変更してみよう
    • user4 -> password4
  2. user4のレコードを削除してみよう