ゼミII実習


ゼミIIで使用しているテキストがあります

動的Webページ作成(その7)MySQL(その1)


今回はフリーのデータベースMySQLを使用してみましょう。まずMySQLの基本的な使い方に慣れてから、PHPとの連携について考えていきます。

MySQLはデータベースを管理するサーバの部分と、サーバに問い合わせを行うクライアントから構成されます。

一般にクライアントからサーバにSQLの文を使用してデータベースの操作を行います。ここで用語の整理をしておきましょう。

SQLは略語ではありません。言語の名称です。データベースを操作する時に使用される言語です。多くのデータベース管理用ソフトウェアで採用されています。

また、データベースではデータがあるフォーマットに従って表形式のデータ(表、テーブル)として管理されています。データベースにこれらの表を使ってデータの操作を柔軟に行うことができます。この時の操作にSQLが使用されています。

取りあえずMySQLを実際に使用しながら練習していきましょう。

まず、実習室のシステムではMySQLサーバが起動している状態なので、MySQLクライアントを起動するところから始めます。

スタート>すべてのプログラム>教材ツール>MySQLの順にクリックしてください。MySQLの画面がコマンドプロンプトを使用して現れます。

メッセージが表示された後で次のようなプロンプトが表示されていればOKです。

mysql>

ワールドカップ用のデータベースを作ってみたいと思います。

先ほどのプロンプトのmysql>の右側に次のような文を入力しデータベースを作ります。文の終わりは;で終了します。CREATE DATABASEが命令で、wcup2006が作成するデータベースの名前です。

CREATE DATABASE wcup2006;

<参考>大文字でCREATE DATABASEを書いていますが、小文字で書いてもかまいません。ただSQLの書き方に従うとSQL文やデータ型などの予約語(SQLで採用している単語)は大文字で書くことになっています。

例えば次のようなメッセージが表示されます。

Query OK, 1 row affected (0.33 sec)

本当に作られたかどうか次の文で確認します。

SHOW DATABASES;

例えば次のように表示されます。

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
| wcup2006           |
+--------------------+
4 rows in set (0.29 sec)

この表の中に今作ったデータベースの名前wcup2006があることがわかります。

次に実際にデータを格納するための表を作っていくことになりますが、複数データベースがある場合どのデータベースを使用するのかを次の文により決定します。

USE wcup2006;

そして例えば次のように表示されます。

Database changed

実際のデータは次のような表になっていました。

A ドイツ ger_tn.png
A コスタリカ crc_tn.png
A ポーランド pol_tn.png
A エクアドル ecu_tn.png

この表では左から組、国名、国旗のファイル名のデータがならんでいます。データベースの表では列をフィールド、行をレコードと呼んでいます。

これからテーブルを作るにあたり、フィールドにどのような情報が入るのかを決定します。

具体的にはフィールドの名前とデータの型およびそれぞれのフィールドの幅を決定していくことになります。表にまとめると以下のようになります。

データの種類 フィールドの名前 データの型 フィールドの幅(バイト数)
wgroup CHAR 1
国名 country VARCHAR 50
国旗のファイル名 flag CHAR 10

<注意>例えば組のところでフィールド名をwgroupとしていますが、groupを使った場合、groupという単語は予約語として使われているためSQL文が実行された時にエラーが発生します。

フィールドのデータの型でCHARは固定長の文字列型のデータを示しています。これは長さが決まっているデータを指定する時に使用します。VARCHARは可変長文字列型のデータを示しています。ここで示した長さは最大文字数で、文字通り最大文字数までの長さのデータを扱う時に使用します。

漢字は2バイトのデータと考えてよいでしょう。この場合、50バイトは英文字で50文字ですが漢字などの日本語のデータを扱う時には25文字まで扱うことができます。

それではこの表をもとにデータベースwcup2006のテーブルを作ってみましょう。テーブルの名前はentryとします。次のように複数行のコマンドを入力していきますが、一行の終わりではエンターキーを1回たたいてみましょう。次の行に移り、−>が表示されます。続けて一行入力します。最後の行で;が入っている場合に入力が終了し、SQL文が実行されます。

CREATE TABLE entry (
  wgroup CHAR(1),
  country VARCHAR(50),
  flag CHAR(10)
);

CREATE TABLEというSQL文を使用しています。テーブル名entryを続けて書き、( )内にフィールドの情報を,で区切って並べています。

実行後エラーが発生した場合には、もう一度入力し直しましょう。

SQL文の実行がうまくいった場合、次のように表示されます。

Query OK, 0 rows affected (0.39 sec)

実際にこの表が作られたかどうか確認してみましょう。次のSQL文により確認します。

DESCRIBE entry;

次のような表が表示されます。

+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| wgroup  | char(1)     | YES  |     |         |       |
| country | varchar(50) | YES  |     |         |       |
| flag    | char(10)    | YES  |     |         |       |
+---------+-------------+------+-----+---------+-------+
3 rows in set (0.33 sec)

次にこのテーブルentryにデータを入力していきましょう。先ほどと同様に以下のSQL文を入力していきましょう。

INSERT INTO entry
  (wgroup, country, flag)
  VALUES ('A', 'ドイツ', 'ger_tn.png');

INSERT INTOというSQL文を使っています。次にテーブルな名前を書いています。次に( )で囲んだ部分に入力するフィールドを指定しています。次にVALUESと書いて、( )に入力するフィールドに対応するデータを並べています。文字列は’’で囲みます。数値はそのまま書きます。

<参考>コマンドプロンプトの画面で漢字のデータを入力する場合にはAltキーを押したまま、半角/全角キーを1回たたきます。画面の右下に日本語入力のガイドが表示されます。日本語入力の切り替えを行うことができます。

SQL文の実行がうまくいった場合、次のように表示されます。

Query OK, 1 row affected (0.30 sec)

入力したデータを確認してみましょう。

SELECT * FROM entry;

SELECTというSQL文を使用します。*はすべてのフィールドを指定しています。必要なフィールド名を,で区切って並べて表示させることもできます。FROMは使用するテーブルを指定します。

SQL文の実行がうまくいった場合、次のように表示されます。

+--------+---------+------------+
| wgroup | country | flag       |
+--------+---------+------------+
| A      | ドイツ  | get_tn.png |
+--------+---------+------------+
1 row in set (0.26 sec)

MySQLを終了するにはquitあるいはexitと入力し、エンターキーを1回たたきます。

以上、基本的なSQL文を使った操作について練習しました。

練習1.テーブルentryにA組のデータを入力しなさい。表が完成しているかどうか確認しなさい。

練習2.今日の操作の復習です。新たにデータベースwcup2006altを作りなさい。テキストを参考にしてテーブルentryを作りなさい。テーブルentryにA組のデータを入力しなさい。表が完成しているかどうか確認しなさい。

Q.次のような表を作ってしまいました。最後のドイツの行を消したいのですが。

+--------+------------+------------+
| wgroup | country    | flag       |
+--------+------------+------------+
| A      | ドイツ     | ger_tn.png |
| A      | コスタリカ | crc_tn.png |
| A      | ポーランド | pol_tn.png |
| A      | エクアドル | ecu_tn.png |
| A      | ドイツ     | ger_tn.png |
+--------+------------+------------+

A.主キーがあればWHERE句を使って簡単に削除できます。今回はSELECT文でDISTINCTキーワードを使って重複するレコードを削除してみます。

select DISTINCT * from entry;

テーブル自体のデータは代わっていないので、この結果を別のテーブルとして保存できればよさそうです。

CREATE TABLE entry2 AS SELECT DISTINCT * from entry;

CREATE TABLE文を使ってentry2のテーブルを作ります。この時AS以下に先ほどのSELECT文を使っています。次のような表entry2が作られます。

+--------+------------+------------+
| wgroup | country    | flag       |
+--------+------------+------------+
| A      | ドイツ     | ger_tn.png |
| A      | コスタリカ | crc_tn.png |
| A      | ポーランド | pol_tn.png |
| A      | エクアドル | ecu_tn.png |
+--------+------------+------------+

おまけとしてもう一つの方法も試してみましょう。主キーを元の表に設定してみます。元の表は以下のようになっているものとします。

+--------+------------+------------+
| wgroup | country    | flag       |
+--------+------------+------------+
| A      | ドイツ     | ger_tn.png |
| A      | コスタリカ | crc_tn.png |
| A      | ポーランド | pol_tn.png |
| A      | エクアドル | ecu_tn.png |
| A      | ドイツ     | ger_tn.png |
+--------+------------+------------+

ALTER TABLE文を使って新たに列あるいはフィールドentry_idを追加します。ALTER TABLEの次にテーブルを指定します。ADDの次に新たに加えるフィールドentry_idを書きます。SMALLINT UNSIGNEDで整数型を指定しています。AUTO_INCREMENT自動的にレコードが追加されるたびに、このフィールドに値が追加されます。PRIMARY KEYとしてこのフィールドを主キーに設定しています。主キーには一意の値、つまり重複しない値が設定されます。

ALTER TABLE entry ADD entry_id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY;

この文を実行後テーブルを確認すると次のようになっています。

+--------+------------+------------+----------+
| wgroup | country    | flag       | entry_id |
+--------+------------+------------+----------+
| A      | ドイツ     | ger_tn.png |        1 |
| A      | コスタリカ | crc_tn.png |        2 |
| A      | ポーランド | pol_tn.png |        3 |
| A      | エクアドル | ecu_tn.png |        4 |
| A      | ドイツ     | ger_tn.png |        5 |
+--------+------------+------------+----------+

これにより次のDELETE文を使って最後のレコードを削除することができます。

DELETE FROM entry WHERE entry_id = 5;

それからテーブルを確認すると以下のようになっています。

+--------+------------+------------+----------+
| wgroup | country    | flag       | entry_id |
+--------+------------+------------+----------+
| A      | ドイツ     | ger_tn.png |        1 |
| A      | コスタリカ | crc_tn.png |        2 |
| A      | ポーランド | pol_tn.png |        3 |
| A      | エクアドル | ecu_tn.png |        4 |
+--------+------------+------------+----------+