IT

[스크랩] [MySQL] EXISTS 와 NOT EXISTS

네모세모네모 2012. 9. 11. 12:21

[MySQL] EXISTS  와 NOT EXISTS

 

서브쿼리가 어떤 레코드 던지 리턴하면 EXIST subquery는
TRUE이며 NOT EXIST suquery는 FALSE가 된다. 

 

예를 들면:

SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);

 

전통적으로 EXISTS서브쿼리는 SELECT *와 함께 시작하나, SELECT 5 혹은 SELeCT
column1과 함께 시작할 수도 있다. MySQL은 그런 서브쿼리에서 SELECT를 무시하여
차이를 만들지 않는다. 처음 예문에서 NULL 값들만 가진 레코드라도 t2가 레코드를
포함하면 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절 안에 NOT EXISTS절을 갖는다. 공식적으로 그것은 “가계들 안에서 있는 않은 한 가계를 가진 도시가 있는가?”의 질문에 응답한다. 그러나 중첩 NOT EXISTS가 “x가 모든 y에 대해 TRUE”인가 라는 질문에 답하기를 쉽도록 한다.



 

http://www.mysqlkorea.co.kr/sub.html?mcode=manual&scode=01&m_no=21530&cat1=13&cat2=380&cat3=402&lang=k

 

출처 : 술 익는 마을에 달 뜨다
글쓴이 : 愚公移山 원글보기
메모 :