アプリケーション開発でデータベースを利用する新人プログラマに向けて、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のテーブル群は、商品マスタとカテゴリマスタにかかわるテーブルを示しています。商品マスタでは、格納された商品情報ごとに所属するサブカテゴリ情報を持っています。また、サブカテゴリ、およびカテゴリについても同じくマスタ化され、サブカテゴリとカテゴリテーブルが関連付けられていることがこの図から分かります。
このようなテーブル構成から、商品マスタより商品情報に合わせて商品が所属するサブカテゴリ名を取得する、といったように複数のテーブルからデータを取得することが、結合を利用することで可能となります。
結合には、大きく分けて「内部結合」と「外部結合」の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」が一致するデータについて各列を取得する、という結合条件となっています。このため、商品マスタには存在するがサブカテゴリマスタには存在しない、あるいはその逆のデータは出力されません。商品マスタ全体のデータ件数に対し、出力件数が減少している点を確認しておきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.