- 핵심 원리
- INTERSECT 연산자는 두 개 이상의 SELECT 쿼리의 결과 집합에서 공통된 부분만을 추출하여 출력합니다. 이는 교집합의 개념과 동일하게, 각 쿼리의 결과에서 중복되는 데이터만을 반환합니다.
- 실무에서 쓰이는 이유
- 실무에서는 여러 데이터 소스에서 공통된 항목을 찾고자 할 때 INTERSECT를 사용합니다. 예를 들어, 두 개의 고객 데이터베이스에서 동일한 고객을 추출하거나, 여러 프로젝트에서 공통적으로 참여한 팀원을 확인하는 경우에 유용합니다.
- 실무에서 구체적으로 사용되는 상황 예측
- 두 개의 마케팅 캠페인에 공통적으로 참여한 고객 명단을 추출할 때.
- 여러 부서에서 동일하게 제출한 서류를 확인할 때.
- 여러 재고 관리 시스템에서 동일한 상품이 등록된 목록을 추출할 때.
- 병원에서 여러 진료과목에서 중복된 진료를 받은 환자 목록을 확인할 때.
- 자주 사용되는 윈도우 표시 및 설명
- ROW_NUMBER(): 결과 집합 내에서 각 행에 고유한 번호를 부여합니다.
sql SELECT ename, sal, ROW_NUMBER() OVER (ORDER BY sal DESC) AS RowNum FROM emp;
- RANK(): 동일한 값을 가진 행에 동일한 순위를 부여하며, 순위의 간격이 발생할 수 있습니다.
sql SELECT ename, sal, RANK() OVER (ORDER BY sal DESC) AS Rank FROM emp;
- DENSE_RANK(): 동일한 값을 가진 행에 동일한 순위를 부여하되, 순위 간의 간격이 발생하지 않습니다.
sql SELECT ename, sal, DENSE_RANK() OVER (ORDER BY sal DESC) AS DenseRank FROM emp;
- NTILE(): 결과 집합을 지정한 수의 그룹으로 나누고, 각 행에 그룹 번호를 할당합니다.
sql SELECT ename, sal, NTILE(4) OVER (ORDER BY sal DESC) AS Quartile FROM emp;
- 연습 문제
- EMP 테이블에서 부서 번호가 10번과 20번에 속한 사원들, 그리고 부서 번호가 20번과 30번에 속한 사원들의 교집합을 추출하는 쿼리를 작성하세요.
- 연습 문제 해답 및 테이블 표시
SELECT ename, sal, job, deptno
FROM emp
WHERE deptno IN (10, 20)
INTERSECT
SELECT ename, sal, job, deptno
FROM emp
WHERE deptno IN (20, 30);
ENAME | SAL | JOB | DEPTNO |
---|
ADAMS | 1100 | CLERK | 20 |
FORD | 3000 | ANALYST | 20 |
JONES | 2975 | MANAGER | 20 |
SCOTT | 3000 | ANALYST | 20 |
SMITH | 800 | CLERK | 20 |
- 응용 문제
- 두 개의 테이블에서 중복된 데이터만을 추출하여 교집합을 만드는 쿼리를 작성하세요. 예를 들어, 특정 프로젝트에 참여한 직원들을 두 테이블에서 추출하고, 교집합만을 추출하는 쿼리를 작성하세요.
- 응용 문제 해답 및 테이블 표시
SELECT empno, ename, deptno
FROM project_team1
INTERSECT
SELECT empno, ename, deptno
FROM project_team2;
EMPNO | ENAME | DEPTNO |
---|
7566 | JONES | 20 |
7839 | KING | 10 |
7902 | FORD | 20 |
- 전자상거래 업계에서 쓰일 수 있는 경우 예측
- A 쇼핑몰과 B 쇼핑몰의 회원 데이터베이스에서 동일한 회원을 추출하여 중복되는 고객을 파악할 때.
- 마케팅 캠페인에서 중복된 고객을 제거하여 실제 캠페인 효과를 분석할 때.
- 전자상거래 업계에서 사용할 수 있는 경우 예상 상황 문제 2가지 및 그 경우에 대한 SQL 코드 작성
- A 쇼핑몰과 B 쇼핑몰의 회원 데이터베이스에서 중복된 회원을 추출하기 위한 SQL 코드:
SELECT customer_id, customer_name
FROM shop_a_customers
INTERSECT
SELECT customer_id, customer_name
FROM shop_b_customers;
- 중복된 고객을 제외한 나머지 고객을 확인하기 위한 SQL 코드:
SELECT customer_id, customer_name
FROM shop_a_customers
MINUS
SELECT customer_id, customer_name
FROM shop_b_customers;
- SQL 코드를 시각적으로 이해하기 쉽도록 테이블 예시 작성
- 예상 결과:
CUSTOMER_ID CUSTOMER_NAME
101 John Doe
102 Jane Smith