内部結合と外部結合を使用したテーブル・データの結合
この例では、2 つのサンプル・テーブルを作成し、異なる INNER JOIN, LEFT OUTER JOIN、および RIGHT OUTER JOIN 構文を使用してそのデータを 1 つのテーブルに結合し、異なる結合結果を比較します。
2 つのテーブル間で同一の名前を持つ列での結合
次の例では、2 つのテーブル間で同一の名前を持つ列を結合する際に使用できるさまざまな構文を示します。
以下の 2 つのテーブルについて考えます。
以下の INNER JOIN は患者名と医師名を返します。
SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
ON Patient.DocID = Doctor.DocID
結合する列は、両方のテーブルで同じ名前 (DocID) を持つため、ON 節を USING 節に置き換えることができます。以下の構文では、括弧で囲んで列のみを指定し、テーブル名は省略します。
SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
USING (DocID)
USING 節を LEFT OUTER JOIN または RIGHT OUTER JOIN で指定することもできますが、FULL OUTER JOIN はサポートされていません。
SELECT Patient.PName, Doctor.DName
FROM Patient
RIGHT OUTER JOIN Doctor
USING (DocID)
SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
USING (DocID)
DocID が 2 つのテーブル間で同じ名前を持つ唯一の列である場合は、さらに単純化して NATURAL JOIN 構文を使用できます。
SELECT Patient.PName, Doctor.DName
FROM Patient
NATURAL INNER JOIN Doctor
SELECT Patient.PName, Doctor.DName
FROM Patient
NATURAL LEFT OUTER JOIN Doctor
SELECT Patient.PName, Doctor.DName
FROM Patient
NATURAL RIGHT OUTER JOIN Doctor
2 つのテーブルに他に同一の列が含まれている場合、NATURAL JOIN は、結合操作でこれらの列もリンクさせます。結合する列をより詳細に指定するには、USING 節または ON 節を使用します。FULL OUTER JOIN では、NATURAL JOINをサポートしていません。
結合データに対する追加の制限の設定
この例では、追加の制限の設定により、さまざまな結合で返されるデータがどのように影響を受けるかを示します。
以下の 2 つのテーブルについて考えます。
以下の INNER JOIN は 45 歳を超える医師の患者名とその医師名を返します。
SELECT Patient.PName, Doctor.DName
FROM Patient
INNER JOIN Doctor
ON Patient.DocID = Doctor.DocID AND Doctors.Age > 45
同じクエリの LEFT OUTER JOIN を実行しても、結合されるテーブルの一致しない行の NULL 値は排除されません。例えば、この LEFT OUTER JOIN は、依然として Doctor.DName 列に NULL 値を返します。
SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
ON Patient.DocID = Doctor.DocID AND Doctors.Age > 45
NULL 値を排除するには、年齢条件を WHERE 節に移動し、結合操作後にここで処理します。ただし、これによってクエリは効果的に INNER JOIN に変換されます。例えば、以下のクエリはこの例の最初のクエリと同等です。
SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
ON Patient.DocID = Doctor.DocID
WHERE Doctors.Age > 45
IS NULL 節を追加すると、元の LEFT OUTER JOIN の動作は保持されますが、元の LEFT OUTER JOIN クエリより冗長になります。
SELECT Patient.PName, Doctor.DName
FROM Patient
LEFT OUTER JOIN Doctor
ON Patient.DocID = Doctor.DocID
WHERE Doctors.Age > 45 AND Doctors.Age IS NULL
この動作は、RIGHT OUTER JOIN 操作でも同様です。FULL OUTER JOIN では、一致に関係なく、両方のテーブルのすべての行が返されるため、条件を指定しても返される行には影響しません。