ALL / ANY
| 対応: | SQL-92(1992) |
|---|
サブクエリが返す複数の値と比較するための修飾子です。『ALL』はすべての値との比較が真の場合に、『ANY(SOME)』はいずれかの値との比較が真の場合に条件を満たします。
構文
ALL: サブクエリの全値との比較が真の場合に条件を満たします。
SELECT column FROM table WHERE column operator ALL (SELECT column FROM subquery);
ANY: サブクエリのいずれかの値との比較が真の場合に条件を満たします。
SELECT column FROM table WHERE column operator ANY (SELECT column FROM subquery);
SOME は ANY の別名で、まったく同じ動作をします。
SELECT column FROM table WHERE column operator SOME (SELECT column FROM subquery);
構文一覧
| 構文 | 概要 |
|---|---|
| > ALL (...) | サブクエリの最大値より大きい行を返します。 |
| < ALL (...) | サブクエリの最小値より小さい行を返します。 |
| = ANY (...) | サブクエリのいずれかの値と等しい行を返します。IN と同等の動作です。 |
| > ANY (...) | サブクエリの最小値より大きい行を返します。 |
| < ANY (...) | サブクエリの最大値より小さい行を返します。 |
| SOME | ANY の別名です。動作は完全に同じです。 |
サンプルコード
以下の『employees』テーブルを例に説明します。
以下は複数の機能を組み合わせた例です。『WHERE』による条件指定、『AVG』による平均計算、『GROUP BY』によるグループ化を理解した上で読み進めてください。
全部署の平均給与より高い給与の社員を取得します(> ALL)。
sample_all_any.sql
SELECT name, salary, department
FROM employees
WHERE salary > ALL (
SELECT AVG(salary)
FROM employees
GROUP BY department
);
+----------+--------+----------+ | name | salary | department | +----------+--------+----------+ | 桐生一馬 | 620000 | 堂島組 | +----------+--------+----------+ 1 row in set
いずれかの部署の最高給与より高い社員を取得します(> ANY)。
sample_all_any.sql
SELECT name, salary
FROM employees
WHERE salary > ANY (
SELECT MAX(salary)
FROM employees
WHERE department <> '堂島組'
GROUP BY department
);
+----------+--------+ | name | salary | +----------+--------+ | 桐生一馬 | 620000 | | 真島吾朗 | 540000 | | 秋山駿 | 420000 | | 冴島大河 | 380000 | +----------+--------+ 4 rows in set
= ANY は IN と同等です。堂島組または真島組に所属する社員を取得します。
sample_all_any.sql
SELECT name, department
FROM employees
WHERE department = ANY (
SELECT DISTINCT department FROM employees
WHERE department IN ('堂島組', '真島組')
);
+----------+------------+ | name | department | +----------+------------+ | 桐生一馬 | 堂島組 | | 真島吾朗 | 真島組 | +----------+------------+ 2 rows in set
データベース別の書き方
『ALL』と『ANY(SOME)』は標準SQLであり、MySQL・PostgreSQL・Oracle で共通して使用できます。
SELECT name, salary, department
FROM employees
WHERE salary > ALL (
SELECT AVG(salary)
FROM employees
GROUP BY department
);
SQLite では『ALL』『ANY』『SOME』はサポートされていません。『MAX』『MIN』を使ったサブクエリで代用します。
SELECT name, salary, department
FROM employees
WHERE salary > (
SELECT MAX(avg_salary) FROM (
SELECT AVG(salary) AS avg_salary FROM employees GROUP BY department
)
);
概要
『ALL』と『ANY』は比較演算子(=, <>, <, >, <=, >=)と組み合わせて使います。よく使われるパターンを覚えると便利です。『> ALL (SELECT MAX(...) ...)』はすべてのグループの最大値を上回る、という表現になります。
『= ANY』は『IN』と同じ結果を返します。可読性のために IN を使うのが一般的です。一方、『<> ALL』は『NOT IN』と同等です。ALL はサブクエリが0行の場合に TRUE を返す(空集合に対する全称命題は真)ため、意図しない全件取得になることがあります。
外側のクエリを参照する高度なサブクエリは『相関サブクエリ』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。