Learning/SQL

서브쿼리 - 다중행

cozy coding 2020. 6. 18. 14:24

<서브쿼리 -다중행>

 

  • 서브 쿼리에서 여러 행이 검색되는 쿼리문. 연산자를 제외하면 단일 행 서브 쿼리와 같음

1
2
3
SELECT [DISTINCT] 컬럼, 컬럼...
FROM 테이블
WHERE 컬럼 <다중행 연산자> (SELECT 컬럼 FROM 테이블);
cs

 

  • 다중행 연산자의 종류

    • IN: 검색된 값 중 하나만 일치하면 참

    • 비교연산자+ANY(서브쿼리): 검색된 값 중 조건에 맞는 값이 하나 이상 있으면 참

    • 비교연산자+ALL(서브쿼리): 모든 검색된 값과 조건에 맞아야 참

 


 

  • IN

  • employees 테이블의 90번 부서의 월급과 같은 월급을 받는 직원들을 출력

1
2
3
4
5
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary IN (SELECT salary
                 FROM employees
                 WHERE department_id = 90);
cs

 

 

 


 

  • ANY: 하나의 조건만 만족해도 됨 (앞에 연산자가 꼭 붙어야함)

  • employees 테이블의 90번 부서의 어느 한 직원보다 급여가 같거나 많은 월급을 받는 직원들을 출력

1
2
3
4
5
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary >=ANY (SELECT salary
                    FROM employees
                    WHERE department_id = 90);
cs

 

 

 


 

  • ALL: 모든 조건을 만족해야 함

  • employees 테이블의 90번 부서의 직원들보다 급여가 같거나 많은 월급을 받는 직원들을 출력

1
2
3
4
5
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary >=ALL (SELECT salary
                    FROM employees
                    WHERE department_id = 90);
cs

 

 

 


 

 

<서브쿼리 다중행 예제>

 

  • 부서번호 (department_id)가 20번인 직원들의 매니저번호(manager_id)와 같은 매니저를 가지는 직원들을 출력 (단 20번 부서의 직원은 제외)

1
2
3
4
5
6
7
SELECT employee_id, first_name, job_id 직종, salary 급여
FROM employees
WHERE manager_id IN (SELECT manager_id
                FROM employees
                WHERE department_id=20)
      AND department_id !=20;
 
cs

 

 

 

 

  • job_id가 'ST_MAN'인 직원들 중 어느 한 직원 보다도 급여가 작은 직원들을 출력 

(ST_MAN 직책의 급여는 5800~8200사이. 따라서 8200보다 급여가 작은 직원들이 출력됨)

1
2
3
4
5
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY (SELECT salary
                    FROM employees
                    WHERE job_id='ST_MAN');
cs

 

 

 

 

  • 직책이 'IT_PROG'인 직원들보다 급여가 작은 직원들을 출력

(IT_PROG 직책의 급여는 4200~9000사이. 따라서 4200보다 급여가 작은 직원들이 출력됨)

1
2
3
4
5
SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL (SELECT salary
                    FROM employees
                    WHERE job_id='IT_PROG');
cs