Windows+Apache+PHP+PostgreSQLによるWebアプリケーション
−入門編−

第6章 PostgreSQLによるWebアプリケーションの基礎

前へ | 目次へ |次へ  | YCポータルサイト

6.15 テーブル結合と相関名

■自然結合(NATURAL JOIN)

 データの正規化により作成されたテーブルは冗長性のない合理的な構造となりますが、逆に人間にはわかりにくいものとなっています。そこで、実際の利用では、正規化により分割されたテーブルを結合して、わかりやすく表示します。これを表結合といいます。

次のテーブル「tbl_売上明細」とテーブル「tbl_商品1」を例にとります。

「tbl_売上明細」
+------------+------------+------+
| 伝票コード | 商品コード | 個数 |
+------------+------------+------+
| 1101    | 100     |  100|
| 1101    | 110     |  150|
| 1120    | 100     |   30|
| 1120    | 120     |   80|
| 1128    | 130     |  100|
+------------+------------+------+

「tbl_商品1」
+------------+--------------+------+
| 商品コード | 商品名    | 単価 |
+------------+--------------+------+
| 100     | チョコレート | 200 |
| 110     | キャンディ  | 300 |
| 120     | せんべい   | 250 |
| 130     | ケーキ    | 400 |
| 140     | ガム     | 100 |
+------------+--------------+------+

 テーブル「tbl_売上明細」には「商品コード」はありますが、第2正規化を行っているので、商品名は別途テーブル「tbl_商品1」を参照しないとわかりません。たとえば、テーブル「tbl_売上明細」の「商品コード」='100'の商品名は、「tbl_商品1」の「商品コード」='100'のレコードの「商品名」を参照して、「チョコレート」であることがわかります。テーブル「tbl_売上明細」の「商品コード」フィールドのとなりに、「商品名」フィールドがあると、人間にとってわかりやすくなります。そこで、テーブル「tbl_売上明細」とテーブル「tbl_商品1」を結合させることを考えます。

 テーブルを結合する第1の方法は、自然結合のための「NATURAL JOIN」句を使う方法です。

SELECT * FROM テーブル1 NATURAL JOIN テーブル2

 自然結合では、テーブル1とテーブル2両方のテーブルにおのおの同じフィールド名がある必要があります。上のテーブルの例ではフィールド名「商品コード」が両方のテーブルにあることがわかります。その同じフィールド名の同じフィールド値を持つレコードどうしを結合します。

 サンプルファイル「natural_join.php」を以の下に示します。

「natural_join.php」

<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>natural_join.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 処理対象テーブル
$tbl_name1 = "tbl_売上明細";
print "「{$tbl_name1}」<br>";
show_records($db,$tbl_name1);
print "<br>\n";
$tbl_name2 = "tbl_商品1";
print "「{$tbl_name2}」<br>";
show_records($db,$tbl_name2);
print "<br>\n";

// 自然結合(NATURAL JOIN句)
$str_sql = "SELECT * FROM {$tbl_name1}
       NATURAL JOIN {$tbl_name2};
";
$rs = pg_query($db,$str_sql);
print "SQL = \"{$str_sql}\";<br>\n";
show_rs($rs);
print "<br>\n";

// 結果リソースの開放
pg_free_result($rs);
// データベースの切断
pg_close($db);
?>
</body>
</html>

サンプルファイルへのアクセス例を下記に示します。

■内部結合(INNER JOIN)

 テーブルを結合する第2の方法は、内部結合のための「INNER JOIN」句を使う方法です。

SELECT * FROM テーブル1 INNER JOIN テーブル2
   ON 結合条件式

 「INNER JOIN」では、「ON」の後に2つのテーブルを結合するための結合条件式を記述する必要があります。一般にはテーブル1のフィールド名1とテーブル2のフィールド名2が等しいレコードを結合する場合には結合条件式は次のようになります。

ON テーブル1.フィールド名1 = テーブル2.フィールド名2

  サンプルファイル「inner_join.php」を以の下に示します。

「inner_join.php」

<?php
// インクルードファイルの読み込み
include "common_pgsql.php";
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>inner_join.php for PostgreSQL8.0</title>
</head>
<body>
<?php
// データベースに接続
$db = db_connect($dbname);
// 処理対象テーブル
$tbl_name1 = "tbl_売上明細";
print "「{$tbl_name1}」<br>";
show_records($db,$tbl_name1);
print "<br>\n";
$tbl_name2 = "tbl_商品1";
print "「{$tbl_name2}」<br>";
show_records($db,$tbl_name2);
print "<br>\n";

// 内部結合(INNER JOIN句)
$str_sql = "SELECT * FROM {$tbl_name1}
      INNER JOIN {$tbl_name2}
      ON {$tbl_name1}.商品コード
       = {$tbl_name2}.商品コード;
";
$rs = pg_query($db,$str_sql);
print "SQL = \"{$str_sql}\";<br>\n";
show_rs($rs);
print "<br>\n";

// 結果リソースの開放
pg_free_result($rs);
// データベースの切断
pg_close($db);
?>
</body>
</html>

 サンプルファイルへのアクセス例を下記に示します。

 「INNER JOIN」の場合は、結合条件を明示的に記述するので、両方のテーブルで比較するフィールド名が異なっていても結合することができます。たとえば、上の例で、「tbl_売上明細」テーブルの「商品コード」フィールド名が「商品ID」の場合は、次のような条件式を記述すればいいことになります。

$str_sql1 = "SELECT * FROM {$tbl_name1}
       INNER JOIN {$tbl_name2}
       ON {$tbl_name1}.商品ID
        = {$tbl_name2}.商品コード
;";

■左外部結合(LEFT OUTER JOIN)

 テーブルを結合する第3の方法は、左外部結合のための「LEFT OUTER JOIN」句を使う方法です。

SELECT * FROM テーブル1 LEFT OUTER JOIN テーブル2
   ON 結合条件式

 内部結合では、結合条件式に合致するレコードのみが結合して参照されます。それに対して、外部結合では、どちらかのテーブルのレコードはすべて表示されます。

 FROM句の後に記述されているテーブル1のレコードをすべて参照する結合方法を左外部結合といいます。それに対して、JOIN句の後に記述されているテーブル2のレコードをすべて参照する結合方法を右外部結合といいます。つまりSQL文で先に(左側に)記述されているテーブルのすべてのレコードを参照する場合を左外部結合といっているのです。

 SQL文のサンプルを下記に示します。サンプルファイル「inner_join.php」でSQL文のみを下記に置き換えたサンプルファイルを「left_join.php」とします。

「left_join.php」のSQL文

// 左外部結合(LEFT OUTER JOIN句)
$str_sql = "SELECT * FROM {$tbl_name1}
      LEFT OUTER JOIN {$tbl_name2}
      ON {$tbl_name1}.商品コード
       = {$tbl_name2}.商品コード;
";

 サンプルファイルへのアクセス例を下記に示します。

■右外部結合(RIGHT OUTER JOIN)

 テーブルを結合する第4の方法は、右外部結合のための「RIGHT OUTER JOIN」句を使う方法です。

SELECT * FROM テーブル1 RIGHT OUTER JOIN テーブル2
   ON 結合条件式

 右外部結合では、SQL文で右側に記述されたテーブル2のレコードは、テーブル1の状態いかんにかかわらずすべて参照されます。

 SQL文のサンプルを下記に示します。サンプルファイル「left_join.php」でSQL文のみを下記に置き換えたサンプルファイルを「right_join.php」とします。

「right_join.php」のSQL文

// 右外部結合(RIGHT OUTER JOIN句)
$str_sql = "SELECT * FROM {$tbl_name1}
      RIGHT OUTER JOIN {$tbl_name2}
      ON {$tbl_name1}.商品コード
       = {$tbl_name2}.商品コード;";

 サンプルファイルへのアクセス例を下記に示します。

 最後のレコードに対応する商品コード='140'のレコードは左のテーブル「tbl_売上明細」にはありませんが、右のテーブル「tbl_商品1」にはあるので、右外部結合の結果セットには表示されているのがわかります。なお、対応する「tbl_売上明細」の「伝票コード」と個数のフィールド値はNULL値が表示されます。

■SELECT文によるテーブルの結合

 テーブルを結合する第5の方法は、SELECT文を使う方法です。SELECT文で自然結合を行うには、以下の構文を使います。

SELECT   テーブル1.フィールド名1, テーブル1.フィールド名2, ・・・,テーブル1.フィールド名m,
        テーブル2.フィールド名1, テーブル2.フィールド名2, ・・・,テーブル2.フィールド名n,
  FROM  テーブル1, テーブル2
  WHERE テーブル1.フィールド名x = テーブル2.フィールド名y

 複数のテーブルのフィールド名を混在して使用する場合は、どのテーブルのどのフィールド名かが分かるように、「テーブル名.フィールド名」のようにテーブル名とフィールド名を「.」(半角ピリオド)で結合した表記を使います。

 FROM句には結合する複数のテーブル名を「,」(カンマ)で区切って記述します。結合条件式は、WHERE句の中に記述します。

 SQL文のサンプルを下記に示します。サンプルファイル「right_join.php」でSQL文のみを下記に置き換えたサンプルファイルを「select_join.php」とします。

「select_join.php」のSQL文

// SELECT文による結合
$str_sql = "SELECT {$tbl_name1}.伝票コード,
          {$tbl_name1}.商品コード,
          {$tbl_name1}.個数,
          {$tbl_name2}.商品名,
          {$tbl_name2}.単価
      FROM {$tbl_name1}, {$tbl_name2}
      WHERE {$tbl_name1}.商品コード = {$tbl_name2}.商品コード;
";

 サンプルファイルへのアクセス例を下記に示します。

■相関名

 フィールド名を「テーブル名.フィールド名」と記述する方法では、表記が長くわかりづらくなるので、「相関名」を使ってより簡単に表記することができます。相関名とはたとえば、テーブル「tbl_売上明細」を1文字のアルファベット「M」で表記するような方法です。相関名は、FROM句内で、テーブル名の後に半角スペース1個以上で区切って相関名となるアルファベットを挿入することで定義します。

FROM テーブル名1 相関名1, テーブル名2 相関名2

 相関名を使ったSQL文のサンプルを下記に示します。サンプルファイル「select_join.php」でSQL文のみを下記に置き換えたサンプルファイルを「select_alias_join.php」とします。

「select_alias_join.php」のSQL文

// SELECT文による結合(相関名の使用)
$str_sql = "SELECT M.伝票コード,
          M.商品コード,
          M.個数,
          S.商品名,
          S.単価
      FROM {$tbl_name1} M, {$tbl_name2} S
      WHERE M.商品コード = S.商品コード;
";

 サンプルファイルへのアクセス例を下記に示します。

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2005年11月2日