MINUS와 INTERSECT 집합 연산

-- MySQL 2013. 5. 29. 11:37
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

비MYSQL과 MYSQL이 교집합, 차집합을 다르게 구현해 써서 언젠가 정리하려고 생각만 하다가 정리가 잘된 사이트가 있어 정리를 이로 대신한다.

INTERSECT 집합 연산 사용

INTERSECT 는 두개 집합에서 SELECT되는 튜플들을 모두 INNER JOIN의 조인 조건으로 포함시켜서 실행하면 쉽게 동일한 결과를 얻을 수 있다.


[비MYSQL]

SELECT member_id as uid, member_name as uname FROM member
INTERSECT
SELECT emp_id as uid, emp_name as uname FROM emp;


(이 형태의 쿼리는 MySQL에서는 지원되지 않음)


[MYSQL]

SELECT member_id as uid, member_name as uname
FROM member m
INNER JOIN emp e ON e.emp_id=m.member_id
AND e.emp_name=m.member_name;


MINUS 집합 연산 사용


[비MYSQL]

SELECT member_id as uid, member_name as uname FROM member
MINUS
SELECT emp_id as uid, emp_name as uname FROM emp;

(이 형태의 쿼리는 MySQL에서는 지원되지 않음)


단, MINUS 집합 연산은 항상 DISTINCT하게 중복 레코드를 제거하고 리턴하기 때문에 SELECT의 최종 결과에 DISTINCT를 붙혀 줘야 다른 DBMS의 MINUS와 동일한 결과를 얻을 수 있다. (만약, 필요치 않거나 중복 가능성이 없는 결과인 경우 DISTINCT 없어도 됨)


• [MYSQL] NOT IN을 사용하는 방법

SELECT DISTINCT m.member_id as uid, m.member_name as uname
FROM member m
WHERE (m.member_id, m.member_name) NOT IN
(SELECT e.emp_id, e.emp_name FROM emp e);



• [MYSQL] NOT EXISTS를 사용하는 방법

SELECT DISTINCT m.member_id as uid, m.member_name as uname
FROM member m
WHERE NOT EXISTS (
SELECT 1
FROM emp e
WHERE e.emp_id=m.member_id
AND e.emp_name=m.member_name
);



• [MYSQL] LEFT OUTER JOIN을 이용하는 방법

SELECT DISTINCT m.member_id as uid, m.member_name as uname
FROM member m
LEFT JOIN emp e ON e.emp_id=m.member_id
AND e.emp_name=m.member_name
WHERE e.emp_id IS NULL;



조회되는 데이터의 성격에 따라서 성능의 차이는 있겠지만, 일반적인 데이터에서는 밑으로 내려갈수록 빠른 성능(세번째 > 두번째 > 첫번째)을 보인다. 가능하면 두번째 아니면 세번째 방법을 사용할 것을 권장하며, 대상 레코드가 아주 많다면, 세번째 방법을 사용할 것을 권장한다.

출처 : http://intomysql.blogspot.kr/2011/01/mysql-minus-intersect.html

'-- MySQL' 카테고리의 다른 글

MySQL GROUP_CONCAT  (0) 2013.06.18
MySQL 대소문자 구분할 수 있는 컬럼  (0) 2013.06.18
mysql에서 rownum 사용  (0) 2013.05.10
MySQL DB Backup and Restore  (0) 2013.04.11
MySQL에서 쿼리 시 트랜잭션 처리  (0) 2013.04.11
posted by 어린왕자악꿍