top
Loading...
13.2.8.6.EXISTS和NOTEXISTS
13.2.8.6. EXISTS和NOT EXISTS
如果一個子查詢返回任何的行,則EXISTS subqueryFALSE。例如:
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

過去,EXISTS子查詢以SELECT *為開始,但是可以以SELECT 5SELECT 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可以回答這樣的問題,“是否對于所有的yx都為TRUE?”

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html
北斗有巢氏 有巢氏北斗