• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • EXISTS、NOT EXISTS子查询

    如果一个子查询都返回任何行,EXISTSsubqueryTRUENOT EXISTSsubqueryFALSE例如:

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

    传统上,EXISTS子查询以开头SELECT *,但也可以以SELECT 5或开头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的问题“是为了所有人?xTRUEy

    在MySQL 8.0.19和更高版本中,还可以在子查询中使用NOT EXISTSNOT EXISTSwith TABLE,如下所示:

    SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);
    

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