*SUBQUERY(서브쿼리)
- 하나의 SQL문 안에 포함된 또 다른 SQL(SELECT)문
- 메인쿼리(기존쿼리)를 위해 보조 역할을 하는 쿼리문
- SELECT, FROM, WHERE, HAVING절에서 사용 가능
2025.01.20 - [코딩공부/DB] - Oracle - Select문 (01)
2025.01.20 - [코딩공부/DB] - Oracle - Select문 (02)
2025.01.20 - [코딩공부/DB] - Oracle - Select문 (03)
2025.01.20 - [코딩공부/DB] - Oracle - Select문 (04)
Oracle - Select문 (04)
Oracle - Select문 (04)2025.01.20 - [코딩공부/DB] - Oracle - Select문 (01)2025.01.20 - [코딩공부/DB] - Oracle - Select문 (02)2025.01.20 - [코딩공부/DB] - Oracle - Select문 (03) JOIN 용어 정리JOIN하나 이상의 테이블에서 데
jimin10722.tistory.com
-- 서브쿼리 예시 1.
-- 부서코드가 노옹철사원과 같은 소속의 직원의
--이름, 부서코드 조회하기
--1) 사원명이 노옹철인 사람의 부서코드 조회
SELECT DEPT_CODE FROM EMPLOYEE
WHERE EMP_NAME ='노옹철';
--2) 부서코드가 D9인 직원을 조회
SELECT EMP_NAME,DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE = 'D9';
--3) 부서코드가 노옹철사원과 같은 소속의 직원 명단 조회
--> 위의 2단계를 하나의 쿼리로 ! --> 1) 쿼리문을 서브쿼리로!!
--메인쿼리
SELECT EMP_NAME,DEPT_CODE FROM EMPLOYEE
WHERE DEPT_CODE = (SELECT DEPT_CODE FROM EMPLOYEE
WHERE EMP_NAME ='노옹철');
--서브쿼리
-- 서브쿼리 예시 2.
-- 전 직원의 평균 급여보다 많은 급여를 받고 있는 직원의
-- 사번, 이름, 직급코드, 급여 조회
--1) 전 직원의 평균 급여 조회
SELECT AVG(SALARY) FROM EMPLOYEE;
--2) 직원들 중 급여가 3047663원 이상인 사원들의 사번, 이름,직급코드, 급여조회
SELECT EMP_ID,EMP_NAME,JOB_CODE, SALARY FROM EMPLOYEE
WHERE SALARY >= 3047663;
--3) 전 직원의 평균 급여보다 많은 급여를 받고 있는 직원 조회
-- 위의 2단계를 하나의 쿼리로 가능하다!!--> 1) 쿼리문을 서브쿼리로 작성!!
SELECT EMP_ID,EMP_NAME,JOB_CODE, SALARY FROM EMPLOYEE
WHERE SALARY >= (SELECT AVG(SALARY) FROM EMPLOYEE);
서브쿼리 유형
- 단일행 (+ 단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 1개일때
- 다중행 (+ 단일열) 서브쿼리 : 서브쿼리의 조회 결과 값의 개수가 여러개일때
- 다중열 서브쿼리 : 서브쿼리의 SELECT절에 나열된 항목수가 여러개일 때
- 다중행 다중열 서브쿼리 ; 조회 결과 행 수와 열 수가 여러개 일 때
- 상관 서브쿼리 : 서브쿼리가 만든 결과 값을 메인 쿼리가 비교 연산할 때 메인 쿼리 테이블의 값이 변경되면 서브쿼리의 결과값도 바뀌는 서브쿼리
- 스칼라 서브쿼리 : 상관 쿼리이면서 결과 값이 하나인 서브쿼리
* 서브쿼리 유형에 따라 서브쿼리 앞에 붙은 연산자가 다름
1. 단일행 서브쿼리 (SINGLE ROW SUBQUERY)
서브쿼리의 조회 결과 값의 개수가 1개인 서브쿼리
단일행 서브쿼리 앞에는 비교 연산자 사용
<, >, <=, >=, =, !=/^=/<>
2. 다중행 서브쿼리 (MULTI ROW SUBQUERY)
서브쿼리의 조회 결과 값의 개수가 여러행일 때
>> 다중행 서브쿼리 앞에는 일반 비교연산자 사용 x
- IN / NOT IN : 여러 개의 결과값 중에서 한 개라도 일치하는 값이 있다면 혹은 없다면 이라는 의미(가장 많이 사용!)
- > ANY, < ANY : 여러개의 결과값 중에서 한개라도 큰 / 작은 경우 가장 작은 값보다 큰가? / 가장 큰 값 보다 작은가?
- > ALL, < ALL : 여러개의 결과값의 모든 값보다 큰 / 작은 경우 가장 큰 값 보다 큰가? / 가장 작은 값 보다 작은가?
- EXISTS / NOT EXISTS : 값이 존재하는가? / 존재하지 않는가?
3. 다중열 서브쿼리(단일행== 결과값은 한행)
서브쿼리 SELECT 절에 나열된 컬럼 수가 여러개 일때
4. 다중행 다중열 서브쿼리
서브쿼리 조회 결과 행 수와 열 수가 여러개 일 때
5. 상[호연]관 서브쿼리 (메인쿼리 1행씩 우선 해석, 서브쿼리 나중에 해석)
상관쿼리는 메인쿼리가 사용하는 테이블 값을 서브쿼리가 이용해서 결과를 만듦
메인쿼리의 테이블 값이 변경되면 서브쿼리의 결과값도 바뀌게 되는 구조임
상관쿼리는 먼저 메인쿼리 한행을 조회하고
해당 행이 서브쿼리의 조건을 충족하는지 확인하여 SELECT를 진행함
6. 스칼라 서브쿼리
SELECT절에 사용되는 서브쿼리 결과로 1행(단일행)만 반환
--> SELECT절에 작성하는 단일행 서브쿼리
SQL에서 단일 값을 가르켜 '스칼라'라고 함
7. 인라인 뷰(INLINE-VIEW)
FROM 절에서 서브쿼리를 사용하는 경우로
서브쿼리가 만든 결과의 집합(RESULT SET)을 테이블 대신에 사용한다.
8. WITH
서브쿼리에 이름을 붙여주고 사용시 이름을 사용하게 함
인라인 뷰로 사용될 서브쿼리에 주로 사용됨
실행 속도도 빨라진다는 장점이 있다.
9. RANK() OVER / DENSE_RANK() OVER
RANK() OVER : 동일한 순위 이후의 등수를 동일한 인원 수 만큼 건너뛰고 순위 계산
EX) 공동 1위가 2명이면 다음 순위는 2위가 아니라 3위
DENSE_RANK() OVER : 동일한 순위 이후의 등수를 이후의 순위로 계산
EX) 공동 1위가 2명이어도 다음 순위는 2위
'코딩공부 > DB' 카테고리의 다른 글
Oracle - DDL (01) (0) | 2025.03.02 |
---|---|
Oracle - TCL문 (01) (0) | 2025.02.08 |
Oracle - DML (01) (0) | 2025.02.08 |
Oracle - Select문 (04) (0) | 2025.01.20 |
Oracle - Select문 (03) (0) | 2025.01.20 |