MySQL入門(Windows版)メモ


Apr2014 coskx

1.はじめに

この文書は,データベース利用環境の1つであるWindows版MySQL学習の最初のチュートリアルである。
MySQLではすべての権限をを持つユーザ「root」があり,インストール時に「root」に対するパスワードが設定されている。
通常,「root」はMySQLの設定を行い,個々のデータベースでの作業は通常のユーザが行っている。
そのため,このチュートリアルではrootがテストユーザを設定し,テストユーザとしてデータベースの作業することを想定している。。

ここではMySQLがインストールされた直後を想定し,
管理者ID        : root
管理者パスワード: rootpwd  (学習環境ではパスワードは設定されていないことも有る
が設定されているものとしてチュートリアルを開始することとする。

また,タスクトレイにある「MySQL Notifier」によってMySQLは稼働しているものとする。

2.管理者による最初のログイン

2.1 起動
コマンドプロンプトを立ち上げ,その中で「mysql -u root -p」を記述して管理者としてログインする。
(学習環境でrootのパスワードが設定されていない場合は「
mysql -u root

C:\Users\xxxxx>mysql -u root -p
Enter password: ******** ←ここにパスワードrootpwdを記述
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, 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>



Welcome to the MySQL monitor. ・・・
が表示されたらログイン成功でプロンプトが「mysql>」になる。

2.2 すぐに終了
終了するときは

quit;
または
exit;

mysql>quit; ←コマンドの最後は必ず「;」をつける
bye


コマンド行末の「;」を忘れた場合には「->」が表示されるので,「;」を入力する。


3.テスト環境の構築

まず最初に管理者としてログインし,管理者として作業する。
テストユーザを登録して,テストユーザが作業できるようにする。

C:\Users\xxxxx>mysql -u root -p
Enter password: ********


MySQLでは,複数のデータベースを作ることができ,1つのデータベース中に複数のテーブルをもつことができる。
テーブルとはExcelの1つのシートのイメージでデータを保存する単位である。

MySQL
  |--データベース1
  |        |--テーブル1
  |        |--テーブル2
  |        |      :
  |        |--テーブルN
  |
  |--データベース2
  |        |--テーブル1
  |        |--テーブル2
  |        |      :
  |        |--テーブルN
  |
  |--データベース3
 :



3.1 データベース一覧

どのようなデータベースを持っているのか表示してみる。
(root用のデータベースを表示する)


データベース一覧表示コマンド show databases;

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sakila             |
| test               |
| world              |
+--------------------+
6 rows in set (0.01 sec)



すでにいくつかのデータベースが作られていることがわかる。
データベースに関する作業はこれ以上行わない。


3.2 テストユーザ登録

実際のデータベースに関する作業をrootが行うことはない。rootの仕事はMySQLの管理である。
そこでテストユーザを設定し,この後はテストユーザが操作できるようにする。

テストユーザなどのユーザに関しては,rootがIDとパスワードと使用予定のデータベース名を登録する。
登録されたユーザは,rootが許したデータベース名のみ使用できる。

設定するテストユーザ
ユーザID               testuser
パスワード              testuserpwd
テストユーザが使用するデータベース名 testuserdb

rootがログインしている状態で以下の作業を行う。
mysql> create user 'testuser'@'localhost' identified by 'testuser';
Query OK, 0 rows affected (0.14 sec)


mysql> grant all on testuserdb.* to 'testuser'@'localhost';
Query OK, 0 rows affected (0.06 sec)

mysql> set password for 'testuser'@'localhost' = password('testuserpwd');
Query OK, 0 rows affected (0.00 sec)



quit;でrootは作業を終了する。
testuserが登録されたので,この後はtestuserとしてログインしてから作業する。

4.テストユーザでログインして操作


4.1 テストユーザでログイン

コマンドプロンプトを立ち上げ,その中で「mysql -u testuser -p」を記述してテストユーザとしてログインする。


C:\Users\xxxxx>mysql -u testuser -p
Enter password: ******** ←ここにパスワードtestuserpwdを記述
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2014, 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>



4.2 データベースの作成と削除

テスト用データベースtestuserdbを作成し,できていることを確認した後,すぐに削除する。


データベース一覧表示コマンド show databases;
データベース作成コマンド     create database データベース名;
データベース削除コマンド     drop database データベース名;


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)


mysql> create database testuserdb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testuserdb         |
+--------------------+
2 rows in set (0.01 sec)

mysql> drop database testuserdb;
Query OK, 0 rows affected (0.22 sec)


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.01 sec)



データベース一覧表示コマンドを実行すると,最初から1つだけデータベースができており,
そこに新しいデータベースtestuserdbを加えていることが
わかる。
testuserdbの名前は3.2でrootが使用を許可したデータベース名である。

データベースは自由に作成できるのではなく,予めrootが登録した名前のデータベースのみ作成できる。

この作業ではつぎのようなデータベースを作ったことになる。
MySQL
  |--testuserdb
  |




4.3 データベース中でのテーブルの作成と削除
もう一度データベースtestuserdbを作り,その中にテーブルmygoodlistを作る。
何もせず,テーブルmygoodlistを削除し,データベースtestuserdbを削除する。

データベースの作業対象宣言コマンド use データベース名;

テーブル作成コマンド        create table テーブル名(列名 型, 列名 型, 列名 型, ・・・);
テーブル削除コマンド        drop table テーブル名;
mysql> create database testuserdb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testuserdb         |
+--------------------+
2 rows in set (0.01 sec)

mysql> use
testuserdb;
Database changed

mysql> create table mygoodlist(ID int, name varchar(20), price int);
Query OK, 0 rows affected (0.27 sec)

mysql> show tables;
+----------------------+
| Tables_in_testuserdb |
+----------------------+
| mygoodlist           |
+----------------------+
1 row in set (0.00 sec)

mysql> drop table mygoodlist;
Query OK, 0 rows affected (0.12 sec)

mysql> drop database testuserdb;
Query OK, 0 rows affected (0.22 sec)



この作業ではつぎのようなデータベースとテーブルを作ったことになる。

テーブル名は,rootが予め登録する必要が無いので,ユーザが自由に作成できる。

MySQL
  |--testuserdb
  |        |--mygoodlist
  |


このテーブルmygoodlistにはまだデータは入っていないが次のような表となっている。
ID (整数の値)
name (文字列)
price (整数の値)








4.4 テーブルデータの作成


ここまでの作業で,データベースとその中のテーブルの作り方,削除の仕方がわかった。

もう一度最初から,データベースとテーブルを作成してから,テーブル内にデータを入力する。


データ挿入コマンド insert into テーブル名 values (列1のデータ, 列2のデータ, 列3のデータ, ・・・);
(insertコマンドで日本語文字がうまく入力できずにエラーになってしまう場合はとりあえずローマ字で)

データベース抽出表示コマンド select
select * from mygoodlist で「*」はすべての意味で,
mygoodlistからすべてを選択するという意味である。
mysql> create database testuserdb;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testuserdb         |
+--------------------+
2 rows in set (0.01 sec)

mysql> use
testuserdb;
Database changed

mysql> create table mygoodlist(ID int, name varchar(20), price int);
Query OK, 0 rows affected (0.27 sec)

mysql> show tables;
+----------------------+
| Tables_in_testuserdb |
+----------------------+
| mygoodlist           |
+----------------------+
1 row in set (0.00 sec)

mysql> insert into mygoodlist values (1, "みかん", 100);
Query OK, 1 row affected (0.06 sec)

mysql> insert into mygoodlist values (2, "りんご", 150);
Query OK, 1 row affected (0.06 sec)

mysql> insert into mygoodlist values (3, "りんご青森", 200);
Query OK, 1 row affected (0.06 sec)

mysql> select * from mygoodlist;
+------+------------+-------+
| ID   | name       | price |
+------+------------+-------+
|    1 | みかん     |   100 |
|    2 | りんご     |   150 |
|    3 | りんご青森 |   200 |
+------+------------+-------+
3 rows in set (0.05 sec)


このテーブルmygoodlistにはつぎのようにデータが入っている。
ID (整数の値)
name (文字列)
price (整数の値)
1
みかん
100
2
りんご
150
3
りんご青森
200

ここで一旦ログアウトする。
mysql> quit;
Bye



データベース,テーブル,データは残ったままになる。


5.テストユーザのデータベースの操作

もう一度testuserでログインしてデータベースを操作してみる。
抽出表示selectコマンドにおいて「*」はすべてを意味し,「%」は任意の文字列を表わす。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| testuserdb         |
+--------------------+
2 rows in set (0.01 sec)

mysql> use testuserdb
Database changed

mysql> show tables;
+----------------------+
| Tables_in_testuserdb |
+----------------------+
| mygoodlist           |
+----------------------+
1 row in set (0.00 sec)

mysql> select * from mygoodlist;
+------+------------+-------+
| ID   | name       | price |
+------+------------+-------+
|    1 | みかん     |   100 |
|    2 | りんご     |   150 |
|    3 | りんご青森 |   200 |
+------+------------+-------+
3 rows in set (0.05 sec)

mysql> select name from mygoodlist;
+------------+
| name       |
+------------+
| みかん     |
| りんご     |
| りんご青森 |
+------------+

mysql> select name, price from mygoodlist;
+------------+-------+
| name       | price |
+------------+-------+
| みかん     |   100 |
| りんご     |   150 |
| りんご青森 |   200 |
+------------+-------+

mysql> select name, price from mygoodlist where name="みかん";
+--------+-------+
| name   | price |
+--------+-------+
| みかん |   100 |
+--------+-------+

mysql> select name, price from mygoodlist where price>110;
+------------+-------+
| name       | price |
+------------+-------+
| りんご     |   150 |
| りんご青森 |   200 |
+------------+-------+

mysql> select name, price from mygoodlist where name like "りんご%";
+------------+-------+
| name       | price |
+------------+-------+
| りんご     |   150 |
| りんご青森 |   200 |
+------------+-------+
2 rows in set (0.04 sec)


データ表示補足
ここまでは,useコマンドで使用するデータベースを指定して,その中のテーブルを次のように表示していた。
> select * from mygoodlist;
useコマンドが実行されていない状態では
> select * from testuserdb.mygoodlist;
のようにデータベース名を含めてコマンドを与える。

4.3~4.4と同じ方法で新しいテーブルをtestuerdb中に作ることができる。

データの更新は次のように行なうことができる。
> update mygoodlist set price=170 where name="りんご";

データの削除は次のように行
なうことができる
> delete from mygoodlist where name='りんご';
データ削除(先頭から2件)
> delete from mygoodlist limit 2 ;
テーブルの全データ削除
> delete from mygoodlist;

コマンドを羅列したファイルをカレントフォルダに作成しておくと,
> source ファイル名
で一連のコマンドを実行できる。

6.PHPからのデータベースアクセス



6.1 準備
php.iniを変更

次の2行をさがして有効にする。(mysqliに関しては当面使わない)
extension=php_mysql.dll
extension=php_mysqli.dll

次の4行を探して,右辺をセットする
mysql.default_port =3306
mysql.default_host =localhost         ←これはなくて良い(PHPプログラム中で与えるので)
mysql.default_user =testuser          ←これはなくて良い(PHPプログラム中で与えるので)
mysql.default_password =testuserpwd   ←これはなくて良い
(PHPプログラム中で与えるので)

Apacheを再起動する


6.2 アクセス

データベースへのSQLコマンドは,直接MySQLを操作するのと同じである。
MySQLは標準で文字コードがUTF-8なので,PHPもUTF-8で作成する。
PHPの記述の中で関数mysql_query()で送っているのがSQLコマンド(クエリ)である。

前提
ユーザID testuser
パスワード testuserpwd
使用データベース testuserdb
使用テーブル mygoodlist
使用テーブルのカラム ID, name, price (ID,品物名,価格)

下記phpプログラム内で
$link = mysqli_connect('localhost', 'testuser', 'testuserpwd');
で,サーバlocalhostにユーザtestuserがパスワードtestuserpwdで接続しています。

次の例は,とにかくテーブルmygoodlistにアクセスして,すべてを表示する例である。


MySQLテーブルmygoodlist内容一覧表示 mysqltest.php
<?php

//****** 関数領域 ここから *****
function quote_smart($value)
{
    global $link;
    // 数値以外をクオートする
    if (!is_numeric($value)) {
        $value = "'" . mysqli_real_escape_string($link, $value) . "'";
    }
    return $value;
}

function getWholeTable()
{
    global $link;
    $resulttxt="";
    $result = mysqli_query($link, 'select * from mygoodlist');
    if (!$result) {
        die('クエリーが失敗しました。'.mysqli_error($link));
    }
    $resulttxt.='<p>';
    while ($row = mysqli_fetch_assoc($result)) {
        $resulttxt.='id='.$row['ID'].", ";
        $resulttxt.='name='.quote_smart($row['name']).", ";
        $resulttxt.='price='.$row['price']."<br>";
    }
    $resulttxt.='</p>';
    return $resulttxt;
}
//****** 関数領域 ここまで *****

//****** 制御領域 ここから *****
$message="";
$resulttxt="";

$link = mysqli_connect('localhost', 'testuser', 'testuserpwd');
if (!$link) {
    die('MySQL への接続を失敗しました。'.mysqli_error($link));
}
$message.="MySQL への接続に成功しました。<br>";

$db_selected = mysqli_select_db($link, 'testuserdb');
if (!$db_selected){
    die('データベース testuserdb でコマンド select が実行できませんでした。' . mysqli_error($link));
}
$message.="データベース testuserdb でコマンド select が実行できました。<br>";

$resulttxt=getWholeTable();

$close_flag=mysqli_close($link);
if (!$close_flag){
    die('MySQL のクローズに失敗しました。' . mysqli_error($link));
}
$message.="MySQL のクローズにに成功しました。<br><br>";

//****** 制御領域 ここまで *****
?>

<?php
//****** 表示領域 ここから *****
?>

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><META http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>PHP MYSQL TEST</title>
</HEAD>
<BODY>
<H2>PHP MYSQLI TEST</H2>
<?php print $message; ?>
<?php print $resulttxt; ?>
</BODY>
</html>

<?php
//****** 表示領域 ここまで *****
?>
実行時の画面
PHP MYSQL TESTPHP MYSQL TEST

PHP MYSQL TEST

MySQL への接続に成功しました。
データベース testuserdb でコマンド select が実行できました。
MySQL のクローズにに成功しました。

id=1, name='みかん', price=100
id=2, name='りんご', price=150
id=3, name='りんご青森', price=200



次の例は,対話型でテーブルmygoodlistにアクセスする例である。

MySQL操作 mysqltest2.php
<?php

//****** 関数領域 ここから *****
function quote_smart($value)
{    global $link;
   // 数値以外をクオートする
    if (!is_numeric($value)) {
        $value = "'" . mysqli_real_escape_string($link, $value) . "'";
    }
    return $value;
}

function getWholeTable()
{
    global $link;
    $resulttxt="";
    $result = mysqli_query($link, 'select * from mygoodlist');
    if (!$result) {
        die('クエリーが失敗しました。'.mysqli_error($link));
    }
    $resulttxt.='<p>';
    while ($row = mysqli_fetch_assoc($result)) {
        $resulttxt.='id='.$row['ID'].", ";
        $resulttxt.='name='.quote_smart($row['name']).", ";
        $resulttxt.='price='.$row['price']."<br>";
    }
    $resulttxt.='</p>';
    return $resulttxt;
}
//****** 関数領域 ここまで *****

//****** 制御領域 ここから *****
$message="";
$resulttxt="";

$link = mysqli_connect('localhost', 'testuser', 'testuserpwd');
if (!$link) {
    die('MySQL への接続を失敗しました。'.mysqli_error($link));
}
$message.="MySQL への接続に成功しました。<br>";

$db_selected = mysqli_select_db($link, 'testuserdb');
if (!$db_selected){
    die('データベース testuserdb でコマンド select が実行できませんでした。' . mysqli_error($link));
}
$message.="データベース testuserdb でコマンド select が実行できました。<br>";

if (isset($_POST['selectall'])) { //全表示
    $resulttxt=getWholeTable();
} else if (isset($_POST['insert'])) { //データ挿入
    $sql = "insert into mygoodlist values (".$_POST['id'].",\"".$_POST['name']."\",".$_POST['price'].")";
    $result_flag = mysqli_query($link, $sql);
    if (!$result_flag) {
        die('クエリー insert が失敗しました。'.mysqli_error($link));
    }
    $resulttxt=getWholeTable();
} else if (isset($_POST['delete'])) { //データ削除
    $sql = "delete from mygoodlist where ID=".$_POST['id'];
    $result_flag = mysqli_query($link,$sql);
    $result = mysqli_query($link,'SELECT * FROM mygoodlist');
    if (!$result) {
        die('クエリー delete が失敗しました。'.mysqli_error($link));
    }
    $resulttxt=getWholeTable();
}

$close_flag=mysqli_close($link);
if (!$close_flag){
    die('MySQL のクローズに失敗しました。' . mysqli_error($link));
}
$message.="MySQL のクローズにに成功しました。<br><br>";

//****** 制御領域 ここまで *****
?>

<?php
//****** 表示領域 ここから *****
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><META http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>PHP MYSQL TEST</title>
</HEAD>
<BODY>
<H2>PHP MYSQLI TEST</H2>
<?php print $message; ?>
<?php print $resulttxt; ?>

<form method="post">
テーブルの内容を全表示します。<br>
<input type="submit" name="selectall" value="全表示"><br><br>
</form>
<form method="post">
テーブルに新規データを追加します。<br>
ID <input type="text" name="id">(半角数字のみ)<br>
name <input type="text" name="name"><br>
price <input type="text" name="price">(半角数字のみ)<br>
<input type="submit" name="insert" value="新規データ挿入"><br><br>
</form>
<form method="post">
テーブルからIDを指定してデータを削除します。<br>
ID <input type="text" name="id">(半角数字のみ)<br>
<input type="submit" name="delete" value="データ削除"><br><br>
</form>

</BODY>
</html>

<?php
//****** 表示領域 ここまで *****
?>
実行時の画面
PHP MYSQL TEST

PHP MYSQL TEST

MySQL への接続に成功しました。
データベース testuserdb でコマンド select が実行できました。
MySQL のクローズにに成功しました。

id=1, name='みかん', price=100
id=2, name='りんご', price=150
id=3, name='りんご青森', price=200

id=4, name='愛媛みかん', price=80
id=5, name='バナナ', price=160

テーブルの内容を全表示します。


テーブルに新規データを追加します。
ID (半角数字のみ)
name
price (半角数字のみ)


テーブルからIDを指定してデータを削除します。
ID (半角数字のみ)