INTERSECT 집합 연산 사용
INTERSECT 는 두개 집합에서 SELECT되는 튜플들을 모두 INNER JOIN의 조인 조건으로 포함시켜서 실행하면 쉽게 동일한 결과를 얻을 수 있다.
예제 쿼리)
SELECT member_id as uid, member_name as uname FROM member
INTERSECT
SELECT emp_id as uid, emp_name as uname FROM emp;
(이 형태의 쿼리는 MySQL에서는 지원되지 않음)
위의 쿼리에서 SELECT되는 튜플들이 uid와 uname이므로
이 두개의 컬럼을 INNER JOIN의 조건으로 포함시켜서 아래와 같이 작성해주면 된다.
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 집합 연산 사용
예제 쿼리)
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 없어도 됨)
- 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);
- 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
);
- LEFT OUTER JOIN을 이용하는 방법
SELECT DISTINCT m.member_id as uid, m.member_name as uname
FROM member m
LEFT JOIN emp e ON emp e ON e.emp_id=m.member_id
AND e.emp_name=m.member_name
WHERE e.emp_id IS NULL;
'Course > MY-SQL' 카테고리의 다른 글
Auto_Increment 재정렬 하기 (0) | 2018.02.09 |
---|---|
Error Code: 1153 - Got a packet bigger than 'max_allowed_packet' bytes (0) | 2016.07.01 |
mysql 한글 깨짐 문제 해결 (0) | 2015.11.23 |
MySQL : 테이블 복사 (다른 DB간 테이블 복사 포함) (0) | 2015.10.14 |
MySql 계층적 조회 쿼리 (0) | 2015.05.12 |