mingming

Oracle - Subquery 본문

새싹 하이브리드 클라우드/Database

Oracle - Subquery

mingming_96 2023. 10. 7. 21:10

Subquery 

  • Subquery는 SQL 에서 사용되는 중첩된 query로, 하나의 SQL 문 안에 포함된 다른 SQL 문 입니다.
  • 주로 데이터 검색, 필터링, 계산, 조인 등 다양한 데이터베이스 작업에서 사용됩니다. 

 

Subquery 구문 

  • Subquery는 main query 전에 실행됩니다. 
  • Subquery 결과는 main query에서 사용됩니다.
  • Subquery는 테이블 자체의 데이터에 종속되는 조건을 사용하여 테이블에서 행을 선택해야하는 경우에 매우 유용합니다. 
SELECT select_list
FROM table
WHERE expr operator (SELECT select_list
                     FROM table);
  • expr : 메인 쿼리의 행과 비교할 조건을 지정하는 부분입니다.
  • operator : 비교 연산자를 사용하여 서브쿼리 결과를 비교합니다.
SELECT last_name, hire_date
FROM employees
WHERE hire_date > (SELECT hire_date 
                   FROM employees
                   WHERE last_name = 'Davies');

 

Subquery 위치

  • WHERE 절
  • HAVING 절
  • FROM 절

 

Subquery 사용 규칙

  • Subquery는 괄호로 묶습니다.
  • 가독성을 위해 비교 조건의 오른쪽에 Subquery를 배치합니다. 그러나 Subquery는 비교 연산자의 양쪽 어디에나 사용할 수 있습니다. 
  • single-row subquery에는 단일 행 연산자를 사용하고 multiple-row subquery에는 다중행 연산자를 사용합니다.  

 

single-row subquery

  • 결과 값으로 한 행만 반환합니다.
  • 단일 행 비교 연산자를 사용합니다.
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = (SELECT job_id
                FROM employees
                WHERE last_name = 'Taylor'
AND salary > (SELECT salary
              FROM employees
              WHERE last_name = 'Taylor');

 

multiple-row subquery

  • 결과 값으로 다중 행을 반환합니다.
  • 다중 행 비교 연산자를 사용합니다.
SELECT department_id, department_name
FROM departments
WHERE department_id IN (SELECT department_id
                        FROM employees
                        WHERE salary > 10000);

 

다중 행 비교 연산자 

ANY 연산자 

subquery 결과 집합에서 하나 이상의 행을 비교할 때 사용됩니다.

 

ALL 연산자

subquery 결과 집합에서 모든 행을 비교할 때 사용됩니다.

SELECT * 
FROM departments
WHERE salry > ANY (SELECT salary
                   FROM employees
                   WHERE salary < 10000);

 

IN 연산자

subquery 결과 집합에서 일치하는 값이 있는지 여부를 비교할 때 사용됩니다.

SELECT *
FROM departments
WHERE department_id IN (SELECT department_id
                        FROM employees
                        WHERE salary > 10000);

 

SOME 연산자 

ANY 연산자와 유사하게 작동되며, subquery 결과 집합에서 하나 이상의 행을 비교할 때 사용됩니다.

 

Subquery 에서 그룹 함수 사용 

SELECT last_name, job_id, salary
FROM employees
WHERE salary = (SELECT MIN(salary)
                FROM employees);

 

HAVING 절 

  • Oracle 서버는 Subquery를 먼저 실행합니다
  • Oracle 서버는 main query의 HAVING 절로 결과를 반환합니다.
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary)
                      FROM employees
                      WHERE department_id = 30);

 

이 명령문에서 잘못된 점은?

SELECT last_name, job_id
FROM employees
WHERE salary = (SELECT MIN(salary)
                FROM employees
                GROUP BY department_id);
  • ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.
    01427. 00000 -  "single-row subquery returns more than one row"

Subquery의 결과가 두 개이상의 행을 반환하기 때문에 다중 행 비교 연산자를 사용해야 합니다. 

'새싹 하이브리드 클라우드 > Database' 카테고리의 다른 글

Oracle - 단일 행 함수  (2) 2023.10.09
Oracle - 집합연산자  (1) 2023.10.08
Oracle - DELETE & TRUNCATE  (0) 2023.10.07
Oracle - 제약 조건 & Subquery  (0) 2023.10.07
Oracle - SQL (DDL)  (2) 2023.10.07