SQLの基本(その2)
テーブルの結合
本連載の第1回(http://thinkit.jp/article/1042/1/)で、「結合」について解説しました。結合とは、複数のテーブルを結びつけて、データを取り出す手法のことです。
テーブルの結合にも、SELECT文を使います。FROM句の部分に結合対象のテーブル名をすべて並べ、WHERE句に結合の条件を書きます。
ここで、複数のテーブルを操作する場合に、同じ名前の列が複数のテーブルに存在することがあります。このような場合、列名を指定する個所を「テーブル名.列名」のように書いて、操作の対象となるテーブルを明示します。
図2-1の上半分のように、item(商品)とmaker(メーカー)の2つのテーブルがあるとします。itemテーブルの「maker_id」列が、各商品のメーカーのID(makerテーブルの「id」列)を指しています。
これらの列を使って2つのテーブルを結合し、商品の名前(itemテーブルのname列)と、メーカー名(makerテーブルのname列)を取り出してみましょう。
まず、「SELECT」の命令の後に、取り出す列の名前を書きます。item/makerの両テーブルから同名の「name」という列を取り出すので、列名の前にそれぞれのテーブル名をつけて、「item.name, maker.name」と書きます。
次にFROM句を作ります。item/makerの2つのテーブルを扱うので、FROM句は「FROM item, maker」となります。
また、2つのテーブルを結合する条件は、「itemテーブルのmaker_id列と、makerテーブルのid列が等しい」です。ただ、「id」という名前の列はitemテーブルにもあるので、「makerテーブルのid列」は、「maker.id」と書いて、テーブルを明示する必要があります。
ここまでの話に基づいて、必要なデータを取り出すSELECT文を作ると、以下のようになります。
---------------------------------------------------
SELECT item.name, maker.name
FROM item, maker
WHERE maker_id = maker.id
---------------------------------------------------
内部結合と外部結合
テーブルを結合する際に、結合相手がない行が出てくることがあります。
例えば、図2-2の上半分のように、itemとmakerの2つのテーブルがあるとします。itemテーブルでid列が301番の行では、maker_id列が1003になっています。一方、makerテーブルには、id列が1003の行はありません。したがって、id列が301番の商品には、対応するメーカーがない(=結合相手がない)状態です(図2-2の下半分)。
ここで、itemテーブルとmakerテーブルを単純に結合すると、itemテーブルのidが301番の行は、結合結果には出力されません。このような結合のことを、「内部結合」と呼びます。
しかし、場合によっては、結合相手がない行も、結果に出力したいことがあります。このためには、「外部結合」という結合を使います。
外部結合には、「左外部結合」と「右外部結合」の2種類があります。2つのテーブルを左右に並べたと考え、左側のテーブルの行を、結合相手がなくてもすべて取り出すことを、左外部結合と呼びます。
左外部結合を行うには、以下のようなSELECT文を書きます。「結合の条件」の部分には、内部結合のときと同じように、「左右のテーブルで、結合のキーとなる列の値が等しい」という条件式を書きます。
---------------------------------------------------
SELECT 列名, 列名 ・・・
FROM 左テーブル名
LEFT JOIN 右テーブル名
ON 結合の条件
WHERE そのほかの条件
---------------------------------------------------
例えば、itemテーブルとmakerテーブルを結合し、商品名とメーカー名(各テーブルのname列)を取り出したいとします。また、itemテーブルのすべての行を取り出したいとします(図2-3)。この場合は、以下のようなSELECT文を書きます。
---------------------------------------------------
SELECT item.name, maker.name
FROM item
LEFT JOIN maker
ON item.maker_id = maker.id
---------------------------------------------------
この場合の結果は、図2-3の下半分のようになります。idが301番の商品には、対応するメーカーの情報がありません。そのため、その行のメーカー名の列は、「値がない」ということを表す「NULL」になります。
なお、左外部結合とは逆に、左右のテーブルのうち、右側のテーブルのすべての行を取り出す外部結合を、右外部結合と呼びます。右外部結合を行うには、左外部結合の文の「LEFT JOIN」を「RIGHT JOIN」に置き換えます。
次のページでは、副問い合わせ、行の追加/更新/削除、について説明します。