PSQL Programmer's Guide (v11)

結合 (リレーショナル インターフェイス)

結合は、列を複数のテーブルから 1 つのビューに結合するステートメントから発生します。データが読み取り専用でなければ、このビューからデータの取得、挿入、更新または削除を行えます。


メモ

ここでは、主に、SELECT ステートメントによるテーブルの結合について説明します。ただし、1 つのステートメントを複数のテーブルに適用することによって、INSERT、UPDATE および DELETE ステートメントで結合を作成することもできます。『SQL Engine Reference』では、これら SQL ステートメントおよび結合ビューの最適化の方法について説明しています。


FROM 句に各テーブル名またはビュー名を表示することによって、テーブルからデータを取得できます。1 つまたは複数の結合条件を指定するには、WHERE 句を使用します。結合条件では、1 つのテーブルから列の値を参照する式を、別のテーブルから列の値を参照する式と比較します。

データが正しく正規化されると、ほとんどの結合は指定されたキー値に基づいて値を関連付けます。それにより、参照整合性の関係でデータを抽出できます。たとえば、どの教授がどのクラスを教えているかを知りたい場合、Faculty ID に基づいて結合を作成できます。Faculty ID は、Class テーブル内の外部キーであり、また、Person テーブル内の主キーです。

SELECT DISTINCT Class.Name, Person.Last_Name
   FROM Class, Person, Faculty
   WHERE Class.Faculty_ID = Person.ID
      AND Class.Faculty_ID = Faculty.ID; 

この例では、共通の列 Faculty ID の共通の値に基づいて 2 つのテーブルを結合します。

また、データ型の列の間で数値の比較を行うことでもテーブルを結合できます。たとえば、<、> または = を使用して列を比較できます。Faculty テーブルの以下の自己結合は、各教職員より給与が高いすべての教職員を識別します。このため、Faculty テーブルに含まれているレコードよりかなり多くのレコードが生成されます。

SELECT A.ID, A.Salary, B.ID, B.Salary
   FROM Faculty A, Faculty B
   WHERE B.Salary > A.Salary; 

日付や時刻などの同様の比較を行えば、多数の有効かつ意味のある結果を生成できます。

列を結合する場合は、可能であれば同じデータ型の列を選択します。たとえば、2 つの NUMERIC 列を比較する方が、NUMERIC 列を INTEGER 列と比較するより効率的です。2 つの列が同じデータ型でなく、ともに数値または文字列であれば、Pervasive PSQL は両方のテーブルをスキャンし、結合条件を結果に対する制限として適用します。

WHERE 句で文字列型の列を使用する場合、結合条件の 1 つの列を計算の文字列の列とすることができます。そうすれば、複数の文字列を連結し、結合条件でそれらの文字列を別のテーブルからの 1 つの文字列と比較することができます。

Pervasive PSQL が結合を処理する方法は、結合条件にインデックス列が含まれているかどうかにより異なります。

ほかのテーブルとのテーブルの結合

SELECT ステートメントを使用して結合を指定するには、FROM 句 を使用して関連するテーブルを一覧表示し、WHERE 句を使用して結合の条件と制限を指定します。以下の例では、エイリアスを使用してステートメントの単純化も行います。

SELECT Student_ID, Class_ID, Name
   FROM Enrolls e, Class cl
   WHERE e.Class_ID = cl.ID; 

次の例では、3 つのテーブルを結合します。

SELECT p.ID, Last_Name, Name
   FROM Person p, Enrolls e, Class cl
   WHERE p.ID = e.Student_ID AND e.Class_ID = cl.ID; 

次の例では、英語で 3.0 より低い成績をとった学生のリストを取得します。

SELECT First_Name, p.Last_Name  
   FROM Person p, Student s, Enrolls e, Class cl  
   WHERE s.ID = e.Student_ID  
      AND e.Class_ID = cl.ID  
      AND s.ID = p.ID  
      AND cl.Name = 'ACC 101'  
      AND e.Grade < 3.0; 

この例では、WHERE 句の最初の 3 つの条件で 4 つのテーブル間の結合を指定します。次の 2 つの条件は、ブール演算子 AND で接続された制限句です。

テーブルとのビューの結合

ビューを 1 つまたは複数のテーブルと結合するには、FROM 句にビュー名を取り込みます。指定するビューには、1 つのテーブルまたはいくつかの結合されたテーブルから列を取り込むことができます。

結合のタイプ

Pervasive PSQL は、等結合、不等号結合、ヌル結合、カルテシアン結合、自己結合、左外部結合、右外部結合、および全外部結合をサポートします。

結合の構文の詳細については、以下のトピックを参照してください。

等結合

等結合は、2 つの結合列を等価と定義するときに発生します。以下のステートメントは、等結合を定義します。

SELECT First_Name, Last_Name, Degree, Residency
   FROM Person p, Student s, Tuition t
   WHERE p.ID = s.ID AND s.Tuition_ID = t.ID; 

不等号結合

比較演算に基づいてテーブルを結合できます。不等号結合では以下の演算子を使用できます。

<
より小さい
>
より大きい
<=
小さいかまたは等しい
>=
大きいかまたは等しい

以下の WHERE 句は、≧ 演算子を使用する結合を示しています。

SELECT Name, Section, Max_Size, Capacity, r.Building_Name, Number
   FROM Class cl, Room r
   WHERE Capacity >= Max_Size; 

カルテシアン結合

カルテシアン結合は、あるテーブル内の各行を別のテーブル内の各行に関連付けます。Pervasive PSQL は、一方のテーブルの各行に対しもう一方のテーブルのすべての行を読みます。

大きなテーブルでは、カルテシアン結合に時間がかなりかかる可能性があります。Pervasive PSQL は、このタイプの結合を行うために以下の行数を読み取らなければならないからです。

(あるテーブル内の行数) * (ほかのテーブル内の行数) 

たとえば、あるテーブルに 600 行含まれており、もう一つのテーブルに 30 行含まれている場合、Pervasive PSQL は各テーブルのカルテシアン結合を作成するのに 18,000 行を読み取ります。

以下のステートメントは、サンプル データベース内の Person テーブルと Course テーブルにカルテシアン結合を生成します。

SELECT s.ID, Major, t.ID, Degree, Residency, Cost_Per_Credit
   FROM Student s, Tuition t# 

自己結合

自己結合では、FROM 句でテーブル名を何回も指定できます。自己結合を指定する場合は、テーブル名の各インスタンスにエイリアスを割り当て、Pervasive PSQL が結合でテーブルの各発生セグメントを区別できるようにします。

以下の例では、Jason Knibb という人と同じ州に定住所がある人のすべてをリストします。このクエリは、ID、名前、名字、現在の電話番号、電子メール アドレスを返します。

SELECT p2.ID, p2.First_Name, p2.Last_Name, p2.Phone, p2.EMail_Address 
   FROM Person p1, Person p2 
   WHERE p1.First_Name = 'Jason' AND p1.Last_Name = 'Knibb'  
      AND p1.Perm_State = p2.Perm_State 

左部、右部、完全外部結合

外部結合の詳細については、『SQL Engine Reference』に記載されています。『SQL Engine Reference』の 「SELECT」 および 「JOIN」 を参照してください。


ソートされた行とグループ化された行 (リレーショナル インターフェイス)

サブクエリ (リレーショナル インターフェイス)