今回は「T01Prefectureテーブル」と「T00Areaテーブル」を結合して、まるで一つのテーブルのように表示してみます。
テーブルの結合には同じ値のフィールド同士を使います。結合に使われる「AREA_CD」のようなフィールドをキーと言います。
SELECT * FROM T01Prefecture;
SELECT * FROM T00Area;
結合の種類には、内部結合(インナージョイン)、外部結合(アウタージョイン)、自己結合(セルフジョイン)、交差結合(クロスジョイン)、和結合(ユニオン)などがあります。
今回は最もよく使われる内部結合(インナージョイン)を試してみましょう。内部結合は等結合とも言い、両方のテーブルにあるキーが一致したレコードだけが表示されます。
MySQLに接続するユーザーは「pgtop」ですので、間違えないように気を付けてください。
【1】以下の図を参考にMySQLを開始・接続します。
1.コマンドプロンプトを起動します。
2.「net start mysql」と入力し、「Enterキー」を押します。
3.「mysql -u pgtop -p -b」と入力し、「Enterキー」を押します。
4.パスワードを求められるので「12345」入力し、「Enterキー」を押します。
*「-b」オプションを付けて起動するとビープ音が出なくなります。
【2】以下のSQL文を入力し、使用するデータベースを選択します。
USE SampleDB040;
【3】テーブルを内部結合します。以下のSQL文を入力し、「Enterキー」を押します。
SELECT PREF_CD,PREF_NAME,T01Prefecture.AREA_CD,AREA_NAME
FROM T01Prefecture INNER JOIN T00Area
ON T01Prefecture.AREA_CD = T00Area.AREA_CD;
【4】両方のテーブルにあるキーが一致したレコードが表示されます。
この例では NULL や 片方にだけあるデータは無いので、全件表示されます。
【5】以下のSQL文でもまったく同じ結果になります。WHERE句を使いフィールドのデータが同じレコードを抽出しています。等結合という感じがしますね。
SELECT PREF_CD,PREF_NAME,T01Prefecture.AREA_CD,AREA_NAME
FROM T01Prefecture, T00Area
WHERE T01Prefecture.AREA_CD = T00Area.AREA_CD;
*「INNER JOIN」は結合するテーブル数が増えると複雑になるので、「WHERE」を使ったほうがシンプルです。
【6】テーブルを結合して、さらにレコードを絞り込みたいときは「AND」を使い抽出条件を続ければ簡単にできます。「AND」は複数使うことができます。
SELECT PREF_CD,PREF_NAME,T01Prefecture.AREA_CD,AREA_NAME
FROM T01Prefecture, T00Area
WHERE T01Prefecture.AREA_CD = T00Area.AREA_CD
AND PREF_CD BETWEEN 1 AND 7;
【7】以下の図を参考にMySQLを終了・停止します。
1.「exit」と入力し、「Enterキー」を押します。
2.「net stop mysql」と入力し、「Enterキー」を押します。
【8】コマンドプロンプトは閉じてください。
【解説】
(1)AREA_CDのようなフィールドをキーといいますが、テーブルによって役割が異なっています。
・T00AreaのAREA_CDは主キー 重複できずレコードを一意に特定できる
・T01PrefectureのAREA_CDは外部キー 重複でき他のテーブルと結合するために使う
(2)テーブルを結合する時、両方に同じ名前のフィールドがある場合は、「テーブル名.フィールド名」の形で書かなければなりません。そうしないとどちらのテーブルのフィールドなのかコンピュータが判断できないからです。
T01Prefecture.AREA_CD
T00Area.AREA_CD
あらかじめ別の名前を付けておけばフィールド名だけでかまいませんので、SQL文がシンプルになります。
P_AREA_CD
A_AREA_CD
またはFROMでテーブルに別名をつける方法もあります。
SELECT PREF_CD,PREF_NAME,P.AREA_CD,AREA_NAME
FROM T01Prefecture P, T00Area A
WHERE P.AREA_CD = A.AREA_CD
AND PREF_CD BETWEEN 1 AND 7;