본문 바로가기

DB/MySQL

MySQL에서 차집합, 교집합, 합집합구하기


A ∩ B {
SELECT tableA.id, tableA.name, tableB.name
FROM tableA, tableB
WHERE tableA.id = tableB.id
GROUP BY tableA.id;
또는

SELECT tableA.id, tableA.name, tableB.name
 FROM tableA LEFT JOIN tableB
  ON tableA.id=tableB.id
WHERE tableB.id IS NOT NULL

또는
SELECT tableB.id, tableA.name, tableB.name
FROM tableB LEFT JOIN tableA
ON tableB.id=tableA.id
WHERE tableA.id IS NOT NULL
}

A ∪ B {
SELECT tableA.id AS id, tableA.name AS name
FROM tableA UNION SELECT tableB.id AS id, tableB.name AS name FROM tableB;
}

A - B {
SELECT tableA.id, tableA.name
  FROM tableA LEFT JOIN tableB
    ON tableA.id=tableB.id
WHERE tableB.id IS NULL;

참고::흔히 행하는 잘못된 퀘리
SELECT tableA.id, tableA.name
  FROM tableA, tableB
    WHERE tableA.id <> tableB.id
  GROUP BY tableA.id;
}

B - A {
SELECT tableB.id, tableB.name
  FROM tableB LEFT JOIN tableA
    ON tableB.id=tableA.id
  WHERE tableA.id IS NULL
}

해석 설명 {
LEFT OUTER JOIN을 응용하여 가능하다.

LEFT OUTER JOIN 결과는 다음과 같으므로
(SELECT tableA.id, tableA.name FROM tableA LEFT JOIN tableB ON tableA.id=tableB.id WHERE 1)
----------------------------------------
tableA id  tableB id 
100          NULL
101          101
102          NULL
103          103
104          NULL
105          NULL
106          106
107          107
----------------------------------------
WHERE 절에서 tableB.id 가 NULL 인것만 고르면 A - B가 가능하고...
B - A 역시 마찬가지 원리.
A ∩ B는 tableB.id가 NULL이 아닌것을 골라내면 됨.
}

ORACLE의 경우 MINUS(차), UNION(합), INTERSECTION(교) 연산자를 지원하지만...
MySQL은 UNION만 지원 

'DB > MySQL' 카테고리의 다른 글

[MySQL] alter table 명령어  (0) 2009.08.31