Spec-Zone.ru › MySQL 9.2

15.2.15.6 Подзапросы с EXISTS или NOT EXISTS

Если подзапрос возвращает хотя бы одну строку, то EXISTS subquery является TRUE, а NOT EXISTS subquery является FALSE. Например:

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
      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?”

Вы также можете использовать NOT EXISTS или NOT EXISTS с TABLE в подзапросе, например так:

SELECT column1 FROM t1 WHERE EXISTS (TABLE t2);

Результаты идентичны результатам при использовании SELECT * без предложения WHERE в подзапросе.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/exists-and-not-exists-subqueries.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API