連載
» 2007年07月25日 00時00分 公開

さらっと覚えるSQL&T-SQL入門(6):最大の難関“表の結合”は関連付けに注目する (1/3)

アプリケーション開発でデータベースを利用する新人プログラマに向けて、SQLおよびT-SQLを短期間で理解できるよう、開発現場ですぐに必要となる内容を中心に解説する。(編集部)

[石橋潤一,株式会社システムインテグレータ]

主な内容

   --Page 1--
▼結合の基本的な考え方
▼INNER JOINによる内部結合
   --Page 2--
▼内部結合を利用する際の注意点
▼JOIN句を使用しない内部結合
▼複数のテーブルを使用した内部結合
   --Page 3--
▼OUTER JOINによる外部結合
▼まとめ


 2月から始まった本連載も今回で第6回を迎えることができました。ここ数回にわたってSELECT文にまつわる構文を取り上げてきましたが、今回はSELECT句で難関となる「表の結合」を取り上げます。

結合の基本的な考え方

 これまでに幾度か触れたとおり、データベースは複数のテーブルを格納できます。商品や顧客のマスタテーブル、受注データテーブル、といった具合です。このような複数のテーブルをデータベースに格納する際には、論理的なリレーションシップ(関連付け)が必要となります。受注データの商品コード「0001」は、商品マスタの商品コード「0001」と一致する、といった具合です。このテーブル間の関連付けを利用することにより、受注テーブルには商品コードのみを格納し、商品名などの情報は商品マスタから取得する、といった処理が可能です。このような論理的な関連付けを利用し、複数のテーブルからデータを取得することを「結合」と呼びます。

 データベースに対しSQLを発行する際、結合を必要とするシーンは多数考えられます。サンプルデータベースであるAdventureWorksの各テーブルを基に考えてみましょう。AdventureWorksには図1のようなテーブルが格納されています(AdventureWorksの詳細については第1回を参照)。

図1 AdventureWorksテーブル群(記事に関連しない列は除いています) 図1 AdventureWorksテーブル群(記事に関連しない列は除いています)

 図1のテーブル群は、商品マスタとカテゴリマスタにかかわるテーブルを示しています。商品マスタでは、格納された商品情報ごとに所属するサブカテゴリ情報を持っています。また、サブカテゴリ、およびカテゴリについても同じくマスタ化され、サブカテゴリとカテゴリテーブルが関連付けられていることがこの図から分かります。

 このようなテーブル構成から、商品マスタより商品情報に合わせて商品が所属するサブカテゴリ名を取得する、といったように複数のテーブルからデータを取得することが、結合を利用することで可能となります。

 結合には、大きく分けて「内部結合」と「外部結合」の2つの種類が存在します。

  • 内部結合:テーブルから結合条件に一致するデータを取得する
  • 外部結合:結合条件に一致するデータに加えて、指定された一方のすべてのデータを取得する

 それでは、内部結合から確認していきましょう。

INNER JOINによる内部結合

 内部結合は、結合条件に一致するデータのみを取得します。先ほど取り上げた商品とカテゴリの各テーブルについて、実データを見てみましょう。

図2 商品とカテゴリの実データ 図2 商品とカテゴリの実データ

 商品マスタとサブカテゴリが「ProductSubcategoryID」列によって関連付け可能で、サブカテゴリとカテゴリは「ProductCategoryID」列により関連付けが可能です。商品マスタ上のProductSubcategoryID「26」は、サブカテゴリの「26」「Bike Racks」と関連付く、といった形です。この関連付けを利用して、商品マスタより各種商品名と商品にひも付くサブカテゴリ名を取得してみましょう。

 内部結合の構文は次のような形です。

SELECT 列名 FROM テーブル1

INNER JOIN テーブル2 ON 結合条件


 「JOIN」句はクエリが結合であることを示し、「INNER」句は内部結合を行うことを示しています。続いて「ON」句にて結合条件を指定します。先ほどの商品マスタとサブカテゴリを結合させる場合、次のようなSQL文になります。

SELECT      Production.Product.ProductID,
            Production.Product.Name AS 商品名,
            Production.Product.ProductSubcategoryID,
            Production.ProductSubcategory.Name AS サブカテゴリ名
FROM        Production.Product
INNER JOIN  Production.ProductSubcategory 
ON          Production.Product.ProductSubcategoryID = 
            Production.ProductSubcategory.ProductSubcategoryID
 
結果
ProductID 商品名                      ProductSubcategoryID サブカテゴリ
--------- -------------------------- -------------------- -----------
680       HL Road Frame - Black, 58  14                   Road Frames
706       HL Road Frame - Red, 58    14                   Road Frames
707       Sport-100 Helmet, Red      31                   Helmets
…中略…
999       Road-750 Black, 52          2                   Road Bikes

 上記のSQLでは、「ProductSubcategoryID」が一致するデータについて各列を取得する、という結合条件となっています。このため、商品マスタには存在するがサブカテゴリマスタには存在しない、あるいはその逆のデータは出力されません。商品マスタ全体のデータ件数に対し、出力件数が減少している点を確認しておきましょう。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。