Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.9Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  EXISTS または NOT EXISTS を使用したサブクエリー

13.2.10.6 EXISTS または NOT EXISTS を使用したサブクエリー

サブクエリーが少なくとも 1 行を返す場合、EXISTS subqueryTRUE であり、NOT EXISTS subqueryFALSE です。例:

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

従来より、EXISTS サブクエリーは SELECT * で始まりますが、SELECT 5SELECT column1、あるいはほかの何で始まってもかまいません。MySQL はこのようなサブクエリー内の SELECT リストを無視するため、何も違いは生まれません。

前の例では、t2 に何らかの行が含まれている場合 (NULL 値以外は何も含まれていない行でも)、EXISTS 条件は TRUE です。[NOT] EXISTS サブクエリーには、ほぼ常に相互関係が含まれるため、これは実際にはありそうにもない例です。次に、より現実的な例をいくつか示します。

  • 1 つ以上の市に存在するのはどのような種類のお店ですか?

    SELECT DISTINCT store_type FROM stores
      WHERE EXISTS (SELECT * FROM cities_stores
                    WHERE cities_stores.store_type = stores.store_type);
  • どの市にも存在しないのはどのような種類のお店ですか?

    SELECT DISTINCT store_type FROM stores
      WHERE NOT EXISTS (SELECT * FROM cities_stores
                        WHERE cities_stores.store_type = stores.store_type);
  • すべての市に存在するのはどのような種類のお店ですか?

    SELECT DISTINCT store_type FROM stores s1
      WHERE NOT EXISTS (
        SELECT * FROM cities WHERE NOT EXISTS (
          SELECT * FROM cities_stores
           WHERE cities_stores.city = cities.city
           AND cities_stores.store_type = stores.store_type));

最後の例は、二重にネストされた NOT EXISTS クエリーです。つまり、NOT EXISTS 句の中に NOT EXISTS 句が存在します。これは正式には、Stores にないお店が含まれている市は存在しますか? という質問に答えます。ただし、ネストされた NOT EXISTS が、x はすべての y に対して TRUE ですか?という質問に答えるという方が簡単です。