2012年8月28日火曜日

6.2 テーブルの操作


ここでは、テーブルや列、レコードの追加や削除、更新といった作
業について取り上げます。

6.2.1 列の追加

テーブルを作成後に、列を新たに追加することができます。
ALTER TABLE テーブル名ADD 新規列名データ型[FIRST];

この書式を使うと、テーブルの右端に列を追加することができます。次の例
では、branchテーブルにtel欄を追加しています。

mysql> ALTER TABLE branch ADD tel VARCHAR(16);
mysql> DESC branch;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| id | smallint(6) | NO | PRI | | |
| branchname | varchar(20) | YES | | NULL | |
| tel | varchar(16) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+

なお、次のように「FIRST」を指定すると、テーブルの右端ではなく左端に
列が追加されます。


mysql> ALTER TABLE branch ADD tel VARCHAR(16) FIRST;

6.2.2 列の削除

列を削除するには、以下の書式を使います。
ALTER TABLE テーブル名DROP 列名;

次の例では、branchテーブルからtel列を削除します。削除の確認メッセージなどは表示されませんので注意して操作してください。
mysql> ALTER TABLE branch DROP tel;

6.2.3 レコードの更新

既存のレコードを更新するには、SQLコマンドのUPDATEを使います。
UPDATE テーブル名SET 列名= 値[WHERE 条件]

次の例では、name列の値が「Sato」であるレコードのage列の値を「24」
に変更します。

mysql> UPDATE staff SET age='24' WHERE name =
'Sato';
mysql> SELECT * FROM staff WHERE name =
'Sato';
+----+------+------+------+
| id | name | age | bid |
+----+------+------+------+
| 1 | Sato | 24 | 1 |
+----+------+------+------+

なお、WHERE句を指定しないと、すべてのレコードの列に同じ値が格納さ
れてしまいますので注意してください。

mysql> UPDATE staff SET age = '20';
mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 20 | 1 |
| 2 | Suzuki | 20 | 2 |
| 3 | Takahashi | 20 | 5 |
| 4 | Tanaka | 20 | 3 |
| 5 | Watanabe | 20 | 2 |
+----+-----------+------+------+









2012年8月23日木曜日

6.1 テーブルの結合(2)

6.1.3 外部結合


内部結合では、結合に使う列のデータが両方のテーブルにあるレコードのみ
出力されますが、外部結合では、どちらかのテーブルにしかデータがないレ
コードも出力されます。外部結合には、左外部結合と右外部結合があります。

SELECT 列名1 FROM テーブル名1 LEFT|RIGHT [OUTER]
JOIN テーブル名2 ON テーブル名1.列名1 = テーブル名2.列名2;

先ほどのテーブルとは少し異なるデータを使います。staffテーブルには、
bidが5のメンバーがいるとします。一方、branchテーブルには、idは4まで
しかありません。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 5 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
mysql> SELECT * FROM branch;
+----+------------+
| id | branchname |
+----+------------+
| 1 | Tokyo |
| 2 | Yokohama |
| 3 | Osaka |
| 4 | Nagoya |
+----+------------+

まず、左外部結合から見ていきましょう。左外部結合では、最初に(左側で)
指定した方のテーブルにあるレコードすべてを出力します。右側のテーブル
のレコードは、場合によってはNULLとなります。次の例では、左側のテー
ブルにあるbid = 5に対応するデータが右側のテーブルにないので、その部
分はNULLとなっています。

mysql> SELECT * FROM staff LEFT JOIN branch ON staff.bid =
branch.id;
+----+-----------+------+------+------+------------+
| id | name | age | bid | id | branchname |
+----+-----------+------+------+------+------------+
| 1 | Sato | 23 | 1 | 1 | Tokyo |
| 2 | Suzuki | 24 | 2 | 2 | Yokohama |
| 3 | Takahashi | 28 | 5 | NULL | NULL |
| 4 | Tanaka | 26 | 3 | 3 | Osaka |
| 5 | Watanabe | 30 | 2 | 2 | Yokohama |

右外部結合はその逆です。後に(右側で)指定した方のテーブルにあるレコ
ードをすべて出力します。

mysql> SELECT * FROM staff RIGHT JOIN branch ON staff.bid =
branch.id;
+------+----------+------+------+----+------------+
| id | name | age | bid | id | branchname |
+------+----------+------+------+----+------------+
| 1 | Sato | 23 | 1 | 1 | Tokyo |
| 2 | Suzuki | 24 | 2 | 2 | Yokohama |
| 5 | Watanabe | 30 | 2 | 2 | Yokohama |
| 4 | Tanaka | 26 | 3 | 3 | Osaka |
| NULL | NULL | NULL | NULL | 4 | Nagoya |
+------+----------+------+------+----+------------+

6.1.4 副問い合わせ


ある条件で検索したデータを使ってさらに検索を行いたい場合があります。
そのような、SELECT文の中で使われるSELECT文を副問い合わせ(サブクエリー)といいます。
SELECT 列名FROM テーブル名WHERE 列名IN (SELECT ~);
次の例では、age列が最大のレコードのname列を表示しています。

mysql> SELECT name FROM staff WHERE age IN
(SELECT MAX(age) FROM staff);
+----------+
| name |
+----------+
| Watanabe |
+----------+
処理を分析してみましょう。

mysql> SELECT MAX(age) FROM staff;
+----------+
| MAX(age) |
+----------+
| 30 |
+----------+
mysql> SELECT * FROM staff WHERE age = 30;
+----+----------+------+------+
| id | name | age | bid |
+----+----------+------+------+
| 5 | Watanabe | 30 | 2 |
+----+----------+------+------+

6.1.5 自己結合

同一のテーブルに別名を付けて結合することを自己結合といいます。

SELECT 列名FROM テーブル名AS 別名1 JOIN テーブル名AS 別名2;
自己結合の例を見てみましょう。

mysql> SELECT * FROM staff AS a JOIN staff AS b;
+----+-----------+------+------+----+-----------+------+------+
| id | name | age | bid | id | name | age | bid |
+----+-----------+------+------+----+-----------+------+------+
| 1 | Sato | 23 | 1 | 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 | 1 | Sato | 23 | 1 |
| 3 | Takahashi | 28 | 5 | 1 | Sato | 23 | 1 |
| 4 | Tanaka | 26 | 3 | 1 | Sato | 23 | 1 |
| 5 | Watanabe | 30 | 2 | 1 | Sato | 23 | 1 |
| 1 | Sato | 23 | 1 | 2 | Suzuki | 24 | 2 |
| 2 | Suzuki | 24 | 2 | 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 5 | 2 | Suzuki | 24 | 2 |
| 4 | Tanaka | 26 | 3 | 2 | Suzuki | 24 | 2 |
| 5 | Watanabe | 30 | 2 | 2 | Suzuki | 24 | 2 |
| 1 | Sato | 23 | 1 | 3 | Takahashi | 28 | 5 |
| 2 | Suzuki | 24 | 2 | 3 | Takahashi | 28 | 5 |
| 3 | Takahashi | 28 | 5 | 3 | Takahashi | 28 | 5 |
| 4 | Tanaka | 26 | 3 | 3 | Takahashi | 28 | 5 |
| 5 | Watanabe | 30 | 2 | 3 | Takahashi | 28 | 5 |
| 1 | Sato | 23 | 1 | 4 | Tanaka | 26 | 3 |
| 2 | Suzuki | 24 | 2 | 4 | Tanaka | 26 | 3 |
| 3 | Takahashi | 28 | 5 | 4 | Tanaka | 26 | 3 |
| 4 | Tanaka | 26 | 3 | 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 | 4 | Tanaka | 26 | 3 |
| 1 | Sato | 23 | 1 | 5 | Watanabe | 30 | 2 |
| 2 | Suzuki | 24 | 2 | 5 | Watanabe | 30 | 2 |
| 3 | Takahashi | 28 | 5 | 5 | Watanabe | 30 | 2 |
| 4 | Tanaka | 26 | 3 | 5 | Watanabe | 30 | 2 |
| 5 | Watanabe | 30 | 2 | 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+----+-----------+------+------+












2012年8月22日水曜日

6.1 テーブルの結合


複数のテーブルを結合して、1つの表として扱うことができます。
結合にはいくつかの種類があります。

6.1.1 UNIONによる結合


UNIONを使うと、複数のSELECT文を繋いで、複数テーブルのレコードを
表示することができます。

SELECT 列名1 FROM テーブル名1 UNION SELECT 列名2 FROM テーブル名2;
たとえば、次のような2つのテーブルがあるとします。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
mysql> SELECT * FROM staff2;
+----+----------+------+------+
| id | name | age | bid |
+----+----------+------+------+
| 1 | Ito | 27 | 2 |
| 2 | Yamamoto | 31 | 1 |
| 3 | Nakamura | 24 | 4 |
+----+----------+------+------+
2つのテーブルのレコードを全部まとめて出力できます。

mysql> SELECT * FROM staff UNION SELECT * FROM staff2;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
| 1 | Ito | 27 | 2 |
| 2 | Yamamoto | 31 | 1 |
| 3 | Nakamura | 24 | 4 |
+----+-----------+------+------+

なお、それぞれのテーブルでキャラクタセットが異なると、UNIONを使う
ことができませんので注意してください。

6.1.2 内部結合


UNIONによる結合は、2つのテーブルを縦に結合しましたが、横に結合す
るには内部結合や外部結合を使います。まず、以下のような2つのテーブル
(staffとbranch)があるとします。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
mysql> SELECT * FROM branch;
+----+------------+
| id | branchname |
+----+------------+
| 1 | Tokyo |
| 2 | Yokohama |
| 3 | Osaka |
| 4 | Nagoya |
+----+------------+

staffテーブルのbid列とbranchテーブルのid列を関連づけて表示することを
内部結合と呼んでいます。

SELECT 列名1 FROM テーブル名1 [INNER] JOIN テーブル名2
ON テーブル名1.列名1 = テーブル名2.列名2;

次の例を見てください。「staff.bid = branch.id」により、それぞれの列が
関連づけられています。

mysql> SELECT * FROM staff JOIN branch ON staff.bid = branch.id;
+----+-----------+------+------+----+------------+
| id | name | age | bid | id | branchname |
+----+-----------+------+------+----+------------+
| 1 | Sato | 23 | 1 | 1 | Tokyo |
| 2 | Suzuki | 24 | 2 | 2 | Yokohama |
| 3 | Takahashi | 28 | 1 | 1 | Tokyo |
| 4 | Tanaka | 26 | 3 | 3 | Osaka |
| 5 | Watanabe | 30 | 2 | 2 | Yokohama |
+----+-----------+------+------+----+------------+
mysql> SELECT name,age,branchname FROM staff JOIN branch ON
staff.bid = branch.id;
+-----------+------+------------+
| name | age | branchname |
+-----------+------+------------+
| Sato | 23 | Tokyo |
| Takahashi | 28 | Tokyo |
| Suzuki | 24 | Yokohama |
| Watanabe | 30 | Yokohama |
| Tanaka | 26 | Osaka |
+-----------+------+------------+

なお、branchテーブルにある4つめのレコード(Nagoya)は、staffテーブ
ルにはないので表示されません。

2012年8月20日月曜日

5.2 データの検索(3)


5.2.5 出力レコード数の制限

表示するレコード数は、LIMITで指定できます。
SELECT 列名FROM テーブル名LIMIT 出力レコード数;
次の例では、出力レコード数を3に指定しています。

mysql> SELECT * FROM staff LIMIT 3;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
+----+-----------+------+------+

 5.2.6 ソート


ORDER BY句を使うと、任意の項目でソートして出力することができます。
デフォルトは昇順です。
SELECT 列名FROM テーブル名ORDER BY 順序指定;
次の例では、age列を昇順にソートして出力します。

mysql> SELECT * FROM staff ORDER BY age;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 4 | Tanaka | 26 | 3 |
| 3 | Takahashi | 28 | 1 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
DESCを指定すると、昇順ではなく降順でソートされます。

mysql> SELECT * FROM staff ORDER BY age DESC;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 5 | Watanabe | 30 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 2 | Suzuki | 24 | 2 |
| 1 | Sato | 23 | 1 |
+----+-----------+------+------+


5.2.7 ファイルへの出力

SELECT文の実行結果をファイルに出力することもできます。
SELECT 列名FROM テーブル名INTO OUTFILE 出力ファイル名;
次の例では、ファイルtest.txtに検索結果が出力されます。

mysql> SELECT * FROM staff INTO OUTFILE 'test.txt';

デフォルトでは、データベースファイルのあるディレクトリ(/var/lib/mysql以下など)に出力されます。

# cat /var/lib/mysql/testdb/test.txt
1 Sato 23 1
2 Suzuki 24 2
3 Takahashi 28 5
4 Tanaka 26 3
5 Watanabe 30 2

2012年8月17日金曜日

5.2 データの検索(2)

5.2.3 グループ化


列のデータが同じレコードをまとめることをグループ化といいます。グループ化はGROUP BY句を使います。
SELECT 列名FROM テーブル名GROUP BY グループ化する列名;
次の例では、bid列が同じレコードをグループ化して表示しています。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
mysql> SELECT * FROM staff GROUP BY bid;
+----+--------+------+------+
| id | name | age | bid |
+----+--------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 4 | Tanaka | 26 | 3 |
+----+--------+------+------+

この例では、bid列が共通しているレコードの中から1レコードだけが抽出
されています。グループ化は、次に述べる集合関数を使って、合計や平均
を計算する場合に使います。

5.2.4 集合関数


集合関数を使うと、抽出した結果を集計したり、検索条件にマッチしたレコ
ードの中から平均値や最大値を計算したりすることができます。集合関数に
は、表のようなものがあります。




主な集合関数

AVG(列名) 平均値を計算する
COUNT(列名) レコード数をカウントする
COUNT(DISTINCT 列名) 重複なしでレコード数をカウントする
MAX(列名) 最大値を調べる
MIN(列名) 最小値を調べる
SUM(列名) 合計を計算する

例を見てみましょう。次のようなテーブルを例に取ります。

mysql> SELECT * FROM members;
+-----------+----------+------+
| name | address | age |
+-----------+----------+------+
| Sato | Tokyo | 23 |
| Suzuki | Tokyo | 24 |
| Takahashi | Kanagawa | 28 |
| Tanaka | Kanagawa | 26 |
| Watanabe | Tokyo | 30 |
+-----------+----------+------+

addressごとにage列の合計を表示するには、SUM()関数を使います。

mysql> SELECT address,SUM(age) FROM members
GROUP BY address;
+----------+----------+
| address | SUM(age) |
+----------+----------+
| Kanagawa | 54 |
| Tokyo | 77 |
+----------+----------+

今度は、AVG()関数を使って平均を計算してみます。

mysql> SELECT address,AVG(age) FROM members
GROUP BY address;
+----------+----------+
| address | AVG(age) |
+----------+----------+
| Kanagawa | 27.0000 |
| Tokyo | 25.6667 |
+----------+----------+

COUNT()関数を使うとレコード数をカウントできます。

mysql> SELECT address,COUNT(name) FROM members
GROUP BY address;
+----------+-------------+
| address | COUNT(name) |
+----------+-------------+
| Kanagawa | 2 |
| Tokyo | 3 |
+----------+-------------+





2012年8月16日木曜日

5.2 データの検索

データの検索もSQL文で行います。

5.2.1 SELECT文の基本


データベース内のレコードを検索するには、SQLコマンドのSELECTを使い
ます。基本的な書式は次のとおりです。
SELECT 列名FROM テーブル名;
次の例では、staffテーブルのname列とage列を出力します。

mysql> SELECT name,age FROM staff;
+-----------+------+
| name | age |
+-----------+------+
| Sato | 23 |
| Suzuki | 24 |
| Takahashi | 28 |
| Tanaka | 26 |
| Watanabe | 30 |
+-----------+------+
列名に「*」を指定すると、すべての列が出力されます。

mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
+----+-----------+------+------+
列名を表示するときに、ASを使って別名を付けることもできます。

mysql> SELECT name as '名前' ,age as '年齢' FROM staff;
+-----------+--------+
| 名前| 年齢|
+-----------+--------+
| Sato | 23 |
| Suzuki | 24 |
| Takahashi | 28 |
| Tanaka | 26 |
| Watanabe | 30 |
+-----------+--------+


5.2.2 検索条件の指定

検索条件を指定するには、SELECTに続けてWHERE句を使います。
SELECT 列名FROM テーブル名WHERE 検索条件;
次の例では、age列が25未満のレコードを出力します。

mysql> SELECT * FROM staff WHERE age <= 25;
+----+--------+------+------+
| id | name | age | bid |
+----+--------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
+----+--------+------+------+
条件には、以下の表のような記号を利用することができます。


条件に指定できる記号
=   等しい
!=  等しくない
IN  いずれかが含まれる
ある文字列を含むレコードを検索したい場合は、LIKEで条件を指定します。
SELECT 列名FROM テーブル名WHERE 列名LIKE 条件;
次の例では、name列が「T」で始まるレコードを出力します。

mysql> SELECT * FROM staff WHERE name LIKE 'T%';
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 3 | Takahashi | 28 | 1 |
| 4 | Tanaka | 26 | 3 |
+----+-----------+------+------+


「%」は任意の文字列を表すワイルドカード文字です。「_」は任意の1文字
を表します。SQLでは「*」や「?」ではありませんので注意してください。
なお、「~以外」で検索したいときは、LIKEの代わりに「NOT LIKE」を使います。

mysql> SELECT * FROM staff WHERE name NOT LIKE 'T%';
+----+----------+------+------+
| id | name | age | bid |
+----+----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 5 | Watanabe | 30 | 2 |
+----+----------+------+------+







2012年8月15日水曜日

5.1 テーブルの作成と更新(2)


5.1.2 主キー

主キーを設定するには、CREATE TABLEコマンドを実行する際、データ型
の直後に「PRIMARY KEY」と指定します。次の例では、id列を主キーと
して設定しています。

mysql> CREATE TABLE staff (id SMALLINT PRIMARY
KEY, name VARCHAR(20), age TINYINT, bid SMALLINT);
どの列に主キーが設定されているかは、以下のようにして確認できます。

mysql> DESC staff;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | smallint(6) | NO | PRI | | |
| name | varchar(20) | YES | | NULL | |
| age | tinyint(4) | YES | | NULL | |
| bid | smallint(6) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+

key欄に「PRI」とあるフィールドが主キーです。

5.1.3 NOT NULL


レコードを識別するためのキーとして使いたい列にデータが入っていなけ
れば、困ったことになります。データの入力を必須とする列を指定するには、
NOT NULLを指定します。次の例では、id列への入力を必須としています。


mysql> CREATE TABLE staff (id SMALLINT NOT
NULL, name VARCHAR(20), age TINYINT, bid
SMALLINT);
DESCコマンドを使ってテーブルの情報を調べてみます。

mysql> DESC staff;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| id | smallint(6) | NO | | | || name | varchar(20) | YES | | NULL | || age | tinyint(4) | YES | | NULL | || bid | smallint(6) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+



id列のNull欄が「NO」になっているのが確認できます。「YES」となってい
る列は、値が格納されていなくてもかまわない、ということです。

5.1.4 レコードの追加


テーブルにレコードを追加するには、SQLコマンドのINSERTを使います。

INSERT INTO テーブル名[(列名1[, 列名2, ...])] VALUES
(値1[, 値2, ...]);
次の例では、staffテーブルにレコードを追加しています。

mysql> INSERT INTO staff VALUES ('1', 'Sato', '23', '1');
以下のように、複数のレコードをまとめて追加することもできます。

mysql> INSERT INTO staff VALUES ('2', 'Suzuki', '24', '2'), ('3', 'Takahashi', '28', '1');



もちろん、見やすいように、複数行に分けてもかまいません。

mysql> INSERT INTO staff VALUES
> ('2', 'Suzuki', '24', '2'),
> ('3', 'Takahashi', '28', '1');
次のようにすると、指定した列にのみ値を追加することができます。



mysql> INSERT INTO staff (id, name) VALUES
('9', 'Kobayashi');
mysql> SELECT * FROM staff;
+----+-----------+------+------+
| id | name | age | bid |
+----+-----------+------+------+
| 1 | Sato | 23 | 1 |
| 2 | Suzuki | 24 | 2 |
| 3 | Takahashi | 28 | 5 |
| 4 | Tanaka | 26 | 3 |
| 5 | Watanabe | 30 | 2 |
| 9 | Kobayashi | NULL | NULL |
+----+-----------+------+------+

値を指定しなかった列はNULLとなります。



2012年8月14日火曜日

5.1 テーブルの作成と更新


データベースにデータを登録するには、まずテーブルを作成する必要があります。

5.1.1 テーブルの作成


テーブルを作成するには、SQLコマンドのCREATE TABLEを使います。
CREATE TABLE テーブル名(列名データ型, 列名データ型,...);
各列には、挿入するデータの種類をデータ型で指定します。データ型から外
れたデータは挿入できません。適切なデータ型を使用することで、データの
整合性を高く保つことができます。
mysql> CREATE TABLE staff (id VARCHAR(4), name VARCHAR(20), age INT, bid VARCHAR(4));

SQLは「;」を行末としますので、以下のように複数行に分けて見やすくす
ることもできます。行末に「;」を入力するまで、続けて何行も入力するこ
とができます。その間、プロンプトは「-> 」に変更されます。

mysql> CREATE TABLE staff (
-> id VARCHAR(4),
-> name VARCHAR(20),
-> age INT, bid VARCHAR(4)
-> );

※途中で入力を取りやめたい場合は「¥c」と入力します。


MySQLでは、以下のデータ型を利用することができます。


MySQLのデータ型

カテゴリデータ型説明
数値TINYINT 1バイトの整数
SMALLINT 2バイトの整数
MEDIUMINT 3バイトの整数
INT 4バイトの整数
BIGINT 8バイトの整数
FLOAT 4バイトの浮動小数点数
DOUBLE 8バイトの浮動小数点数
BIT ビット列
日付・時刻DATE YYYY-MM-DD(1000-01-01~9999-12-31)
DATETIME YYYY-MM-DD HH:MM:SS(1000-01-01
00:00:00~9999-12-31 23:59:59)
TIME HH:MM:SS
TIMESTAMP YYYY-MM-DD HH:MM:SS(1970-01-01
00:00:01~2037-12-31 23:59:59)
YEAR YYYY(1901~2155)、YY(01~69、70~99)
文字列CHAR(L) 0~255文字の固定長文字列
VARCHAR(L) 0~65535文字の可変長文字列
TINYTEXT 255バイトまでの文字列(大文字小文字の区別なし)
TINYBLOB 255バイトまでの文字列(大文字小文字の区別あり)
TEXT 65535バイトまでの文字列(大文字小文字の区別なし)
BLOB 65535バイトまでの文字列(大文字小文字の区別あり)
MIDIUMTEXT 16777215バイトまでの文字列(大文字小文字の区別なし)
MIDIUMBLOB 16777215バイトまでの文字列(大文字小文字の区別あり)
LONGTEXT 4294967295バイトまでの文字列(大文字小文字の区別なし)
LONGBLOB 4294967295バイトまでの文字列(大文字小文字の区別あり)







2012年8月13日月曜日

4.3 MySQLとプログラミング言語の連携


プログラミング言語からMySQLに接続して利用するためには、そ
れぞれの言語に対応したライブラリが必要になります。

4.3.1 MySQLとPHPの連携

PHPは、Webアプリケーションの開発によく利用されるスクリプト言語で
す。各種データベースとのインターフェースが用意されているので、
MySQLをはじめとする各種データベースと簡単に連携できます。
CentOSをはじめとするLinuxディストリビューションでは、php-mysqlパッ
ケージをインストールすることでPHPとMySQLを連携させることができま
す。
# yum install php-mysql -y

4.3.2 MySQLとRubyの連携

RubyはWebアプリケーションをはじめ、さまざまな分野で利用できるスク
リプト言語です。RubyプログラムからMySQLを利用するためには、
MySQL/RubyかRuby/MySQLが必要です。MySQL/RubyはC言語で作られ
たライブラリで、MySQL標準のC APIとRubyとの仲介役を果たします。ま
た、Ruby/MySQLはRubyで作られたライブラリですが、最新のMySQLに対
応していないなど、MySQL/Rubyと比較して機能不足が目立ちます。
MySQL/Rubyは、RubyGemsを使ってインストールするのが一般的です。
あらかじめRubyGemsをインストール後、以下のコマンドでMySQL/Ruby
をインストールできます。


# gem install --remote mysql


2012年8月12日日曜日

4.2 MySQLの設定(2)

4.2.3 データベースユーザーパスワードの変更


データベースユーザーのパスワードは、SET PASSWORDコマンドを使って
変更できます。

SET PASSWORD FOR ユーザー名@ホスト名=password('新しいパスワード');

次の例では、student@localhostユーザーのパスワードを「newpass」に変更しています。

mysql> SET PASSWORD FOR student@localhost=password('newpass');


4.2.4 データベースユーザーの削除

データベースユーザーを削除するには、DROP USERコマンドを使います。
DROP USER ユーザー名@ホスト名;
次の例では、student@localhostユーザーを削除しています。
mysql> DROP USER student@localhost

なお、MySQL 5.0.2未満では、DROP USERコマンドを実行する前に、
REVOKEコマンドを使ってユーザーの権限を無効化する必要があります。
次の例では、testdbデータベースですべての権限が与えられているstudent
ユーザーの権限を無効化しています。

mysql> REVOKE ALL ON testdb.* from 'student'@'localhost';







2012年8月10日金曜日

4.2 MySQLの設定


MySQLに接続して利用するには、あらかじめデータベースユーザ
ーを作成しておく必要があります。デフォルトでは、管理者権限を
持つrootユーザーが用意されています。

4.2.1 新規データベースユーザーの作成

MySQLをインストールした直後の状態では、データベースユーザーはroot
ユーザーのみが登録されています。このrootユーザーは、システムアカウン
トのrootユーザーとは関係ないので注意してください。一般的に、MySQL
を利用する場合は、専用のユーザーを作成して利用します。管理者権限のあ
るrootユーザーを利用し続けることは、セキュリティ上好ましくないからで
す。

ユーザーの作成は、以下の書式で行います。

CREATE USER 'ユーザー名'@'ホスト名' IDENTIFIED BY 'パ
スワード';

次の例では、studentという名前のユーザーを作成しています。パスワード
は「himitu」を指定しています。

mysql> CREATE USER 'student'@'localhost'
IDENTIFIED BY 'himitu';

ただし、CREATE USERコマンドで作成されたユーザーには権限が設定され
ていないので、別途権限を設定する必要があります。そのため、GRANTコ
マンドを使って、ユーザーの作成と権限の設定を同時に行うのが一般的です。

GRANT 権限ON データベース名.テーブル名TO 'ユーザー名'@'ホ
スト名' IDENTIFIED BY 'パスワード';

次の例では、testdbデータベースのすべてのテーブルに対し、すべての権限
を与えてstudentユーザーを作成します。

mysql> GRANT ALL ON testdb.* TO 'student'@
'localhost' IDENTIFIED BY 'himitu';

データベースを指定しない場合は、ワイルドカード「*」を使ってください。
次の例では、すべてのデータベースに対して、SELECTコマンドとUPDATE
コマンドが利用できるユーザーstudentを作成します。

mysql> GRANT SELECT,UPDATE ON *.* TO 'student'@
'localhost' IDENTIFIED BY 'himitu';


なお、他のホストからネットワーク経由で利用したい場合は、ホスト名欄に
「%」を指定してください。

mysql> GRANT ALL ON testdb.* TO 'student'@'%'
IDENTIFIED BY 'himitu';

この場合、localhostからは接続できなくなるので、student@localhostでの
設定も別途必要です。

4.2.2 データベースユーザーへの権限設定


GRANTコマンドは、データベースユーザーの権限を設定するコマンドです。

GRANT 権限ON データベース名.テーブル名TO ユーザー名@ホスト名[IDENTIFIED BY 'パスワード'];

※ユーザーが存在しないと、そのユーザーを作成します。


権限には、表に示すような権限を指定することができます。

mysql> CREATE USER 'student'@'localhost'
IDENTIFIED BY 'himitu';



















2012年8月9日木曜日

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

MySQLでは複数のデータベースを同時に管理することができます。

4.1.1 データベースの作成


データベースを作成するには、SQLコマンドのCREATE DATABASEを使い
ます。
CREATE DATABASE データベース名;
次の例では、testdbという名前のデータベースを作成しています。
mysql> CREATE DATABASE testdb;

なお、データベースで日本語を扱う際には、キャラクタセットを指定してデ
ータベースを作成します。日本語のキャラクタセットには、utf8(UTF-8)、
eucjpms(EUC-JP)、cp932(シフトJIS)が指定できます。たとえば、キ
ャラクタセットをシフトJISにしてデータベースtestdbを作成するには、次
のように指定します。

mysql> CREATE DATABASE testdb CHARACTER SET
cp932;
なお、デフォルトのキャラクタセットはLatin-1です。

4.1.3 データベースの削除


作成済みのデータベースを削除するには、S Q L コマンドのD R O P
DATABASEを使います。
DROP DATABASE データベース名;
次の例では、testdbデータベースを削除しています。
mysql> DROP DATABASE testdb;

データベースを削除できるのは、削除できる権限を持っているユーザーだ
けです。削除時には確認メッセージもなく、ただちにデータベースは削除
されてしまいますので、誤って別のデータベースを削除してしまわないよ
う注意してください。



2012年8月7日火曜日

3.2 MySQLの基本操作(2)

3.2.2 MySQLクライアント

MySQLサーバに接続してコマンドラインで操作をするには、MySQLクライ
アントコマンドを使います。MySQLクライアントコマンドはmysqlコマン
ドによって起動します。
# mysql -u root -p
Enter password:
-uオプションの引数には接続するユーザー名を指定します。-pオプションを
指定すると、対話的にパスワードを尋ねられます。パスワードを正しく入
力すると、プロンプトが「mysql>」に変わります。
※-pオプションの直後にパスワードを指定することもできますが、
コマンド履歴に残ってしまうので、対話的に入力した方がよいでしょう。

# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or ¥g.
Your MySQL connection id is 2
Server version: 5.0.45 Source distribution
Type 'help;' or '¥h' for help. Type '¥c' to clear the buffer.
mysql>
プロンプト「mysql>」に続けて、mysqlコマンド用のコマンドを実行でき
ます。また、任意のSQLコマンドを実行したり、MySQL独自のSQLコマン
ドを実行することもできます。主なコマンドを表3-2にまとめます。

主なmysqlコマンド


  • \?、\h MySQLクライアントコマンドのコマンドを一覧を表示する
  • \q MySQLクライアントコマンドを終了する
  • \s MySQLサーバのステータスを表示する
  • \C 文字コード文字コードを変更する
  • USE データベース名; 指定したデータベースに接続する
  • SHOW DATABASES; データベース一覧を表示する
  • SHOW TABLES; テーブル一覧を表示する
  • DESCRIBE テーブル名; テーブルの定義内容を表示する


MySQLクライアント用のコマンドは、「\」+1文字のアルファベットで指
定されます。たとえば、MySQLモニタを終了するには「\q」を入力します。


mysql> \q
Bye

実は、「\q」は「quit」コマンドの省略形です。次のように、quitコマンド
を指定することもできます。その場合は、行末に「;」を付けてください。

mysql> quit;
Bye

すべてのMySQLクライアントコマンドは「\h」もしくは「\?」を実行する
と表示されます。また「help;」と入力しても同じです。

mysql> \h
For information about MySQL products and services, visit:
http://www.mysql.com/
For developer information, including the MySQL Reference Manual,
visit:
http://dev.mysql.com/
To buy MySQL Network Support, training, or other products, visit:
https://shop.mysql.com/
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
? (\?) Synonym for `help'.
clear (\c) Clear command.
connect (\r) Reconnect to the server. Optional arguments are db
and host.
delimiter (\d) Set statement delimiter. NOTE: Takes the rest of
the line as new delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h)Display this help.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to _ pager]. Print the query results via
PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an
argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to _ outfile]. Append everything into
given outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for
processing binlog with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
For server side help, type 'help contents'

3.2.3 データベースへの接続


MySQLサーバは、複数のデータベースを同時に扱うことができます。どの
ようなデータベースが存在するのかは、MySQLモニタ上で次のようにして
確認することができます。

mysql> SHOW DATABASES;
+------------------------+
| Database |
+------------------------+
| information _ schema |
| mysql |
| test |
+------------------------+
3 rows in set (0.01 sec)

「SHOW DATABASESコマンド」というMySQLコマンドを実行すると、結
果が表示されます。「information_schema」と「mysql」は、MySQLが内
部的に利用するデータベースです。「test」はデフォルトで用意されている
テスト用のデータベースです。

MySQLクライアントを起動した状態では、どのデータベースにも接続して
いません。データベースへ接続するには、USEコマンドを使います。次の
例では、testデータベースに接続しています。




mysql> USE test;
Database changed

現在使用中のデータベースを知るには、SELECT DATABASEコマンドを実
行します。

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| test |
+------------+
1 row in set (0.01 sec)




もし、どのデータベースにも接続していないのであれば、次のように表示
されます。

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)


「NULL」というデータベースに接続しているわけではないので注意してく
ださい。







2012年8月6日月曜日

3.2 MySQLの基本操作


MySQLサーバに対する操作には、コマンドラインで行うものと
GUIで行うものがあります。ここではコマンドラインによる操作を
取り上げます。

3.2.1 MySQLサーバの起動と終了

MySQLサーバを起動するには、起動スクリプトを使います。

# /etc/init.d/mysqld start
Starting MySQL: [ OK ]

デフォルトでは、MySQLサーバの管理者ユーザーにはパスワードが設定さ
れていないため、初回起動時には警告メッセージが表示されます。MySQL
の管理コマンドであるmysqladminコマンドを使って、パスワードを設定し
ておきましょう。「new-password」の部分は、任意のパスワードに置き換
えてください。
# mysqladmin -u root password 'new-password'

このrootユーザーは、システムのrootユーザーとは別ですので注意してくだ
さい。
MySQLサーバは3306番ポートを利用します。netstatコマンドを実行して、
3306番ポートが開かれているか確認できます。

# netstat -atn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN

MySQLサーバの動作は、mysqladminコマンドを使っても確認することが
できます。パスワードには、先ほど設定したパスワードを入力します。

# mysqladmin -u root -p ping
Enter password:
mysqld is alive

「mysqld is alive」と表示されれば、MySQLサーバは稼働しています。
MySQLサーバが稼働していない場合は、次のようなエラーメッセージが表
示されます。

# mysqladmin -u root -p ping
Enter password:
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/var/
lib/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/var/lib/mysql/
mysql.sock' exists!


起動スクリプトを使ってMySQLサーバの稼働状態を調べることもできます。
MySQLサーバが起動しているときは、PID(プロセスID)番号と「running...」
の文字が表示されます。

# service mysqld status
mysqld (pid 12116) is running...

MySQLサーバを停止するには、次のコマンドを実行します。

# /etc/init.d/mysqld stop
Stopping MySQL: [ OK ]


また、設定変更をするなどしてMySQLサーバの再起動が必要な場合は、次
のコマンドを実行します。

# /etc/init.d/mysqld restart
Stopping MySQL: [ OK ]
Starting MySQL: [ OK ]













2012年8月5日日曜日

3.1 MySQLのインストール


MySQLは、オープンソースのDBMSとしては、世界でもっとも広
く使われているソフトウェアです。

3.1.2 MySQLの概要


MySQLは、スウェーデンのMySQL AB社で開発されたリレーショナル・デ
ータベース管理システムです。1995年にバージョン1.0が登場し、現在はバ
ージョン5.1系(安定版)と5.4系(開発版)、最新機能を盛り込んだ6.0系(開
発版)が提供されています。

MySQL AB社は2007年にSun Microsystems社に買収され、以後はSun
MicrosystemsがMySQLの開発と提供を行ってきました。

MySQLの最大の特徴は「軽快さ」です。大規模なデータベースでも高速な
アクセスが可能ですが、その反面、古いバージョンでは他のRDBMSにある
ような機能が含まれていませんでした。しかし現在では標準的な機能を実装
し、かつ高速性も備えています。

Webアプリケーションの標準的なオープンソースプラットフォームとして
「LAMP」(Linux、Apache、MySQL、PHP/Perl/Python)という言葉があ
りますが、そこにMySQLが含まれているとおり、Webアプリケーションの
土台としても広く利用されてきています。

MySQLは、Linux、UNIX、Windowsをはじめ、20種類以上のOS上で実行
することができます。Linuxディストリビューションでは標準パッケージを
用意しているものも多く、手間をかけずに使い始めることができます。

3.1.3 RPMパッケージでのインストール(CentOS)


CentOSでは、MySQLのRPMパッケージが用意されていますので、yumコ
マンドを使ってインストールできます。どのようなMySQL関連のパッケー
ジがあるのかは、次のようにして調べることができます。



# yum search mysql
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.riken.jp
* updates: ftp.riken.jp
* addons: ftp.riken.jp
* extras: ftp.riken.jp
======================= Matched: mysql ========================
mod _ auth _ mysql.i386 : Basic authentication for the Apache web
server using a
: MySQL database.
qt-MySQL.i386 : MySQL drivers for Qt's SQL classes.
MySQL-python.i386 : An interface to MySQL
bytefx-data-mysql.i386 : MySQL database connectivity for Mono
freeradius-mysql.i386 : MySQL bindings for freeradius
libdbi-dbd-mysql.i386 : MySQL plugin for libdbi
mysql.i386 : MySQL client programs and shared libraries.
mysql-bench.i386 : MySQL benchmark scripts and data.
mysql-connector-odbc.i386 : ODBC driver for MySQL
mysql-devel.i386 : Files for development of MySQL applications.
mysql-server.i386 : The MySQL server and related files.
mysql-test.i386 : The test suite distributed with MySQL.
pdns-backend-mysql.i386 : MySQL backend for pdns
perl-DBD-MySQL.i386 : A MySQL interface for perl
php-mysql.i386 : A module for PHP applications that use MySQL
databases.
php-pdo.i386 : A database access abstraction module for PHP
applications
php-pear-MDB2-Driver-mysql.noarch : MySQL MDB2 driver
qt4-mysql.i386 : MySQL drivers for Qt's SQL classes
rsyslog.i386 : Enhanced system logging and kernel message
trapping daemons
rsyslog-mysql.i386 : MySQL support for rsyslog
unixODBC.i386 : A complete ODBC driver manager for Linux.

 主なMySQL関連パッケージを表にまとめます。


MySQL関連パッケージ

パッケージ名説明
mysql-server MySQLサーバ
mysql MySQLクライアントプログラムと共有ライブラリ
mysql-bench MySQLベンチマークプログラム
mysql-server 開発用パッケージ
mysql-connector-odbc ODBCドライバ
php-mysql PHPからMySQLを利用するためのモジュール
perl-DBD-MySQL PerlからMySQLを利用するためのインターフェース


MySQLサーバとMySQLクライアントをインストールするには、次のコマン
ドを実行します。

# yum install mysql mysql-server -y

MySQLがインストールされたかどうかは、次のコマンドで確認できます。

# rpm -qa | grep mysql
mysql-5.0.45-7.el5
mysql-server-5.0.45-7.el5




2012年8月4日土曜日

2.2 SQL


SQLは、リレーショナル・データベースにアクセスするためのデー
タベース言語です。SQLを使って、テーブルの作成・削除や、デー
タの検索・更新・削除といった作業ができます。

2.2.1 SQLの概要


SQLは、関係モデルに基づくデータベース言語で、ISOやANSI、JISによっ
て標準化されています。制定年度によって、SQL92(1992年)、SQL99(1999
年)、SQL:2003(2003年)などの規格があります。どのRDBMSでもSQLを
サポートしていますが、どのSQL規格を採用しているかはRDBMSによって
異なります。また、それぞれのRDBMSで独自の拡張を加えている場合もあ
りますので、注意が必要です。
SQLのコマンドは、機能によって「データ定義言語」「データ操作言語」「デ
ータ制御言語」の3つに分類することができます。

2.2.2 データ定義言語(DDL)


データ定義言語(DDL:Data Definition Language)は、データベースに
格納するデータの構造を定義します。DDLには次表のようなものがありま
す。



CREATE テーブルなどを作成する
ALTER テーブルなどの定義を変更する
DROP テーブルなどを削除する


2.2.3 データ操作言語(DML)


データ操作言語(DML:Data Manipuration Language)は、テーブル内
のデータの参照、更新・追加、削除などを行うための命令です。DMLには
次表のようなものがあります。


SELECT レコードを検索する
INSERT レコードを挿入する
UPDATE レコードを更新する
DELETE レコードを削除する


2.2.4 データ制御言語(DCL)


データ制御言語(DCL:Data Control Language)は、データベースのア
クセス権などを設定するための命令です。DCLには次表のようなものがあ
ります。


COMMIT トランザクションを確定する
ROLLBACK トランザクションを破棄する
GRANT 特定のユーザーに権限を与える
REVOKE ユーザーに与えた権限を削除する







2012年8月3日金曜日

2.1 リレーショナルモデル(2)

2.1.3 関係演算


データベースを検索して必要なデータを取り出すことを演算といいます。
演算には、関係演算と集合演算があります。

関係演算は、目的とするデータをテーブルから取り出す作業です。関係演
算には、射影、選択、結合があります。

テーブルから、指定した列だけを取り出すのが射影、指定した行だけを取
り出すのが選択です。次の例は、顧客名による射影と、顧客番号が2034の
行による選択を表しています。





















結合は、ある項目に基づいて2つ以上のテーブルを連結させる作業です。次
の例では、店舗コードに基づいて2つのテーブルを結合しています。




















2.1.4 集合演算

集合演算は、2つのテーブルからデータを取り出す演算です。すべてのデー
タを取り出す和演算、共通するデータを取り出す積演算、どちらか一方の
テーブルのみにあるデータを取り出す差演算があります。

例として、次のようなテーブルA、テーブルBがあるとしましょう。

和演算では、テーブルAとテーブルBにあるデータがすべて取り出せます。
2つのテーブルで重複する行は1行にまとめられます。

積演算では、テーブルAとテーブルBの双方に共通するデータが取り出せます。

差演算では、テーブルAとテーブルBの差分、たとえば以下の例では、テー
ブルAからテーブルBにあるものを引いたデータが取り出せます。







2.1 リレーショナルモデル


データベースにおけるデータの構造をモデル化したものをデータベ
ースモデルといいます。現在では、関係モデル(リレーショナルモ
デル)が主流となっています。

2.1.1 リレーショナルモデルとは


リレーショナルモデルでは、データ構造は表形式として見ることができま
す。













テーブルは列(フィールド、カラム、属性)と行(レコード)から構成さ
れます。本書では、「列」「レコード」と呼ぶことにします。

RDBでは、複数のテーブルのデータを関連づけて表現します。たとえば、
図2-1では、社員テーブルの部署IDと、部署テーブルの部署IDが対応してい
ます。このような対応関係をリレーションシップといいます。


2.1.2 主キー


テーブル内で任意のレコードを一意に識別できる列もしくは列の組のこと
を主キーといいます。主キーに必要な条件は次のとおりです。

・一意である(重複がない)
・必ず値が格納されている(NULL値がない)
・更新されない(値が不変)

たとえば、次の図を見てください。










このテーブルには、4つの列(社員番号、氏名、電話番号、携帯番号)があ
ります。これらの列のうち、氏名欄は同姓同名がいるので、主キーにはで
きません。電話番号も、同一世帯の社員では重複するので不適切です。携
帯番号は、携帯電話を持っていない人もいるので不適切です。社員番号が
重複なしに割り当てられているとすれば、主キーとして適切と考えられま
す。

主キーは複数の列を組み合わせてもかまいません。次の図では、出席番号
がクラス内で一意であるとするなら、クラス番号と出席番号を組み合わせ
て主キーとすることができます。複数の列を組み合わせたものを複合キー
といいます。













一般的に、「○○番号」「○○ID」「○○コード」といった列が主キーの候補
となるでしょう。




1.3 リレーショナル・データベース管理システムとOSSの実装


オープンソースとして実装されたリレーショナル・データベース管
理システムには、MySQL、PostgreSQL、Firebird、SQLiteな
どがあります。SQLiteをのぞき、クライアント/サーバ型の構成を
とります。

1.3.1 MySQL


MySQLは、スウェーデンのMySQL AB社で開発され、現在はSum
Microsystemsによって開発されているリレーショナル・データベース管理
システムです。1995年にバージョン1.0が登場し、現在はバージョン5.1系(安
定版)と5.4系(開発版)、最新機能を盛り込んだ6.0系(開発版)が提供さ
れています。機能よりも高速性と堅牢性を重視して発展してきましたが、現
在では機能においても他のRDBMSに劣らないものとなっています。オープ
ンソースのRDBMSとしては世界でもっとも普及しています。















MySQLはオープンソースとして開発されていますが、無償で利用できる
GPLライセンスと、有料のコマーシャルライセンスのデュアルライセンスを
採用しており、用途に合わせて選択できます。無償版は「M y S Q L
Community Server」、有償版は、一般的なDBサーバとして社内やASP等で
使われる「MySQL Enterprise」、組込み用途やアプライアンスとして使われ
る「MySQL エンベデッドデータベース」、高い可用性とスケーラビリティ、
パフォーマンスを備えた「MySQL Cluster」があります。有償版は開発元に
よってテストが行われたバイナリが採用されており、サポートも付属します。
日本では、MySQLのユーザーコミュニティとして日本MySQLユーザ会
http://www.mysql.gr.jp)があり、メーリングリストを中心に活動してい
ます。


◆MySQL公式サイト
http://www.mysql.com
◆MySQL日本語サイト
http://www-jp.mysql.com
◆MySQLユーザ会
http://www.mysql.gr.jp

1.3.2 PostgreSQL


PostgreSQLは、PostgreSQL Global Development Groupによって開発さ
れているリレーショナル・データベース管理システムです。商用データベ
ース並みの充実した機能を持っており、特に日本国内では商用システムに
おいて広く利用されています。




日本では、PostgreSQLのユーザーコミュニティとしてPostgreSQLユーザー
会(http://www.postgresql.jp/)があります。

◆PostgreSQL公式サイト
http://www.postgresql.org/
◆PostgreSQLユーザー会
http://www.postgresql.jp/

1.3.3 Firebird



Firebirdは、商用RDBMSのInterBaseから派生したリレーショナル・データ
ベース管理システムです。Mozilla Public Licenseに近いInterBase Public
L i c e n s e に基づいてオープンソースで開発されており、M y S Q L 、
PostgreSQLに次ぐオープンソースRDBMSとして注目されています。

◆公式サイト
http://www.firebirdsql.org/
◆Firebird日本ユーザー会
http://firebird.gr.jp/


1.3.4 SQLite


SQLiteは、アプリケーションに組み込んで利用される形態の簡易RDBMSで、
クライアント/サーバ型ではなくライブラリとして提供されます。PHPや
Pythonでは標準ライブラリに組み込まれており、プログラムから簡単に利
用することができます。

◆SQLite公式サイト
http://www.sqlite.org/

1.3.5 商用RDBMSとオープンソースのRDBMS


よく知られた商用RDBMS製品としては、Oracle社のOracle Database、
Microsoft社のSQL Server、IBM社のDB2などがあります。いずれも有償の
製品であり、ベンダーによるサポートが付属しています。

これらの商用RDBMSと比較して、オープンソースのRDBMSは何が違うの
でしょうか。おそらく一般的な用途では、機能面でオープンソースの
RDBMSが大きく劣るということはなくなってきています。サポートに関し
ても、オープンソースのRDBMSをサポートしているサードパーティベンダ
ー*がありますから、有償でサポートを受けることは可能です。比較的大規
模なデータベースにも、オープンソースRDBMSを適用することができます。

ただ、パフォーマンスやスケーラビリティについては商用製品に利があるこ
とが多いでしょう。もちろん、パフォーマンスチューニングを施すことによ
ってオープンソースRDBMSの性能を高めることはできますが、そのための
ノウハウが十分に提供されているとは言えない状況があります。パフォーマ
ンスチューニングをせずにオープンソースRDBMSを導入し、「やはり無料
のソフトウェアは使えない」と判断されるケースも耳にします。オープンソ
ースRDBMSを導入する場合は、その特徴を理解し、性能を十分に発揮でき
るように工夫しなければならないこともあります。

また、実務で利用する場合は、協力会社が必要なスキルを持っているか、教
育・研修体制が十分か、開発ツールが対応しているか、他のシステムとの親
和性はあるか、技術情報が豊富に存在するか、といったことも重要になって
きます。

RDBMSを導入する場合は、そのような点を考慮し、オープンソースを採用
するのか、商用製品を採用するのかを決定する必要があるでしょう。
*MySQLの場合は開発元である






1.2 データベース管理システム


データベースを運用・管理し、データへのアクセス要求に応答する
ソフトウェアをデータベース管理システム(DBMS:DataBase
Management System)といいます。データベースへデータを格
納したり、データを検索したりする機能は、DBMSによって提供さ
れます。

1.2.1 DBMSの機能

DBMSの主な機能として、トランザクション管理、排他制御、障害回復があ
ります。
◆トランザクション管理
銀行の口座送金処理を例に取りましょう。Aさんの口座からBさんの口座へ1
万円を送金するとします。この処理は、
①Aさんの口座残高を1万円減らす
②Bさんの口座残高を1万円増やす
という2つの処理に分けることができます。しかし、㈰の処理が完了した時
点でシステムエラーが起きたとするとどうなるでしょう。Aさんの口座は1
万円引かれ、Bさんの口座はそのままなので、1万円が消えてしまいます。
つまり、これら2つの処理は、どちらかが欠けると整合性が取れなくなって
しまうわけです。そのような分割不可の処理単位をトランザクションといい
ます。正常にトランザクションが完了したときはデータベースが更新されま
すが、途中で失敗した場合はデータベースに反映されません。そのようにし
てデータベースの整合性を維持するのがトランザクション管理です。

◆排他制御
複数のユーザーが同時に一つのデータにアクセスし、別々の更新処理をかけ
るとデータに矛盾が発生してしまいます。そのようなことを防ぐのが排他制
御機能です。あるユーザーがデータにアクセスしたときにデータベースにロ
ックをかけ、他のユーザーが利用できないようにします。ロックには、デー
タの参照と更新をともにロックする「占有ロック」と、データの更新だけを
ロックする「共有ロック」があります。

◆障害回復
ハードウェアやソフトウェアに障害が発生しても、データベースの内容を復
旧する機能が障害回復機能です。障害回復処理には、ロールフォワードとロ
ールバックがあります。
DBMSは、データベースに対して更新処理が行われると、その内容をログフ
ァイル(ジャーナル)に保存します。障害が発生したとき、データベースの
バックアップに加えて、ログファイルに記録されている処理を再現し、障害
が発生する直前の状態まで復旧させるのがロールフォワードです。一方、障
害が発生したとき、バックアップ時点までデータを巻き戻してから改めて処
理を開始することをロールバックといいます。

1.2.2 アプリケーションからのデータベースの利用

アプリケーションでデータベースを利用する際の処理の流れを図に示しま
す。












アプリケーションからはDBMSに対して指示を与えます。DBMSは指示を解
釈し、OS上にあるデータベースのファイルにアクセスし、結果をアプリケ
ーションに返します。このように、DBMSはアプリケーションとデータベ
ースとの仲介役を果たしています。



1.1 データベース


データベースとは、構造化された電子データの集合です。単なるデ
ータの集まりではなく、相互に関連するデータを整理・統合し、検
索性を考慮して構造化しています。


1.1.1 データベース利用のメリット

さまざまな業務システムやWebアプリケーションにおいては、データベー
スを利用しないものよりも利用するものの方がずっと多いでしょう。現在
のアプリケーション開発では、データベースは不可欠なものとなってきて
います。
アプリケーションでデータを扱うには、たとえばファイルに独自フォーマ
ットでデータを記録する処理をアプリケーションごとに用意する方法もあ
りますが、そういった方法と比較して、データベースを利用するメリット
には、次のようなものがあります。
・データの一元管理
複数のファイルやホストにデータが分散せず、一カ所で一元管理すること
ができます。
・データの共有
複数のアプリケーション、複数のユーザーでデータを安全に共有できます。
・処理とデータの分離
データへアクセスするアプリケーションと、データそのものとを分離する
ことで、保守が容易になります。
・データを関連づけて格納
複数のデータを相互に関連づけて格納し、検索することができます。
・登録するデータへの制約付与
ある項目には数値のみ、ある項目には20文字以内の文字列しか登録でき
ないなど、制約を付けることができます。
・データの整合性確保
データの一貫性を確保することができます。
・複数のデータアクセス同時処理
複数のアプリケーションから複数のデータへ同時にアクセスしても、同時
に処理をさばくことができます。
・データの安全な格納
アクセス権限を設定し、機密性を確保しやすくなっています。

1.1.2 データベースの種類


データベースの論理的なデータ構造を論理データモデルといいます。論理
データモデルには、階層型データベース、ネットワーク型データベース、
リレーショナル・データベース、オブジェクト指向データベースなどがあ
ります。
◆階層型データベース
データをツリー構造として格納するモデルです。親となるデータが複数の子
データを持つことができ、子データには必ず親データが存在します。
◆ネットワーク型データベース
データをネットワーク構造として格納するモデルです。
◆リレーショナル・データベース
データ構造を二次元の表を使って表します。表と表との間には関連づけ(リ
レーションシップ)を行うことで、複雑なデータ構造も表現できます。現在
主流となっている形式のデータベースです。
◆オブジェクト指向データベース
オブジェクト指向の概念(カプセル化、クラス、継承など)を取り入れてお
り、データをオブジェクトとして格納できます。そのため、オブジェクト指
向プログラミング言語での開発がスムーズになります。