SQLの基本(その2)

2009年10月20日(火)
藤本 壱

テーブルの結合

 本連載の第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」に置き換えます。

 次のページでは、副問い合わせ、行の追加/更新/削除、について説明します。

1969年生まれ。神戸大学工学部電子工学科卒。ソフトメーカー勤務後、フリーライターとして独立。現在では、パソコン関係およびマネー関係の書籍を中心に執筆活動を行っている。ブログ「The blog of H.Fujimoto」は、Movable TypeやWordPressの情報を中心に毎日更新している(http://www.h-fj.com/blog/)。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています