[SQL] 집합 연산자

멋쟁이펭귄맨·2021년 8월 19일
0

이 게시글은 패스트캠퍼스의 '데이터베이스와 SQLD 합격패스 Online' 강의를 요약한 내용입니다.


집합 연산자의 종류


종류설명
UNION여러 SQL문의 결과에 대한 합집합
중복된 행은 한개의 행으로 출력
데이터를 정렬하여 출력한다.
UNION ALL여러 SQL문의 결과에 대한 합집합
중복된 행을 그대로 결과로 표시
INTERSECT여러 SQL문의 결과에 대한 교집합
중복된 행은 한개의 행으로 출력
EXCEPT위의 SQL문의 집합에서 아래의 SQL문의 집합을 뺀 결과를 표시한다.

UNION, UNION ALL

  • UNION 명령어는 데이터를 정렬
SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
UNION  
SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE 
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
;

  • UNION ALL 명령어는 데이터를 정렬하지 않음
SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
UNION ALL
SELECT A.EMP_NO, A.EMP_NM, A.BIRTH_DE 
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
;

  • UNION ALL 명령어는 중복행을 그대로 보여줌
SELECT A.EMP_NM, A.BIRTH_DE
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
UNION ALL
SELECT A.EMP_NM, A.BIRTH_DE
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
;

  • UNION 명령어는 중복행(이관심)을 제거한 값을 보여줌
SELECT A.EMP_NM, A.BIRTH_DE
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19600101' AND '19691231'
UNION  
SELECT A.EMP_NM, A.BIRTH_DE
FROM TB_EMP A 
WHERE A.BIRTH_DE BETWEEN '19700101' AND '197901231'
;

INTERSECT

  • INTERSECT를 사용한 SQL과 EXISTS 혹은 JOIN을 사용한 SQL문은 같은 결과를 보여준다.
  • INTERSECT를 통해 작성하는 SQL문이 훨씬 길고 비효율적이여서 잘 사용하지 않는다.
SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
WHERE A.EMP_NO = B.EMP_NO
AND B.CERTI_CD = C.CERTI_CD
AND C.CERTI_NM = 'SQLD'
INTERSECT 
SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
WHERE A.EMP_NO = B.EMP_NO
AND B.CERTI_CD = C.CERTI_CD
AND A.ADDR LIKE '%용인%';

SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
WHERE A.EMP_NO = B.EMP_NO
AND B.CERTI_CD = C.CERTI_CD
AND C.CERTI_NM = 'SQLD'
AND EXISTS ( SELECT 1 
               FROM TB_EMP K 
               WHERE K.EMP_NO = A.EMP_NO 
                 AND K.ADDR LIKE '%용인%')
;

SELECT A.EMP_NO, A.EMP_NM, A.ADDR, B.CERTI_CD, C.CERTI_NM
  FROM TB_EMP A , TB_EMP_CERTI B, TB_CERTI C 
 WHERE A.EMP_NO = B.EMP_NO
   AND B.CERTI_CD = C.CERTI_CD
   AND C.CERTI_NM = 'SQLD'
   AND A.ADDR LIKE '%용인%';

MINUS 연산

  • MINUS 연산은 차집합 개념으로, 위의 SELECT 문에서 아래 조건들을 제외한 결과를 보여준다.
SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD FROM TB_EMP A 

MINUS 
SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A
WHERE A.DEPT_CD = '100001'

MINUS 
SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A
WHERE A.DEPT_CD = '100002'

MINUS 
SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A
WHERE A.DEPT_CD = '100003'

MINUS 
SELECT A.EMP_NO, A.EMP_NM, A.SEX_CD, A.DEPT_CD  FROM TB_EMP A 

WHERE A.SEX_CD = '1'
;

위 SQL문

제외 후

profile
안녕하세요

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN