서브쿼리 란?
- 하나의 쿼리 문장 내에 포함된 또 하나의 쿼리 문장
- 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호 안에 넣어야 함
- 메인 쿼리가 실행되기 이전에 한 번만 실행 된다.
SELECT절 서브쿼리
- Select 절 안에 서브쿼리가 있다
- 반드시 단일 행 이나 sum,count 등의 집계 함수를 거친 단일 값으로 리턴되어야 한다.
SELECT 학생이름,
( SELECT 학과.학과이름
FROM 학과
WHERE 학과.학과ID = 학생.학생ID ) AS 학과이름
FROM 학생
WHERE 학생이름 = '홍길동' ;
FROM절 서브쿼리(인라인뷰 서브쿼리)
- 인라인뷰(Inlibe Views) 라고 불리며 FROM절 안에 서브쿼리가 들어 있다.
- 반드시 서브쿼리의 결과는 반드시 하나의 테이블로 리턴되어야 한다.
SELECT 학생이름, 수학점수
FROM ( SELECT 학생.학생이름 AS 학생이름,
과목.과목점수 AS 수학점수
FROM 학생, 과목
WHERE 학생.학생이름 = 과목.학생이름
AND 과목.과목이름 = '수학' ) ;
WHERE절 서브쿼리(중첩 서브쿼리)
- WHERE절 안에 서브쿼리가 들어있다.
- 단일행과 복수행 둘다 리턴이 가능하다
SELECT *
FROM 학생
WHERE 학생.학생이름 IN ( SELECT 과목.학생이름 FROM 과목 WHERE 과목.과목이름 = '수학' ) ;
단일행 서브쿼리
- 오직 하나의 행만 반환
- 하나의 결과를 가지고 메인쿼리는 비교연산자를 통해 쿼리를 수행한다.
- 비교연산자는 단일행 비교연산자를 사용한다(>,>=,=,<, ...)
// ex ) 사원들의 평균 급여보다 더 많은 급여를 받는 사원을 검색
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ( SELECT AVG(SAL)
FROM EMP);
다중행 서브쿼리
- 서브쿼리의 수행결과가 두 건 이상의 데이터를 반환
- 비교연산자는 다중행 비교연산자를 사용 합니다.(IN,ANY,SOME,ALL,EXISTS)
IN
- 메인쿼리의 비교조건이 서브쿼리의 결과중에서 하나라도 일치하면 참
SELECT FOOD_TYPE,REST_ID,REST_NAME,FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE,FAVORITES) IN (SELECT FOOD_TYPE,MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE)
위 퀴리도 가능하다
ALL
- 메인쿼리의 비교조건이 서브쿼리의 검색결과와 모든 값이 일치하면 참
- 메인쿼리 < ALL(서브쿼리) : 서브쿼리의 결과와 비교하여 최소값 반환
- 메인쿼리 > ALL(서브쿼리) : 서브쿼리의 결과와 비교하여 최대값 반환
// ex ) 30번 소속 사원들 중 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사람의 이름과 급여를 출력
SELECT ENAME, SAL
FROM EMP
WHERE SAL > ALL ( SELECT SAL
FROM EMP
WHERE DEPTNO = 30 );
ANY
- 메인쿼리의 비교조건이 서브쿼리의 검색결과와 하나 이상이 일치하면 참
- 메인쿼리 < ANY(서브쿼리) : 서브쿼리의 결과와 비교해 메인쿼리의 데이터중 한개라도 서브쿼리 결과보다 작다면 최소값 반환
- 메인쿼리 > ANY(서브쿼리) : 서브쿼리의 결과와 비교해 메인쿼리의 데이터중 한개라도 서브쿼리 결과보다 크다면 최대값 반환
EXISTS
- 메인쿼리의 비교조건이 서브쿼리의 검색결과 중에 하나라도 만족하는 값이 존재하면 참
- 해당 행이 존재하는지 여부만 확인 합니다.
- 처리 순서 : 메인쿼리 -> 서브쿼리
- IN은 실제 존재하는 데이터들의 모든 값까지 확인합니다.
- NOT EXISTS는 메인쿼리의 컬럼명과 서브쿼리의 컬럼명을 비교하여 일치하지 않으면 메인쿼리 테이블의 모든 행을 반환합니다.
- 메인쿼리의 각 행에 대해 서브쿼리가 한 번만 실행되며, 조건을 만족하는 첫 번째 행을 찾으면 더 이상 수행 하지 않기 때문에 효율적일 수 있다
- 대규모 데이터 집합을 처리할 때 'EXISTS'가 더 효율적일 수 있습니다.
'DB > 오라클' 카테고리의 다른 글
[Oracle] 오라클 WITH 절 사용법 및 동작 방식 (0) | 2024.10.13 |
---|---|
[Oracle] 조건에 맞는 사용자 정보 조회하기 (0) | 2024.09.23 |
[Oracle] 문자열 합치는 방법(||, CONCAT()) (0) | 2024.09.23 |
[ORACLE] INSTR() 함수: 문자 찾기 (0) | 2024.09.09 |
[ORACLE] SUBSTR 함수 사용법(문자열 자르기) (0) | 2024.09.09 |