Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

ALL / ANY

サブクエリが返す複数の値と比較するための修飾子です。『ALL』はすべての値との比較が真の場合に、『ANY(SOME)』はいずれかの値との比較が真の場合に条件を満たします。

構文
-- ALL: サブクエリの全値との比較が真の場合に条件を満たします。
SELECT 列名 FROM テーブル
WHERE 列名 比較演算子 ALL (SELECT 列名 FROM サブクエリ);

-- ANY: サブクエリのいずれかの値との比較が真の場合に条件を満たします。
SELECT 列名 FROM テーブル
WHERE 列名 比較演算子 ANY (SELECT 列名 FROM サブクエリ);

-- SOME は ANY の別名で、まったく同じ動作をします。
SELECT 列名 FROM テーブル
WHERE 列名 比較演算子 SOME (SELECT 列名 FROM サブクエリ);
構文一覧
構文概要
> ALL (...)サブクエリの最大値より大きい行を返します。
< ALL (...)サブクエリの最小値より小さい行を返します。
= ANY (...)サブクエリのいずれかの値と等しい行を返します。IN と同等の動作です。
> ANY (...)サブクエリの最小値より大きい行を返します。
< ANY (...)サブクエリの最大値より小さい行を返します。
SOMEANY の別名です。動作は完全に同じです。
サンプルコード
-- 全部署の平均給与より高い給与の社員を取得します(> ALL)。
SELECT 社員名, 給与, 部署名
FROM 社員
WHERE 給与 > ALL (
    SELECT AVG(給与)
    FROM 社員
    GROUP BY 部署名
);

-- いずれかの部署の最高給与より高い社員を取得します(> ANY)。
SELECT 社員名, 給与
FROM 社員
WHERE 給与 > ANY (
    SELECT MAX(給与)
    FROM 社員
    WHERE 部署名 <> '経営企画部'
    GROUP BY 部署名
);

-- = ANY は IN と同等です。営業部または技術部の社員を取得します。
SELECT 社員名, 部署名
FROM 社員
WHERE 部署名 = ANY (SELECT 部署名 FROM 部署 WHERE 種別 = '直轄');
実行結果
-- 全部署の平均給与(350000・420000・510000)を全部上回る社員。
社員名     | 給与    | 部署名
-----------+---------+-----------
鈴木 花子  | 620000  | 技術部
山田 太郎  | 540000  | 経営企画部

-- = ANY: 直轄部署に所属する社員。
社員名     | 部署名
-----------+-----------
鈴木 花子  | 技術部
佐藤 次郎  | 営業部
田中 恵    | 営業部
データベース別の書き方

『ALL』と『ANY(SOME)』は標準SQLであり、MySQL・PostgreSQL・Oracle・SQL Server で共通して使用できます。

SELECT 社員名, 給与, 部署名
FROM 社員
WHERE 給与 > ALL (
    SELECT AVG(給与)
    FROM 社員
    GROUP BY 部署名
);

SQLite では『ALL』『ANY』『SOME』はサポートされていません。『MAX』『MIN』を使ったサブクエリで代用します。

-- > ALL の代用(SQLite)。サブクエリの最大値より大きい行を取得します。
SELECT 社員名, 給与, 部署名
FROM 社員
WHERE 給与 > (
    SELECT MAX(avg_salary) FROM (
        SELECT AVG(給与) AS avg_salary FROM 社員 GROUP BY 部署名
    )
);
概要

『ALL』と『ANY』は比較演算子(=, <>, <, >, <=, >=)と組み合わせて使います。よく使われるパターンを覚えると便利です。『> ALL (SELECT MAX(...) ...)』はすべてのグループの最大値を上回る、という表現になります。

『= ANY』は『IN』と同じ結果を返します。可読性のために IN を使うのが一般的です。一方、『<> ALL』は『NOT IN』と同等です。ALL はサブクエリが0行の場合に TRUE を返す(空集合に対する全称命題は真)ため、意図しない全件取得になることがあります。

外側のクエリを参照する高度なサブクエリは『相関サブクエリ』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。