서브쿼리 (SUBQUERY)
1. 서브쿼리 (SUBQUERY)
- 서브쿼리 (SUBQUERY) : SQL 명령에 포함되어 실행되는 SELECT 명령
- 다수의 SQL 명령으로 얻을 수 있는 결과를 하나의 SQL 명령으로 얻기 위해 사용하는 기능
- 서브쿼리의 명령을 먼저 실행하고 검색되는 결과값을 사용하여 메인쿼리의 명령을 실행
- SELECT 명령의 서브쿼리는 FROM, WHERE, HAVING 에서 '( )'안에 작성하여 실행
- 오라클은 서브쿼리 안에 서브쿼리를 사용하여 검색 가능
2. 서브쿼리 위치에 따른 종류
1.스칼라 서브쿼리 (SCALAR SUBQUERY) : SELECT, WHERE (NESTED SUBQUERY), GROUP BY, HAVING, ORDER BY
- 하나의 SQL 명령으로 취급되지만 내부적으로는 하나의 함수로 처리
- 함수는 다수의 입력이 있어도 처리 결과는 하나만 제공
- 스칼라 서브쿼리도 일종의 함수이므로 중첩 사용 가능하나 서브쿼리의 결과값이 두개 이상이거나 결과값의 자료형이 다른 경우 에러 발생
- 대량의 데이터 처리시 스칼라 서브쿼리의 남발은 성능의 저하는 유발할 수 있으므로 테이블 결합을 사용하는 것을 권장
2.인라인뷰 서브쿼리(INLINE VIEW SUBQUERY) : FROM
- INLINE VIEW : 서브쿼리를 이용하여 일시적으로 생성된 가상의 테이블 (논리적 테이블)
- 테이블 결합 횟수의 감소 및 절차 지향적인 기능 부여
3. WHERE 위치에서 사용
- 서브쿼리를 사용하여 하나의 SECLET 명령으로 원하는 결과 검색 가능
- WHERE에서 조건식의 비교값 대신 서브쿼리의 검색 결과값을 제공받아 검색
- 조건식의 비교대상(컬럼)과 같은 자료형의 값이 하나만 검색되도록 서브쿼리 작성
- 서브쿼리로 단일행(SINGLE-ROW)의 단일컬럼(SINGLE-COLUMN)에 대한 값이 검색
- 서브쿼리의 검색결과가 다중행인 경우 '='연산자 대신 IN 키워드를 사용하여 컬럼값 검색 가능
- 서브쿼리의 검색결과가 다중행인 경우 '>' 또는 '<' 연산자로 컬럼값을 비교하기 위해 서브쿼리 앞에 ANY 또는 ALL 키워드를 사용하여 검색
- 다중행 서브쿼리의 ANY 또는 ALL 키워드 대신 단일행 서브쿼리에 MAX 또는 MIN 함수를 사용하는 것을 권장
4. FROM 위치에서 사용
- FROM에 서브쿼리를 사용하여 검색
- ROWNUM : 검색행에 순차적인 숫자값을 제공하는 키워드
- 인라인뷰에 테이블 별칭을 부여하여 사용 가능 [테이블명.*] 형식으로 표현하여 테이블의 모든 컬럼 검색
- ROWNUM 키워드로 행번호를 제공받아 WHERE의 조건식에서 비교할 경우 '<', '<=' 연산자를 이용한 검색은 가능
- ROWNUM 키워드로 행번호를 제공받아 WHERE의 조건식에서 비교할 경우 '=', '>', '>=' 연산자를 이용한 검색 불가능 (ROWNUM 키워드는 행번호를 검색행에 순차적으로 제공)
=> 테이블의 행을 정렬하여 검색한 후 행번호를 제공받아 인라인뷰로 생성하고 행번호 대신 사용할 수 있는 컬럼 별칭을 부여하여 WHERE의 조건식에서 별칭을 이용한 행 검색
5. 집합연산자 (SET 연산자)
- 집합연산자 : 두 개의 SELECT 명령에 대한 검색결과를 이용하여 집합 결과값을 제공하는 연산자
- 합집합 (UNION), 교집합 (INTERSECT), 차집합 (MINUS)
- 집합연산자 사용시 두 개의 SELECT 명령에 대한 검색대상의 자료형 또는 개수가 다른 경우 에러 발생
- 집합연산자 사용시 두 개의 SELECT 명령에 대한 검색대상의 개수가 다른 경우 동일 자료형의 임의값을 사용하거나 NULL을 사용하여 집합 처리 가능
- 집합연산자 사용시 두 개의 SELECT 명령에 대한 검색대상의 다료형이 다른 경우 변환함수를 사용하여 변환함수를 사용하여 집합 처리 가능
1. 합집합 (UNION)
- 합집합 (UNION) : 두 개의 SELECT 명령으로 검색된 행을 합하여 결과값을 제공하는 연산자
- UNION ALL : 두 개의 SELECT 명령으로 검색된 행을 합하여 결과값을 제공하는 연산자 (중복행 포함)
SELECT 검색대상, ... FROM 테이블명1 UNION SELECT 검색대상, ... FROM 테이블명2
- 두 개의 SELECT 명령은 검색대상의 자료형과 개수가 반드시 일치되도록 검색
2. 교집합 (INTERSECT)
- 교집합 (INTERSECT) : 두 개의 SELECT 명령으로 검색된 행에서 중복된 행을 제공하는 연산자
SELECT 검색대상, ... FROM 테이블명1 INTERSECT
SELECT 검색대상, ... FROM 테이블명2
3. 차집합 (MINUS)
- 차집합 (MINUS) : 두 개의 SELECT 명령으로 검색된 행에 제외한 행을제공하는 연산자
SELECT 검색대상, ... FROM 테이블명1 MINUS SELECT 검색대상, ... FROM 테이블명2