構文:
operand comparison_operator ALL (subquery)
ワード ALL
(これは比較演算子のあとに指定する必要があります) は、「このサブクエリーが返すカラム内の値の ALL
(すべて) に対して比較が TRUE
である場合は TRUE
を返す」ことを示します。 例:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
テーブル t1
内に (10)
を含む行が存在するとします。 テーブル t2
に (-5,0,+5)
が含まれている場合、10
が t2
内の 3 つのすべての値より大きいため、この式は TRUE
です。 テーブル t2
に (12,6,NULL,-100)
が含まれている場合、テーブル t2
には 10
より大きい単一値 12
が存在するため、この式は FALSE
です。 テーブル t2
に (0,NULL,1)
が含まれている場合、この式は不明 (つまり、NULL
) です。
最後に、テーブル t2
が空である場合、この式は TRUE
です。 そのため、テーブル t2
が空であるとき、次の式は TRUE
です。
SELECT * FROM t1 WHERE 1 > ALL (SELECT s1 FROM t2);
ただし、テーブル t2
が空であるとき、次の式は NULL
です。
SELECT * FROM t1 WHERE 1 > (SELECT s1 FROM t2);
さらに、テーブル t2
が空であるとき、次の式は NULL
です。
SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);
一般に、NULL
値を含むテーブルと空のテーブルは「エッジケース」です。 サブクエリーを記述するときは、常に、これらの 2 つの可能性を考慮に入れたかどうかを考慮してください。
NOT IN
は <> ALL
のエイリアスです。 そのため、次の 2 つのステートメントは同じです。
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
MySQL 8.0.19 では、TABLE
ステートメントがサポートされます。 IN
、ANY
および SOME
と同様に、次の 2 つの条件が満たされている場合は TABLE
を ALL
および NOT IN
とともに使用できます:
サブクエリーのテーブルに含まれるカラムは 1 つのみです
サブクエリーはカラム式に依存していません
たとえば、テーブル t2
が単一のカラムで構成されていると仮定すると、前述の最後の 2 つのステートメントは、次のように TABLE t2
を使用して記述できます:
SELECT s1 FROM t1 WHERE s1 <> ALL (TABLE t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (TABLE t2);
サブクエリーはカラム式に依存するため、SELECT * FROM t1 WHERE 1 > ALL (SELECT MAX(s1) FROM t2);
などのクエリーは TABLE t2
を使用して記述できません。