テーブルの結合

テーブルの結合

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

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

この記事のキーワード :

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30