Spec-Zone .ru
спецификации, руководства, описания, API
|
Если подзапрос возвращает какие-либо строки вообще, 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
. Это - фактически маловероятный пример потому что a [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.cityAND cities_stores.store_type = stores.store_type));
Последним примером является двойным образом вложенный NOT EXISTS
запрос. Таким
образом, у этого есть a NOT EXISTS
пункт в пределах a NOT
EXISTS
пункт. Формально, это отвечает на вопрос, "делает город, существуют с хранилищем, которое не находится в Stores
"? Но легче сказать что вложенный NOT
EXISTS
отвечает на вопрос," x
TRUE
для всех y
?"