pet
テーブルでは飼っているペットのデータを管理しています。ペットに関するその他の情報、たとえば獣医に通った回数や出産した日など、その一生に発生するイベントなどを記録する場合は、別のテーブルを作成する必要があります。このテーブルはどのような構成でしょうか。このテーブルに必要なカラムを以下に示します。
各イベントがどのペットに関連するものかを示すためのペット名
イベント発生日時
イベントについての説明
イベントをカテゴリ別に分類できるようにする場合は、イベントの種類
これらの検討事項を踏まえ、event
テーブルの CREATE TABLE
ステートメントは以下のようになります。
mysql>CREATE TABLE event (name VARCHAR(20), date DATE,
->type VARCHAR(15), remark VARCHAR(255));
pet
テーブルの場合と同じように、情報を記述したタブ区切りのテキストファイルを作成して初期レコードをロードするのが最も簡単です。
name | date | type | remark |
Fluffy | 1995-05-15 | litter | 4 kittens, 3 female, 1 male |
Buffy | 1993-06-23 | litter | 5 puppies, 2 female, 3 male |
Buffy | 1994-06-19 | litter | 3 puppies, 3 female |
Chirpy | 1999-03-21 | vet | needed beak straightened |
Slim | 1997-08-03 | vet | broken rib |
Bowser | 1991-10-12 | kennel | |
Fang | 1991-10-12 | kennel | |
Fang | 1998-08-28 | birthday | Gave him a new chew toy |
Claws | 1998-03-17 | birthday | Gave him a new flea collar |
Whistler | 1998-12-09 | birthday | First birthday |
これらのレコードをロードします。
mysql> LOAD DATA LOCAL INFILE "event.txt" INTO TABLE event;
pet
テーブルに対して実行したクエリから学習した内容を参考にすれば、event
テーブルからもさまざまなデータを取得できます。基本的な考え方は同じです。ただし、event
テーブルだけでは質問に回答できない場合があります。それはどのような場合でしょうか。
それぞれのペットが出産したときの年齢を調べる場合を考えます。すでに
2
つの日付から年齢を計算する方法については説明しました。母親の出産日は
event
テーブルに格納されていますが、その日の母親の年齢を調べるには母親の誕生日が必要です。この誕生日は
pet
テーブルに格納されています。このことは、クエリで
2
つのテーブルを参照する必要があることを意味します。
mysql>SELECT pet.name,
->(YEAR(date)-YEAR(birth)) - (RIGHT(date,5)<RIGHT(birth,5)) AS age,
->remark
->FROM pet, event
->WHERE pet.name = event.name AND type = "litter";
+--------+------+-----------------------------+ | name | age | remark | +--------+------+-----------------------------+ | Fluffy | 2 | 4 kittens, 3 female, 1 male | | Buffy | 4 | 5 puppies, 2 female, 3 male | | Buffy | 5 | 3 puppies, 3 female | +--------+------+-----------------------------+
このクエリについては、注目すべき点がたくさんあります。
このクエリは 2
つのテーブルから情報を取得する必要があるので、FROM
節にはそれら 2
つのテーブル名を列挙している。
複数のテーブルの情報を組み合わせる(結合する)場合、一方のテーブルのレコードともう一方のテーブルのレコードを一致させる方法を指定する必要がある。どちらのテーブルにも
name
カラムがあるので、これは簡単に指定できる。このクエリでは、WHERE
節で name
の値を使用して 2
つのテーブルのレコードを一致させている。
name
カラムはどちらのテーブルにも存在するので、そのカラムを参照する場合はどちらのテーブルのカラムかを指定する必要がある。テーブルを指定するには、カラム名の前にテーブル名を前置する。
結合を実行する場合、必ずしも 2
つの異なるテーブルを使用する必要はありません。テーブルのレコードを同じテーブルのほかのレコードと比較する場合には、テーブルをそれ自体と結合させると便利です。たとえば、ペットの中で繁殖させる組み合わせを探す場合、pet
テーブルをそれ自体と結合させて、同種のオスとメスの組み合わせの候補を取得することができます。
mysql>SELECT p1.name, p1.sex, p2.name, p2.sex, p1.species
->FROM pet AS p1, pet AS p2
->WHERE p1.species = p2.species AND p1.sex = "f" AND p2.sex = "m";
+--------+------+--------+------+---------+ | name | sex | name | sex | species | +--------+------+--------+------+---------+ | Fluffy | f | Claws | m | cat | | Buffy | f | Fang | m | dog | | Buffy | f | Bowser | m | dog | +--------+------+--------+------+---------+
このクエリでは、カラムを参照するために、テーブル名にエイリアスを指定して、それぞれのカラムの参照が、どちらのテーブルインスタンスと関連付けられているかをはっきりわかるようにしています。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.