Data Base/Oracle SQL

23.10.13. Oracle SQL SUBQUERY(서브쿼리)

잇꼬 2023. 10. 13. 18:09
728x90
반응형
SMALL

110번 사원의 급여보다 더 많이 급여를 받는 사원을 출력해주세요

SELECT * 
FROM hr.employees
WHERE salary > 110번 사원의 급여;

방법1)

SELECT salary
FROM hr.employees
WHERE employee_id = 110 ;


방법2) 110번 사원의 급여 = 8200 

SELECT *
FROM hr.employees
WHERE salary > 8200;


방법 1방법 2 를 합치면 질문의 답이 나온다.

SELECT *
FROM hr.employees
WHERE salary > ( -- 서브쿼리문
                SELECT salary
                FROM hr.employees
                WHERE employee_id = 110
                );


■ SUBQUERY(서브쿼리)
    a. SQL 문 안에 SELECT 문을 서브쿼리라고 한다.
    b. SELECT 문의 서브쿼리는 비교연산자 오른쪽에 괄호로() 묶어야 한다. 

■ 중첩서브쿼리(NESTED SUBQUERY)
    a. SUBQUERY(INNER QUERY) 먼저 수행 
    b. 서브쿼리 수행한 값을 가지고 main query(outer query) 수행

/* MAIN QUERY(=OUTER QUERY )  */
SELECT *
FROM hr.employees
WHERE salary > 
/* SUBQUEBY(=INNER QUERY) */
( SELECT salary
  FROM hr.employees
  WHERE employee_id = 110 );


■ 단일행 서브쿼리
    a. 서브쿼리의 결과가 단일값이 나오는 서브쿼리
    b. 단일행 비교연산자(=, >, >=, <, <=, !=, <>, ^=)

SELECT *
FROM hr.employees
WHERE salary >= ( SELECT max(salary)
                 FROM hr.employees
                 WHERE last_name = 'King' );

SELECT *
FROM hr.employees
WHERE job_id >= ( SELECT job_id
                 FROM hr.employees
                 WHERE employee_id = 110 )
AND salary > ( SELECT job_id
               FROM hr.employees
               WHERE employee_id = 110 );


[문제1] 최고 급여를 받는 사원들의 정보를 출력해주세요 

SELECT * 
FROM hr.employees
WHERE salary = ( SELECT max(salary) 
                 FROM hr.employees);


[문제2] 최소 급여를 받는 사원들의 정보를 출력해주세요 

SELECT * 
FROM hr.employees
WHERE salary = ( SELECT min(salary) 
                 FROM hr.employees);


    c. having 절의 비교연산자 오른쪽에 괄호() 묶어서 서브쿼리 사용한다.     

SELECT department_id, sum(salary)
FROM hr.employees
GROUP BY department_id
HAVING sum(salary) > ( SELECT max(salary)
                        FROM hr.employees
                        WHERE department_id = 50);

 

SELECT
    department_id,
    MAX(SUM(salary)) -- 오류발생
FROM hr.employees
GROUP BY department_id;


☆ 해결 방법
    a. 오류발생, 그룹함수를 두번 중첩할 경우 개별 컬럼을 사용할 수 없다.
    b. 서브쿼리를 사용해야 한다.
 
부서별 합계급여 중 최대급여인 부서를 출력해주세요

SELECT department_id, sum(salary)
FROM hr.employees
GROUP BY department_id
HAVING sum(salary) = (
                      SELECT max(sum(salary))
                      FROM hr.employees
                      GROUP BY department_id
                      );

 

SELECT * 
FROM hr.employees
WHERE salary = ( 
                SELECT min(salary)
                FROM hr.employees
                GROUP BY department_id
                );

오류발생: 서브쿼리 결과 값이 여러개가 나왔기 떄문에 단일행 비교연산자를 사용할 수 없다.

728x90
반응형
LIST