サブクエリとは、SELECT、SELECT...INTO、INSERT INTO、DELETE、UPDATE などのステートメントおよびほかのサブクエリの中にネストされた SELECT ステートメントのことです。
サブクエリの作成には、次の 3 つの構文のいずれかを使用します。
comparison [ANY | ALL | SOME] (sqlstatement)
expression [NOT] IN (sqlstatement)
[NOT] EXISTS (sqlstatement)
サブクエリには、次の指定項目があります。
| 指定項目 | 内容 |
|---|---|
| comparison | 式、およびその式とサブクエリの結果とを比較する比較演算子。 |
| expression | サブクエリの結果の検索に使用する式。 |
| sqlstatement | SELECT ステートメント。書式や規則はほかの SELECT ステートメントの場合と同じです。この SELECT ステートメントはかっこで囲みます。 |
サブクエリは、SELECT ステートメントのフィールド リストの中で、または WHERE 句や HAVING 句の中で、式の代わりとして使用できます。サブクエリでは、SELECT ステートメントを使用して、WHERE 句および HAVING 句の式で評価に使用する 1 つまたは複数の値を取得します。
サブクエリで取得したレコードとの比較結果が真になるレコードをメイン クエリから取得するには、ANY 述語または SOME 述語 (この 2 つは同義) を使用します。次の例では、値引率 25% 以上で売られた商品よりも単価の高いすべての商品を返します。
SELECT * FROM 商品
WHERE 単価 > ANY
(SELECT 単価 FROM 売上明細
WHERE 割引率 >= .25);
サブクエリで取得したすべてのレコードとの比較結果が真になるレコードのみをメイン クエリから取得するには、ALL 述語を使用します。前の例で ANY を ALL に変更すると、値引率 25% 以上で売られたすべての商品よりも単価の高い商品のみを返します。つまり、取得されるレコードがさらに限定されます。
サブクエリの中に同じ値を持つレコードのみをメイン クエリから取得するには、IN 述語を使用します。次の例では、値引率 25% 以上で売られたすべての商品を返します。
SELECT * FROM 商品
WHERE 商品コード IN
(SELECT 商品コード FROM 売上明細
WHERE 割引率 >= .25);
逆に、サブクエリの中に同じ値を持つレコードがないレコードのみをメイン クエリから取得するには、NOT IN 句を使用します。
あるいは、不等号と、ALL を使って、<> ALL としても、否定表現になります。
EXISTS 述語 (予約語 NOT を併用することも可能) はサブクエリがレコードを返すかどうかを調べることができるので、True/False の中で使用できます。
サブクエリの中でテーブル名の別名を使用すると、サブクエリの外側にある FROM 句に指定したテーブルを参照することができます。次の例では、同じ役職の全社員のうち、その平均給与以上の給与を受け取っている社員の名前を返します。また、[社員] テーブルに "T1" という別名を与えています。
SELECT 氏名,
部署, 役職, 給与
FROM 社員 AS T1
WHERE 給与 >=
(SELECT Avg(給与)
FROM 社員
WHERE T1.役職 = 社員.役職) Order by 役職;
この例では、予約語 AS は省略可能です。
一部のサブクエリは、クロス集計クエリの中で述語 (特に WHERE 句の中の述語) として使用できます。クロス集計クエリでは、SELECT のリストの中で出力としてサブクエリを使用することはできません。