본문 바로가기

Oracle/13일

13일차 2

sub query


Abel보다 급여 많이 받는 사람 구하기
ABel의 급여

SELECT salary 
FROM employees
WHERE last_name='Abel';
 SALARY
 ------
  11000

Abel의 급여인 11000보다 큰사람

SELECT last_name, salary
FROM employees
WHERE salary>11000;
 LAST_NAME SALARY
 --------- ------
 King       24000
 Kochhar    17000
 De_Haan    17000
 Hartstein  13000
 Higgins    12000

둘을 합친거

SELECT last_name, salary
FROM employees
WHERE salary > (SELECT salary
                FROM employees
                WHERE last_name = 'Abel');
 LAST_NAME SALARY
 --------- ------
 King       24000
 Kochhar    17000
 De_Haan    17000
 Hartstein  13000
 Higgins    12000

 

이런 경우 sub query안의 데이터가 복수가 나올 경우를 주의해.

각 부서에서 최소급여를 받는 사원을 구해보자.

SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id;
 DEPARTMENT_ID MIN(SALARY)
 ------------- -----------
          NULL        7000
            90       17000
            20        6000
           110        8300
            50        2500
            80        8600
            60        4200
            10        4400

SELECT last_name, salary
FROM employees
WHERE salary = (  SELECT MIN(salary)
                  FROM employees
                  GROUP BY department_id );
ORA-01427: single-row subquery returns more than one row


>IN


SELECT last_name
FROM employees
WHERE job_id = 'IT_PROG' or job_id = 'AD_VP';

--IN사용해서 위와 같게
SELECT last_name
FROM employees
WHERE job_id IN ( 'IT_PROG', 'AD_VP');
 LAST_NAME
 ---------
 Kochhar
 De_Haan
 Hunold
 Ernst
 Lorentz

이걸 사용하면 되겠군.

SELECT department_id, last_name, salary
FROM employees
WHERE salary IN (	SELECT MIN(salary)
                 	FROM employees
                 	GROUP BY department_id )
ORDER BY 1;
 DEPARTMENT_ID LAST_NAME SALARY
 ------------- --------- ------
            10 Whalen      4400
            20 Fay         6000
            50 Vargas      2500
            60 Lorentz     4200
            60 Ernst       6000 --;
            80 Taylor      8600
            90 De_Haan    17000
            90 Kochhar    17000
           110 Gietz       8300
          NULL Grant       7000

정확히 원하는 바는 아니지..

굳이 구하자면 이정도 될까..

SELECT e.department_id, e.last_name, e.salary
FROM employees e JOIN (
  SELECT department_id, MIN(salary) as sal
  FROM employees
  GROUP BY department_id
) d
ON e.department_id = d.department_id 
  AND e.salary = d.sal
ORDER BY 1;
 DEPARTMENT_ID LAST_NAME SALARY
 ------------- --------- ------
            10 Whalen      4400
            20 Fay         6000
            50 Vargas      2500
            60 Lorentz     4200
            80 Taylor      8600
            90 Kochhar    17000
            90 De_Haan    17000
           110 Gietz       8300

          
암튼 IN에 대해 알아보려 한거였고..

 


>ALL, ANY

SELECT last_name, salary
FROM employees 
WHERE salary > ALL (	SELECT min(salary)
                  		FROM employees 
                  		GROUP BY department_id); 
 LAST_NAME SALARY
 --------- ------
 King       24000

sub query중 최대값인 17000보다 큰걸 찾은거지

 


ex)IT_PROG보다 많이 받는 사람
ALL

SELECT last_name, salary
FROM employees 
WHERE salary > ALL (	SELECT salary
                  		FROM employees 
                  		WHERE job_id = 'IT_PROG');  
 LAST_NAME SALARY
 --------- ------
 Zlotkey    10500
 Abel       11000
 Higgins    12000
 Hartstein  13000
 Kochhar    17000
 De_Haan    17000
 King       24000 


IT_PROG 중 최고액인 9000보다 큰사람이지..
 


ANY    : or 조건으로 들어가..                 

SELECT last_name, salary
FROM employees 
WHERE salary > ANY (	SELECT salary
                  		FROM employees 
                  		WHERE job_id = 'IT_PROG'); 
 LAST_NAME SALARY
 --------- ------
 King       24000
 Kochhar    17000
 De_Haan    17000
 Hartstein  13000
 Higgins    12000
 Abel       11000
 Zlotkey    10500
 Hunold      9000
 Taylor      8600
 Gietz       8300
 Grant       7000
 Ernst       6000
 Fay         6000
 Mourgos     5800
 Whalen      4400

IT_PROG 중 최저액인 4200보다 큰사람이지..
         
         
         
               
연습문제 몇개.
--ex1. King의 직속부하
SELECT last_name
FROM employees
WHERE manager_id = (SELECT employee_id 
                    FROM employees
                    WHERE last_name = 'King');                
                
--ex2. 전체사원의 평균 급여보다 많은 급여를 받는 사람들의 last_name, salary
SELECT AVG(salary) FROM employees;
SELECT last_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
     
--ex3. 이름에 u가 포함된 사원과 같은 부서에서 일하는 사원의 last_name, department_id               
SELECT last_name, salary
FROM employees
WHERE department_id IN (
	SELECT department_id FROM employees
	WHERE last_name like '%u%');

.

.

.

.

'Oracle > 13일' 카테고리의 다른 글

13일차 1  (0) 2012.09.20