반한된 결과를 하나의 집합이라고 생각하고 합집합과 교집합,차집합을 구할 수 있다.
JOIN과 동일한 마당 서점의 데이터를 활용했다.
합집합은 집합을 서로 더한 것을 말한다. SELECT 명령의 실행 결과를 하나의 집합으로 다룰 수 있으며, UNION 키워드를 사용한다.
UNION으로 두 개의 SELECT 명령을 하나로 연계해 질의 결과를 얻을 수 있다.중복이 제거되는데, 중복을 제거하지 않고 합치고 싶을 땐 UINON ALL을 사용한다.SELECT name FROM customer WHERE address LIKE '대한민국%' UNION SELECT name FROM customer WHERE custid IN (SELECT custid FROM orders);![]()
SELECT name FROM customer WHERE address LIKE '대한민국%' UNION SELECT name FROM customer JOIN orders ON customer.custid = orders.orderid;
MySQL에는 교집합과 차집합을 다루는 INTERSECT, MINUS 연산자가 없으므로 다음과 같이 표현한다.
IN 연산자를 사용해 교집합을 계산할 수 있다.SELECT name FROM customer WHERE address LIKE '대한민국%' AND name IN (SELECT name FROM customer WHERE custid IN (SELECT custid FROM orders));![]()
NOT IN 연산자를 사용해 차집합을 계산할 수 있다.SELECT name FROM customer WHERE address LIKE '대한민국%' AND name NOT IN (SELECT name FROM customer WHERE custid IN (SELECT custid FROM orders));![]()
서브쿼리를 사용해 검색할 때 데이터가 존재하는지 아닌지를 판별하기 위해 EXISTS를 사용할 수 있다.
EXISTS (SELECT 명령)EXISTS는 원래 단어에서 의미하는 것과 같이 조건에 맞는 튜플이 존재하면 결과에 포함시킨다.어떤 행이 조건에 만족하면 참임NOT EXISTS는 서브쿼리의 모든 행이 조건에 만족하지 않을 때만 참임SELECT name, address FROM customer WHERE EXISTS (SELECT * -- 서브쿼리 안에 있다 없다 FROM orders WHERE customer.custid = orders.custid); -- 존재 여부는 custid로 찾겠다. -- 반환되는 행이 없으면 거짓!![]()
주문을 한 번도 안 한 고객 정보를 알고 싶을 때 많이 사용한다.-- 주문 이력이 없는 사람 찾기 : NOT EXISTS SELECT name, address FROM customer WHERE NOT EXISTS (SELECT * FROM orders WHERE customer.custid = orders.custid);