Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL Server

SQL Server INTERSECT 연산자 완벽 정리 – 개념, 문법, 실전 예제

SQL Server의 INTERSECT 연산자란?

SQL Server(Transact-SQL)에서 INTERSECT 연산자는 두 개의 데이터 집합 또는 SELECT 문에 공통으로 존재하는 레코드를 반환하는 데 사용됩니다. 한쪽 쿼리에만 존재하고 다른 쪽에는 없는 레코드는 INTERSECT의 결과 집합에서 자동으로 제외됩니다.

INTERSECT 쿼리의 동작 방식

SQL Server INTERSECT 연산자 완벽 정리 – 개념, 문법, 실전 예제

INTERSECT 쿼리가 반환하는 결과를 나타낸 다이어그램

설명: INTERSECT 쿼리는 파란색으로 채워진 영역에 해당하는 레코드를 반환합니다. 즉, dataset1과 dataset2 양쪽 모두에 존재하는 값만 결과에 포함됩니다.

또한 INTERSECT 안의 각 SELECT 문은 결과 집합에서 동일한 수의 열을 가져야 하며, 대응되는 열은 서로 호환되는 데이터 타입이어야 합니다.

INTERSECT 연산자 문법

SELECT expression1, expression2, ... expression_n
FROM table_name
[WHERE condition]
INTERSECT
SELECT expression1, expression2, ... expression_n
FROM table_name
[WHERE condition];

주요 매개변수 설명

  • expression1 ~ expression_n: SELECT 문 간에 비교하려는 열 또는 값입니다. 각 SELECT 문에서 반드시 같은 열일 필요는 없지만, 대응되는 열의 데이터 타입은 일치해야 합니다.
  • table_name: 레코드를 조회할 테이블입니다. FROM 절에는 최소 한 개 이상의 테이블이 지정되어야 합니다.
  • WHERE condition: 선택 사항입니다. 레코드가 결과에 포함되기 위해 만족해야 하는 조건을 지정합니다.

INTERSECT 사용 시 주의사항

  1. 두 SELECT 문은 동일한 수의 표현식을 가져야 합니다.
  2. 각 SELECT 문에서 대응되는 열은 데이터 타입이 서로 같아야 합니다.
  3. INTERSECT 연산자는 두 SELECT 문 사이의 공통 레코드만 반환합니다.

예제 1 – 단일 표현식 사용하기

SELECT product_id
FROM products
INTERSECT
SELECT product_id
FROM inventory;

이 예제에서 product_idproducts 테이블과 inventory 테이블 양쪽 모두에 존재한다면, 해당 값이 INTERSECT의 결과 집합에 포함됩니다.

이번에는 WHERE 조건을 추가해 보겠습니다.

SELECT product_id
FROM products
WHERE product_id >= 50
INTERSECT
SELECT product_id
FROM inventory
WHERE quantity > 0;

첫 번째 데이터 집합은 products 테이블에서 product_id가 50보다 크거나 같은 레코드를 필터링하여 반환합니다. 두 번째 데이터 집합은 inventory 테이블에서 수량(quantity)이 0보다 큰 레코드를 필터링합니다.

예제 2 – 여러 표현식 사용하기

SELECT contact_id, last_name, first_name
FROM contacts
WHERE last_name = 'Anderson'
INTERSECT
SELECT employee_id, last_name, first_name
FROM employees;

이 예제는 두 SELECT 문의 교집합 결과를 반환합니다. contacts 테이블의 레코드에서 contact_id, last_name, first_name 세 값이 모두 employees 테이블의 해당 값들과 일치한다면, INTERSECT 쿼리는 그 레코드를 결과로 반환합니다.

예제 3 – ORDER BY와 함께 사용하기

ORDER BY 절을 INTERSECT 쿼리와 함께 사용하면 최종 결과를 원하는 기준으로 정렬할 수 있습니다.

SELECT supplier_id, supplier_name
FROM suppliers
WHERE supplier_id > 500
INTERSECT
SELECT company_id, company_name
FROM companies
WHERE company_name IN ('Apple', 'Microsoft', 'SQL Server')
ORDER BY 2;

두 SELECT 문에서 열 이름이 서로 다르기 때문에, ORDER BY 절에서는 열 이름 대신 결과 집합에서의 열 위치를 기준으로 참조하는 것이 편리합니다. 위 예제에서는 ORDER BY 2를 사용하여 supplier_name/company_name 열을 오름차순으로 정렬했습니다.

이는 supplier_name/company_name이 결과 집합에서 두 번째 열에 해당하기 때문입니다.