모든지 기록하자!

[Oracle] SUB QUERY 본문

Database

[Oracle] SUB QUERY

홍크 2021. 5. 31. 20:35
728x90

서브 쿼리의 정의

  1. 서브 쿼리는 하나의 SELECT 문장장의 절 안에 포함된 또 하나의 SELECT 문장이다.
  2. 서브 쿼리를 포함 하고 있는 쿼리문을 메인 쿼리, 포함된 또 하나의 쿼리를 서브 쿼리라고 한다.
  3. 서브 쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 둘러쌓아야 한다.
  4. 서브 쿼리는 메인 쿼리가 실행되기 이전에 한 번만 실행된다.
-- SUB QUERY
-- QUERY 안의 QUERY
-- 한개의 행(ROW, RECORD)에서 결과 값이 반환되는 QUERY

    SELECT  단일 ROW 단일 COLUMN(산출되는 데이터는 한개, 컬럼도 한개)
    FROM    다중 ROW 다중 COLUMN
    WHERE   다중 ROW 다중 COLUMN

 

단일 행 서브 쿼리

  1. 단일 행(Single Row) 서브 쿼리는 수행 결과가 오직 하나의 로우(행, row)만을 반환하는 서브 쿼리를 말한다.
  2. 단일 행 서브 쿼리문은 메인 쿼리의 WHERE 절에서는 단일 행 비교 연산자인 =, >, >=, <, <=, <>를 사용해야 한다.
-- SELECT
SELECT employee_id, first_name,
    (SELECT first_name
    FROM employees
    WHERE employee_id = 100)
FROM employees;

SELECT first_name,
    (SELECT SUM(salary) FROM employees),
    (SELECT AVG(salary) FROM employees)
FROM employees;

SELECT first_name, salary, (SELECT AVG(salary) FROM employees)
FROM employees
WHERE department_id = 30;

 

다중 행 서브 쿼리

  1. 다중 행 서브 쿼리는 서브 쿼리에서 반환되는 결과가 하나 이상의 행일 때 사용한다.
  2. 다중 행 서브 쿼리는 반드시 다중행 연산자와 함께 사용해야 한다.
종류 의미
IN 메인 쿼리의 비교조건이 서브 쿼리의 결과 중에서 하나라도 일치하면 참이다.
ANY, SOEM 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참이다.
ALL 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참이다.
EXIST 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참이다.

 

-- FROM
SELECT empno, ename, sal
FROM (  SELECT employee_id as empno, first_name as ename, salary as sal
        FROM employees
        WHERE department_id = 100 )
WHERE sal > 8000;

-- 부서번호가 50번, 급여가 6000이상인 사원
SELECT *
FROM employees
WHERE department_id = 50
    AND salary >= 6000;

SELECT employee_id, first_name, salary, last_name
FROM (  SELECT *
        FROM employees
        WHERE department_id = 50)
WHERE salary > 6000;

-- 업무별 급여의 합계, 인원수, 사원명, 월급
SELECT job_id, COUNT(*), first_name
FROM employees
GROUP BY job_id;

SELECT e.employee_id, e.first_name, j."급여합계", j.인원수
FROM employees e, ( SELECT job_id, SUM(salary) as "급여합계", COUNT(*) as 인원수
                    FROM employees
                    GROUP BY job_id) j;

-- where
-- (평균 급여)보다 많이 받는 사원
SELECT employee_id, first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary)                   
                FROM employees);

-- 부서가 90인 사원의 업무명
SELECT job_id, first_name, department_id
FROM employees
WHERE job_id IN(SELECT job_id
                FROM employees
                WHERE department_id = 90);

-- 부서별로 가장 급여를 적게 받는 사원의 급여와 같은 급여를 받는 사원
SELECT first_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
                 FROM employees
                 GROUP BY department_id); 
                
-- 부서별로 가장 급여를 적게 받는 사원과 급여
SELECT first_name, employee_id, salary, department_id
FROM employees
WHERE (department_id, salary) IN  ( SELECT department_id, MIN(salary)
                                    FROM employees
                                    GROUP BY department_id)

 

728x90

'Database' 카테고리의 다른 글

[Oracle] 무결성 제약 조건  (0) 2021.06.01
[Oracle] SUB QUERY 예제  (0) 2021.05.31
[Oracle] ORDER BY , GROUP BY 예제  (0) 2021.05.28
[Oracle] hr 표준함수 예제  (0) 2021.05.28
[Oracle] JOIN 과 예시  (0) 2021.05.28
Comments