サブクエリは、SELECT、SELECT..内に入れ子になった SELECT ステートメントです。INTO、INSERT...INTO、DELETE、または UPDATE ステートメント、または別のサブクエリ内。
構文
サブクエリを作成するには、次の 3 つの形式の構文を使用できます。
比較 [ANY |ALL |SOME] (sqlstatement)
式 [NOT] IN (sqlstatement)
[NOT]EXISTS (sqlstatement)
サブクエリには、次の部分があります。
引数 |
説明 |
比較 |
式をサブクエリの結果と比較する 式 と比較演算子。 |
式 |
サブクエリの結果セットが検索される式。 |
sqlstatement |
他の SELECT ステートメントと同じ形式と規則に従う SELECT ステートメント。 かっこで囲む必要があります。 |
解説
SELECT ステートメントのフィールド リストまたは WHERE 句または HAVING 句では、式の代わりにサブクエリを使用できます。 サブクエリでは、SELECT ステートメントを使用して、WHERE 句または HAVING 句式で評価する 1 つ以上の特定の値のセットを指定します。
サブクエリで取得されたレコードとの比較を満たすメイン クエリ内のレコードを取得するには、同義の ANY 述語または SOME 述語を使用します。 次の例では、単価が 25% 以上の割引で販売された製品よりも大きいすべての製品を返します。
SELECT * FROM Products WHERE UnitPrice > ANY (SELECT UnitPrice FROM OrderDetails WHERE Discount >= .25);
ALL 述語を使用して、サブクエリで取得されたすべてのレコードとの比較を満たすメイン クエリ内のレコードのみを取得します。 前の例で ANY を ALL に変更した場合、クエリは単価が 25% 以上の割引で販売されたすべての製品の製品よりも大きい製品のみを返します。 これははるかに制限的です。
IN 述語を使用して、サブクエリ内の一部のレコードに等しい値が含まれるメイン クエリ内のレコードのみを取得します。 次の例では、25% 以上の割引があるすべての製品を返します。
SELECT * FROM Products WHERE ProductID IN (SELECT ProductID FROM OrderDetails WHERE Discount >= .25);
逆に、NOT IN を使用すると、サブクエリ内のレコードに等しい値が含まれていないメイン クエリ内のレコードのみを取得できます。
true/false 比較で EXISTS 述語 (省略可能な NOT 予約語) を使用して、サブクエリがレコードを返すかどうかを判断します。
サブクエリのテーブル名エイリアスを使用して、サブクエリの外部にある FROM 句に一覧表示されているテーブルを参照することもできます。 次の例では、同じ役職を持つすべての従業員の平均給与以上の給与を持つ従業員の名前を返します。 Employees テーブルには、エイリアス "T1" が指定されています。
SELECT LastName, FirstName, Title, Salary FROM Employees AS T1 WHERE Salary >= (SELECT Avg(Salary) FROM Employees WHERE T1.Title = Employees.Title) Order by Title;
前の例では、AS 予約語 は省略可能です。
クロス集計クエリでは、特に述語 (WHERE 句内のサブクエリ) として使用できるサブクエリもあります。 クロス集計クエリでは、出力としてのサブクエリ (SELECT リスト内のサブクエリ) は許可されません。