--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;