MySQL 8.0 リファレンスマニュアル


13.2.11.4 ALL を使用したサブクエリー

構文:

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) が含まれている場合、10t2 内の 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 ステートメントがサポートされます。 INANY および SOME と同様に、次の 2 つの条件が満たされている場合は TABLEALL および 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 を使用して記述できません。


関連キーワード:  ステートメント, CREATE, TABLE, サブクエリー, DROP, テーブル, FROM, ALL, FUNCTION, カラム