데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL ( 집합연산자 )

동띠기 2021. 7. 6. 23:16
728x90

집합이라고 하면 , 본인이 중학교때 배웠던 수학을 떠올리기 쉬운데 그것과 거의 흡사하다.
여러건의 데이터가 모여있다는 뜻으로 주요 집합연산자는 4가지 종류가 있다.

UNION :  두 집합의 결과를 합쳐서 출력, 중복값 제거하고 정렬
UNION ALL : 두 집합의 결과를 합쳐서 출력, 중복 값 제거 안하고 정렬 안함
INTERSECT : 두 집합의 교집합 결과를 출력 및 정렬
MINUS : 두 집합의 차집합 결과를 출력 및 정렬 / 쿼리 순서가 중요

집합연산자는 주의사항이 있다.

1. 두 집합의 SELECT절에 오는 컬럼의 개수가 동일해야 한다.
2. 두 집합의 SELECT절에 오는 컬럼의 데이터 형이 동일해야 한다.
3. 두 집합의 컬럼명은 달라도 상관없음.

UNION / UNION ALL ( 두 집합의 결과를 더한다 )

UNION 연산자와 UNION ALL 연산자는 SQL의 특징에 따라 사용처가 다르다.
예를들어 구인구직 사이트에서 직장을 검색할 때 지역을 서울과 경기에 체크를 했다고 가정하면
유니온을 사용할 경우 두곳 중 한곳만 나오게 된다.

주의사항은 기존에 존재하던 SQL에 검색 조건이 한가지가 더 추가가 될 때 UNION / UNION ALL을 사용하여
새로운 SQL을 추가해서 사용하는 경우가 많다. 이런 방법은 성능에 아주 나쁜 영향을 미친다.
그래서 UNION 은 많이 연결할 수록 SQL  성능이 아주 많이 떨어진다. 그래서 가급적 DECODE나 CASE또는 다른 방법들을 사용하여
전체 SQL을 간결하게 작성하는 습관을 들여야한다.

 

중복제거
중복제거 안됨

 

INTERSECT 연산자 : 교집합 부분을 찾아내는 연산자
아래의 쿼리는 STUDENT테이블을 사용하여 101번 학과와 201번 학과를 복수전공하는 사람의 이름을 출력하는 쿼리다

DEPTNO1 은 1전공 DEPTNO2는 2전공
오라클은 교집합을 정렬해서 찾게 된다. INTERSECT 연산자는 정렬을 동반하게 됨으로 많은 데이터를 대상으로 할 경우 속도가 느려진다는 점을 꼭 기억해야한다.

 

 

MINUS 연산자 - 큰 집합에서 작은 집합을 빼는 집합연산자이다.
EMP테이블에서 직원들의 급여를 인상해주기 위해 명단을 출력하는데 급여가 2500이하인 사람만을 대상으로 하고 싶다면 아래와 같다.

 

728x90