13.2.10.6 EXISTS 또는 NOT EXISTS를 사용한 서브 쿼리
서브 쿼리가 적어도 1 행을 반환하는 경우, 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 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
가 " x
는 모든 y
에 대해서 TRUE
입니까? "라는 질문에 대답하는 것이 더 쉽습니다.