이베리스
Iberis
이베리스
전체 방문자
오늘
어제
  • 전체보기 (72)
    • Course (64)
      • MS-SQL (10)
      • MY-SQL (12)
      • Oracle (2)
      • PostgreSQL (1)
      • ASP.NET with C# (5)
      • PHP (14)
      • Java (1)
      • javaScript (11)
      • A quick tip (1)
      • CodeIgniter (1)
      • CSS (3)
      • 운영체제 (2)
      • Git (1)
      • 리눅스 (0)
    • Utility (4)
    • 와우 (2)
      • 애드온 (2)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 보안 주체
  • 테이블 복사
  • 테이블
  • 이베리스
  • 수동삭제
  • 와우클래식
  • 쿼리
  • 구조 복사
  • dbo
  • 1326
  • 19c
  • 3DP
  • 삭제
  • MSSQL
  • 15517
  • 3자리
  • wowclassic
  • share
  • 자동 줄 바꿈
  • 공유폴더
  • 렌카드
  • 콤마
  • Benik
  • 접속안됨
  • power point
  • table
  • Elv
  • comma
  • error
  • width

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
이베리스

Iberis

Course/MY-SQL

MySQL에서 MINUS와 INTERSECT 집합 연산

2015. 12. 3. 14:30

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 집합 연산 사용

MINUS 연산은 첫번째 집합에는 있지만, 두번째 집합에는 없는 것들을 조회하는 것이므로,
아래와 같이 3가지 방법으로 해결할 수 있다.




예제 쿼리)
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;

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


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


저작자표시 비영리 변경금지

'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
    'Course/MY-SQL' 카테고리의 다른 글
    • Auto_Increment 재정렬 하기
    • Error Code: 1153 - Got a packet bigger than 'max_allowed_packet' bytes
    • mysql 한글 깨짐 문제 해결
    • MySQL : 테이블 복사 (다른 DB간 테이블 복사 포함)
    이베리스
    이베리스
    Developer

    티스토리툴바