添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
EXISTS subquery TRUE NOT EXISTS subquery FALSE

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

传统上, EXISTS 子查询以 开头 SELECT * ,但它可以以 SELECT 5 or SELECT column1 或任何东西开头。MySQL 会忽略 SELECT 此类子查询中的列表,因此没有任何区别。 对于前面的示例,如果 t2 包含任何行,甚至只有 NULL 值的行,则 EXISTS 条件为 TRUE 。这实际上是一个不太可能的例子,因为 [NOT] EXISTS 子查询几乎总是包含相关性。下面是一些更现实的例子: 一个或多个城市有什么样的商店?

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 TRUE y ” 在 MySQL 8.0.19 及之后的版本中,还可以在子查询中使用 NOT EXISTS or NOT EXISTS with TABLE ,如下所示:

    SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

    SELECT * 结果与在子查询中不使用 WHERE 子句 时的结果相同。