内部結合
内部結合 は、2 つの表を結合する方式の 1 つで、一方の表に他方の表の行と一致しない列があればその行を破棄します。 マッチングは結合条件に基づいて行われます。
内部結合を要求するには、結合したい表を FROM 文節で指定し、WHERE 文節 または ON 文節で結合条件を指定して、SELECT ステートメントを 実行します。 結合条件は、副照会を含まない 単純検索条件または複合検索条件のいずれでも構いません。
最も単純なタイプの内部結合では、 結合条件は column1=column2 です。
インナー・ジョインの例
この例では、PARTSとPRODUCTSテーブルに以下の行が含まれていると仮定します
PARTS table PRODUCTS table
PART PROD# SUPPLIER PROD# PRODUCT PRICE
======= ===== ============ ===== =========== =====
WIRE 10 ACWF 505 SCREWDRIVER 3.70
OIL 160 WESTERN_CHEM 30 RELAY 7.55
MAGNETS 10 BATEMAN 205 SAW 18.90
PLASTIC 30 PLASTIK_CORP 10 GENERATOR 45.75
BLADES 205 ACE_STEEL
PROD#列でPARTSとPRODUCTSテーブルを結合し、サプライヤーとそれらの部品を使用する製品を含む部品のテーブルを作成するには、以下のSELECT文のいずれかを使用します
SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
FROM PARTS, PRODUCTS
WHERE PARTS.PROD# = PRODUCTS.PROD#;SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
FROM PARTS INNER JOIN PRODUCTS
ON PARTS.PROD# = PRODUCTS.PROD#;結果表は、以下の出力のようになります。
PART SUPPLIER PROD# PRODUCT
======= ============ ===== =========
WIRE ACWF 10 GENERATOR
MAGNETS BATEMAN 10 GENERATOR
PLASTIC PLASTIK_CORP 30 RELAY
BLADES ACE_STEEL 205 SAWこの例に関して、以下の 3 つの点に注意してください。
- パーツ表にあるパーツ (OIL) には製品 (#160) がありますが、製品表には製品 (#160) はありません。 製品 (SCREWDRIVER, #505) には、パーツ表にリストされたパーツがありません。 したがって、OIL も SCREWDRIVER も結合後の結果表には現われません。
これに対して、外部結合 は、結合された列の値が一致しなくても、その列を含む行を結果に含めます。
- この結合が内部結合 (外部結合ではなく) であることを明示的に指定でき ます。 FROM 文節で明示的に表を結合するときは、FROM 文節でコンマではなく INNER JOIN を使用し 、かつ、ON を使用して結合条件 (WHERE ではなく) を指定します。
- 最初の照会形式で WHERE 文節を指定しないと、FROM 文節で指定した表に対して可能な、行の
組み合わせのすべてが結果表に入ります。 次のステートメントの場合のように、2 番目の照会形式で、
常に真となるような結合条件を指定した場合も、同じ結果が得られます。
WHERE 文節を省略するか、常に真である結合条件を指定するかに関係なく、結果表に入る行の数は、それぞれの表の行数を乗算した積になります。SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT FROM PARTS INNER JOIN PRODUCTS ON 1=1;
より複雑な結合条件を指定し、異なる結果のセットを入手することができます。 例えば、パーツ、供給業者、製品番号、および製品の表から、A の文字 で始まる供給業者を除くには、次の照会のような照会を作成します。
SELECT PART, SUPPLIER, PARTS.PROD#, PRODUCT
FROM PARTS INNER JOIN PRODUCTS
ON PARTS.PROD# = PRODUCTS.PROD#
AND SUPPLIER NOT LIKE 'A%';問い合わせの結果は、Aで始まるサプライヤを持たないすべての行です。 結果表は、以下の出力のようになります。
PART SUPPLIER PROD# PRODUCT
======= ============ ===== ==========
MAGNETS BATEMAN 10 GENERATOR
PLASTIC PLASTIK_CORP 30 RELAY内部結合を使用して表をその表自体に結合する例
表を自身に結合すると、行間の関係を知るために便利です。 次の例では、PROJ 表からの主要プロジェクトと、これらの主要プロジェクトに含まれるプロジェクトのリストを戻します。
この例では、 A はテーブル DSN8C10. PROJ の最初のインスタンスを示し、 B はこのテーブルの 2 番目のインスタンスを示します。 結合条件は、表 DSN8C10. PROJ A の列 PROJNO の値が、表 DSN8C10. PROJ B の列 MAJPROJ の値と等しくなければならないというものです。
次の SQL ステートメントは、テーブル DSN8C10. PROJ をそれ自体に結合し、各主要プロジェクトの番号と名前に続いて、その一部であるプロジェクトの番号と名前を返します。
SELECT A.PROJNO, A.PROJNAME, B.PROJNO, B.PROJNAME
FROM DSN8C10.PROJ A, DSN8C10.PROJ B
WHERE A.PROJNO = B.MAJPROJ;結果表は、以下の出力のようになります。
PROJNO PROJNAME PROJNO PROJNAME
====== ======================== ======= ========================
AD3100 ADMIN SERVICES AD3110 GENERAL AD SYSTEMS
AD3110 GENERAL AD SYSTEMS AD3111 PAYROLL PROGRAMMING
AD3110 GENERAL AD SYSTEMS AD3112 PERSONNEL PROGRAMMG
⋮
OP2010 SYSTEMS SUPPORT OP2013 DB/DC SUPPORTこの例では、FROM 文節のコンマは暗黙的に内部結合 を指定し、INNER JOIN キーワードが使用された場合と同様の働きをします。 内部結合を意味するコンマを使用した場合、 結合条件の指定は WHERE 文節で行わなければなりません。 INNER JOIN キーワードを使用した場合は、 結合条件の指定は ON 文節で行わなければなりません。