52일차 - SQL (집합 연산자)

Yohan·2024년 5월 5일
0

코딩기록

목록 보기
76/156
post-custom-banner

집합 연산자

여러 SELECT 문의 결과를 하나의 결과 집합으로 결합하는데 사용

UNION

  1. 합집합 연산
  2. 첫번째 쿼리와 두번째 쿼리의 중복정보는 제거
  3. 첫번째 쿼리의 열의 개수와 타입이 두번째 쿼리의 열수와 타입과 동일해야한다.
  4. 자동으로 정렬 (첫번째 컬럼 오름차가 기본값)
  5. 성능상 부하가 일어날 수 있음
SELECT
    emp_no,
    emp_nm,
    birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION
SELECT
    emp_no,
    emp_nm,
    birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19700101' AND '19791231'
; 

UNION ALL

  1. UNION과 같이 두 테이블로 수직으로 합쳐서 보여준다.
  2. UNION과는 달리 중복된 데이터도 보여준다.
  3. 자동 정렬 기능을 지원하지 않아 성능상 유리
SELECT
    emp_no,
    emp_nm,
    birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19600101' AND '19691231'
UNION ALL
SELECT
    emp_no,
    emp_nm,
    birth_de
FROM tb_emp
WHERE birth_de BETWEEN '19700101' AND '19791231'
; 

INTERSECT

  1. 첫번째 쿼리와 두번째 쿼리에서 중복된 행만을 출력
  2. 교집합의 의미
SELECT 
    A.emp_no, A.emp_nm, A.addr
    , B.certi_cd, C.certi_nm
FROM tb_emp A
JOIN tb_emp_certi B
ON A.emp_no = B.emp_no
JOIN tb_certi C 
ON B.certi_cd = C.certi_cd 
WHERE C.certi_nm = 'SQLD'
INTERSECT
SELECT 
    A.emp_no, A.emp_nm, A.addr
    , B.certi_cd, C.certi_nm
FROM tb_emp A
JOIN tb_emp_certi B
ON A.emp_no = B.emp_no
JOIN tb_certi C 
ON B.certi_cd = C.certi_cd 
WHERE A.addr LIKE '%용인%';

MINUS(EXCEPT)

  1. 두번째 쿼리에는 없고 첫번째 쿼리에만 있는 데이터를 보여준다.
  2. 차집합의 개념
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp
MINUS
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp WHERE dept_cd = '100001'
MINUS
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp WHERE dept_cd = '100004'
MINUS
SELECT emp_no, emp_nm, sex_cd, dept_cd FROM tb_emp WHERE sex_cd = '1'
;
profile
백엔드 개발자
post-custom-banner

0개의 댓글