異なるテーブル同士を結合する「JOIN」句SQL実践講座(4)

» 2001年01月27日 00時00分 公開
[篠原光太郎@IT]

今回掲載の内容

  • テーブル同士を結合するには?
  • 「SELECT」句での列の指定
  • テーブルの別名を指定する
  • INNER JOIN句


テーブル同士を結合するには?

 今回は、SQL文での結合の仕方(JOIN)を説明します。前回までに説明した「SELECT」文は、「FROM」句に1つのテーブルのみを指定するシンプルな例でした。今回使用する「JOIN」を使用すると、複数のテーブルから関連するデータを同時に表示させることができます。

 まずは、前回と同様「Order Details」を表示してみましょう。

【例1】

SELECT * FROM "Order Details"
画面1 OrderDetailsテーブルの内容を表示してみたところ(画面をクリックすると拡大表示します) 画面1 OrderDetailsテーブルの内容を表示してみたところ(画面をクリックすると拡大表示します)

 今回使用する「Order Details」テーブルの内容が表示されます。このテーブルは、ある注文(OrderID)に対して、どの製品(ProductID)を単価いくらで(UnitPrice)、いくつ(Quantity)受注したかを記録しています。ここで、表示されたデータを見ると分かると思いますが、製品に関しては、2桁のProductIDが表示されるだけで、どのような製品なのかは、この「Order Details」テーブルの内容だけでは分かりません。

 製品に関する情報は、「Products」テーブルに記録されています。表示させてみましょう。

【例2】

SELECT ProductID, ProductName, QuantityPerUnit
FROM Products
画面2 こんどは、Productsテーブルの内容を表示してみた(画面をクリックすると拡大表示します) 画面2 こんどは、Productsテーブルの内容を表示してみた(画面をクリックすると拡大表示します)

 「Products」テーブルには、ProductIDのほか、製品名(ProductName)、単価(UnitPrice)といった情報が格納されています。上記の「Order Details」テーブルの最初の行に表示されているProductIDが11の製品は、Queso Cabralesという名称で、単価は21ドルであることが「Products」テーブルから分かりますね。

 では、「Order Details」を表示させたときのProductIDを、ProductNameにするにはどうしたらよいでしょうか?

ここで、「JOIN」の登場です。

 まずは、例3を実行してみましょう。

【例3】

SELECT OrderID, Prd.ProductID, ProductName, Prd.UnitPrice, Quantity, Discount 
FROM "Order Details" Ord 
INNER JOIN Products Prd ON Ord.ProductID=Prd.ProductID
画面3 2つのテーブルをJOINした結果。Productsテーブルを使ってOrder Detailsテーブルの表示結果にProductNameを反映することができた(画面をクリックすると拡大表示します) 画面3 2つのテーブルをJOINした結果。Productsテーブルを使ってOrder Detailsテーブルの表示結果にProductNameを反映することができた(画面をクリックすると拡大表示します)

 だいぶ、複雑なSQLになりましたね。JOINそのものを説明する前に、1つ1つ順を追って説明しましょう。

「SELECT」句での列の指定

 いままでの例と同様な列の指定ですが、ProductIDとUnitPriceの前には、「Prd.」という追加の指定がされています。これは、ProductIDという名前の列が、「Order Details」テーブルと「Products」テーブルの両方に存在するため、どちらのテーブルのProductIDかを指定するためのテーブル名です。テーブル名だけではなく、データベース名も指定することが可能です。データベース名はテーブル名のさらに前に、「.」(ピリオド)で区切って指定します。

[データベース名] . [テーブル名] . [カラム名]

と記述することで、特定のテーブルの特定の列を指定することができます。例3では、データベース名やテーブル名を指定していない列がありますが、同じ列が対象とならない限り、省略することが可能です。いままでの例はすべてそうでしたね。

 では、「Prd」というテーブルはあるのでしょうか? Northwindデータベースの中にはPrdというテーブルはありません。これを次に説明します。

テーブルの別名を指定する

 例3のように、複数のテーブルを扱うSELECT文ではテーブル名を指定する機会が多くなります。読みやすさを確保するために、テーブル名の別名を指定することが可能です(テーブル名の別名を指定することができる理由には、ほかにもう1つ大きな理由がありますが、それは別の回で説明します)。

【例3】

SELECT OrderID, Prd.ProductID, ProductName, Prd.UnitPrice, Quantity, Discount 
FROM "Order Details" Ord 
INNER JOIN Products Prd ON Ord.ProductID=Prd.ProductID

 例3では、FROM句の「"Order Details" Ord」の部分と、INNER JOIN節の「Products Prd」の部分が別名の指定個所です。この例では、"Order Details"テーブルは、「Ord」という別名を指定していますので、同じSQL文の中ではテーブル名を記述する個所にOrdと記述すれば、それは"Order Details"を記述したのと同じ意味になります。例3では、Productsテーブルに対して、「Prd」という別名も指定されています。

 では次に、本題のJOINです。

INNER JOIN句

 「Order Details」テーブルと「Products」テーブルを結び付けているのは、FROM句の中のINNER JOIN節です。FROM句で記述したテーブル名の後にINNER JOIN節を記述すると、INNER JOIN節に記述されたテーブルと結合がされます。INNER JOIN節の次に続くON節は、結合の際の条件指定です。例3の場合には、「OrderDetails」テーブルのProductIDと「Products」テーブルのProductIDが同じレコード同士が、2つのテーブル間で結び付けられます

 例3では、「Order Details」テーブルの1行目はProductIDが11ですので、「Products」テーブルのProductIDが11の行と結び付けられます。ProductIDが11の行のProductNameは「Queso Cabrales」ですので、それが例3の1行目の結果として表示されているわけです。次は、「Order Details」テーブルの2行目はProductIDが42ですので、「Products」テーブルのProductIDが42の行と結び付けられます。このように、「Order Details」テーブルのすべての行に対して、該当する「Products」テーブルの行が結び付けられる、という仕組みです。

今回のまとめ

今回は、「INNER JOIN句」を紹介しました。次回は、さらにJOINのいくつかの例と、JOINのバリエーションについてを予定しています



「SQL実践講座」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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