728x90
반응형
서브 쿼리
- 쿼리문 내부에 포함된 또 다른 쿼리문
- 서브 쿼리를 포함하고 있는 쿼리를 메인 쿼리라고 부른다.
- 서브 쿼리의 실행 결과에 따라 단일 행 서브 쿼리와 다중 행 서브 쿼리로 분류된다.
- 단일 행 대상 연산자와 다중 행 연산자가 다르다.
- 서브 쿼리는 비교 또는 연산 값으로 활용되거나 조회해야하는 테이블 대용으로 활용될 수 있다.
단일 행 서브 쿼리
- 서브 쿼리의 결과가 단 하나의 행인 경우
- 단일 값끼리 비교하는 일반 연산자를 사용할 수 있다. (=, >, <, ...)
다중 행 서브 쿼리
- 서브 쿼리의 결과가 2행 이상일 수도 있는 경우
- 다중 행 연산자와 함께 사용해야 한다. (IN, ANY, SOME, ALL, EXISTS ...)
단일 행 서브 쿼리
- 테이블에서 하나의 행을 선택하는 가장 확실한 방법은 기본키를 사용하는 것이다.
-- 값대신 서브 쿼리 사용
SELECT * FROM employees
WHERE salary >= (SELECT salary FROM employees WHERE employee_id = 102);
-- 테이블 대신 서브 쿼리 사용
SELECT * FROM (SELECT job_id, job_title FROM jobs WHERE job_id = 'IT_PROG');
다중 행 서브 쿼리
- IN : 여러 값들 중 일치하는 것이 하나라도 있으면 true
- ANY : 여러 값들 중 하나라도 조건을 만족시키는 것이 있으면 true
- SOME : ANY랑 같음
- ALL : 모든 값들이 조건을 만족시켜야 true
- EXISTS : 값이 하나라도 존재하면 true
-- # IN
-- ex: Steven이라는 사람이 속해있는 직책의 모든 직원들을 조회
SELECT * FROM employees
WHERE job_id IN
(SELECT DISTINCT job_id FROM employees WHERE first_name = 'Steven');
-- # ANY, SOME
SELECT * FROM employees WHERE salary > ANY(8000, 10000, 5000, 8800);
SELECT * FROM employees WHERE salary > SOME(8000, 10000, 5000, 8800);
SELECT * FROM employees WHERE salary > 5000;
-- ex: IT_PROG 직책들 중 가장 못 버는 사람보다 더 많이 버는 사원들을 조회
SELECT * FROM employees WHERE
salary > ANY(SELECT salary FROM employees WHERE job_id = 'IT_PROG')
AND job_id != 'IT_PROG';
-- # ALL
-- ex: 모든 IT 개발자들보다 월급을 많이 받는 사원들을 조회
SELECT * FROM employees WHERE
salary > ALL(SELECT salary FROM employees WHERE job_id = 'IT_PROG');
-- # EXISTS
-- ex: 최대 급여를 받는 사원이 있는 부서를 조회
SELECT * FROM departments dept
WHERE EXISTS
(SELECT employee_id FROM employees emp INNER JOIN jobs USING (job_id)
WHERE salary = max_salary AND emp.department_id = dept.department_id);
728x90
반응형
'DB > Oracle' 카테고리의 다른 글
[Oracle DB] 데이터 추가, 수정, 삭제하기 (0) | 2023.04.23 |
---|---|
[Oracle DB] 테이블 생성하기 (0) | 2023.04.23 |
[Oracle DB] ANSI JOIN (0) | 2023.04.21 |
[Oracle DB] SELF JOIN (0) | 2023.04.21 |
[Oracle DB] OUTER JOIN (0) | 2023.04.21 |