13.2.8.6.EXISTS和NOTEXISTS
13.2.8.6. EXISTS和NOT
EXISTS
如果一個子查詢返回任何的行,則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 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可以回答這樣的問題,“是否對于所有的y,x都為TRUE?”