본문 바로가기

Database/Oracle

SUB Query

--Query안의 Query
--한개의 행(row)에서 결과 값이 반환되는 Query

 

 

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

 

 

 

    NVL(컬럼, 컬럼이 NULL의 경우 설정할 값) 
     
    NVL2(컬럼, 컬럼이 NULL이 아닐 경우 설정할 값, 컬럼이 NULL일경우 설정 할 값)

 

 

 

--SELECT : 단일 ROW 단일 COLUMN

SELECT employee_id, first_name,
    (SELECT salary          --단일COLUMN
    FROM employees
    WHERE employee_id = 100),--단일ROW
    (SELECT COUNT(*)         --GROUP함수도 사용가능
    FROM employees)
FROM employees;

 

 

 

--FROM : 다중 ROW 다중 COLUMN

SELECT employee_id, first_name, last_name
FROM (SELECT employee_id, first_name, last_name
        FROM employees
        WHERE departments_id = 20); --서브 Query가 먼저 실행됨
--부서번호가 50번, 급여가 6000이상인 사원
SELECT *
FROM employees
WHERE department_id = 50
    AND salary >= 6000;

SELECT e.employee_id, e.salary
FROM (SELECT employee_id, salary
        FROM employees
        WHERE department_id = 50)e      --위와 동일
WHERE salary >= 6000;
--급여의 합계, 인원수, 사원명, 월급      
    --> 인원수는 그룹함수를 사용해야하나 select은 그룹으로 묶고 이름과 월급을 볼수는 없음(에러 산출)
SELECT e.employee_id, e.salary,
    e.job_id, j.job_id,
    j."급여합계", j."인원수"
FROM employees e, (SELECT job_id, SUM(salary) as "급여합계", COUNT(*) as "인원수"
                    FROM employees
                    GROUP BY job_id) j
WHERE e.job_id = j.job_id;
--e는 사원정보들 e.에서 j.으로 넘어가서 그룹되어 출력가능해짐
--그룹된 정보는 as명으로 출력가능

 

 

 

--where : WHERE   다중 ROW 다중 COLUMN

--현재 테이블에서 평균보다 많이받는 사원들만 산출하라
SELECT first_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
--department_id = 90번의 job_id만 산출
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 department_id, first_name, salary
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, min(salary) --다중 COL
                                    FROM employees
                                    GROUP BY department_id) --다중 LOW
ORDER BY department_id ASC;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Database > Oracle' 카테고리의 다른 글

집합  (0) 2020.06.23
특수 Query  (0) 2020.06.23
헷깔린 문제~  (0) 2020.06.22
문자  (0) 2020.06.19
JOIN  (0) 2020.06.19