본문 바로가기

정보보호관리자 과정 교육/Oracle

13강 서브 쿼리와 집합 연산자

★ 다중 행 서브 쿼리
SQL> SELECT [DISTINCT/ALL]{* | 컬럼명, ... }
      > FROM 테이블
      > WHERE 컬럼명 <다중 행 연산자> (SELECT 문장 : 서브 쿼리문)

   - 서브 쿼리에 여러 개의 행이 검색되는 쿼리문을 다중 행 서브 쿼리문이라고 한다.
   - 다중 행 서브 쿼리문은 다중 행 연산자를 이용한다.
   - 다중 행 연산자의 종류
      . IN : 나열된(검색된) 값중에 하나만 일치하면 참이다.
      . ANY : 나열된(검색된) 값 중에 조건에 맞는 것이 하나 이상 있으면 참이다.
      . ALL : 모든 나열된(검색된) 값과 조건에 맞아야 한다.


예제 1. 20번 부서원들과 동일한 급여를 받는 사원을 검색한다.


예제 2. 10번 부서원들보다 급여가 낮은 사원을 검색한다.



* 컬럼 > ALL → 컬럼 > MAX() : 가장 큰 값보다 크다
* 컬럼 < ALL → 컬럼 < MIN() : 가장 작은 값보다 작다.
* 컬럼 > ANY → 컬럼 > MIN() : 가장 작은 값보다 크다.
* 컬럼 < ANY → 컬럼 < MAX() : 가장 큰 값보다 작다




★ 다중 열 서브 쿼리
SQL> SELECT [DISTINCT/ALL]{* | 컬럼, ... }
      > FROM 테이블
      > WHERE (컬럼1, 컬럼2, ... ) IN (SELECT 문장 : Sub query문)

   - 서브 쿼리의 SELECT문에 여러 개의 컬럼을 검색하는 것을 다중 열 서브 쿼리 문이라고 한다.
   - 여러 개의 컬럼을 검색하는 서브 쿼리 문을 이용할 때는 반드시 비교 대상 컬럼 과1:1 대응돼야 한다.
   - 다중 열 서브 쿼리에서 서브 쿼리의 검색 결과가 단지 하나의 행이라면 '=' 연산자 사용이 가능하지만 되도록 'IN' 연산자를 이용한다.


예제 3. 20번 부서 사원들과 업무, 보너스가 동일한 사원을 검색한다.



★ 집합 연산자(Set Operators)

합집합

SELECT 문장
UNION [ALL]
SELECT 문장


교집합

SELECT 문장
INTERSECT
SELECT 문장


차집합

SELECT 문장
MINUS
SELECT 문장


   - 두 개의 select문을 조합해서 data를 검색하는 방법을 제공.
   - 두 개의 select문은 동일한 type과 종류의 data를 리턴해야 한다.
   - ORDER BY는 SELECT문 마지막에 한 번만 기술 가능하다.
   - 헤더는 첫 번째 select문에 따라 결정된다.


예제 1. UNION과 UNION ALL의 차이점을 확인해 보자




예제 2. INTERSECT과 MINUS








실습

실습쿼리

다운로드



① 화학과 학생과 평점이 동일한 학생들을 검색한다.


② 화학과 교수와 부임일이 같은 직원을 검색한다.


③ 화학과 학생과 같은 학년에서 평점이 동일한 학생들을 검색한다.


④ 강의를 담당하지 않는 교수의 번호를 검색한다.(집합연산자 이용)


⑤ 수강생이 없는 과목 번호를 검색한다.(집합연산자 이용)







문제 (서브 쿼리가 하나이상 포함되도록 한다.)

실습쿼리

다운로드


1. 10번 부서 사원들과 년봉이 동일한 사원을 검색한다.


2. 기말고사 성적이 핵 화학과목보다 우수한 과목의 과목명과 담당 교수명 검색한다.


3. 10번 부서 사원들과 급여 및 년봉이 동일한 사원을 검색한다.