서브쿼리 (SubQuery) D04

최성진·2023년 2월 13일
0

DBMS

목록 보기
7/12

서브쿼리 (subQuery)

1. 서브쿼리란?

  • Main Query에 반대되는 개념으로 이름을 붙인것
  • 메인쿼리를 구성하는 소단위 쿼리
  • select, insert, delete, update 절에서 모두 사용 가능
  • 서브쿼리의 결과 집합을 메인 쿼리가 중간 결과 값으로 사용
  • 서브 쿼리 자체는 일반쿼리와 다를 바가 없다.
-- 평균급여 6462  
SELECT 	ROUND(AVG(SALARY))  
FROM 	EMPLOYEES e 
;
-- 평균 급여 보다 적게 버는 사람 
SELECT 	*
FROM 	EMPLOYEES e 
WHERE 	SALARY < 6462
;
-- 6462라는 값은 너무 하드코딩임 밑에 처럼 하는게 좋음 


-- 서브쿼리는 ()안에 다시 또 쿼리문 넣는거임 
SELECT 	*
FROM 	EMPLOYEES e 
WHERE 	SALARY < (	SELECT 	ROUND(AVG(SALARY))  
					FROM 	EMPLOYEES e )
;

--us 에 사는 사람들 구해오는거  서브쿼리이용하기
SELECT 	LOCATION_ID 
FROM 	LOCATIONS l 
WHERE 	COUNTRY_ID = 'US'
;
SELECT 	*
FROM 	DEPARTMENTS d 
WHERE 	LOCATION_ID IN (1400, 1500, 1600, 1700)
;

SELECT 	*
FROM 	DEPARTMENTS d 
WHERE 	LOCATION_ID IN (SELECT 	LOCATION_ID 
						FROM 	LOCATIONS l 
						WHERE 	COUNTRY_ID = 'US')
;

--월급이 가장 적은 사원
SELECT	*
FROM 	EMPLOYEES e 
WHERE 	e.SALARY = (	SELECT 	MIN(SALARY) 
						FROM 	EMPLOYEES e2)
;


--월급이 가장 많은 사원
SELECT	*
FROM 	EMPLOYEES e 
WHERE 	e.SALARY = (	SELECT 	MAX(SALARY) 
						FROM 	EMPLOYEES e2)
;

문제

-- 문제1) EMPLOYEES 테이블에서 Kochhar의 급여보다 많은 
-- 사원의 정보를 사원번호,이름,담당업무,급여를 출력하라.
SELECT 	EMPLOYEE_ID , FIRST_NAME , JOB_ID , SALARY 
FROM 	EMPLOYEES e 
WHERE 	SALARY > (	SELECT 	SALARY 
					FROM 	EMPLOYEES e2 
					WHERE 	LAST_NAME = 'Kochhar')
;


-- 문제2) EMPLOYEES 테이블에서 급여의 평균보다 적은 사원의 
-- 사원번호,이름,담당업무,급여,부서번호를 출력하여라.  

SELECT 	EMPLOYEE_ID , FIRST_NAME , JOB_ID , SALARY , DEPARTMENT_ID 
FROM 	EMPLOYEES e 
WHERE 	SALARY <(	SELECT 	ROUND(AVG(SALARY))  
					FROM 	EMPLOYEES e2
)
;


-- 문제3) EMPLOYEES 테이블에서 100번 부서의 
-- 최소 급여보다 최소 급여가 많은 다른 모든 부서를 출력하라

SELECT 	DEPARTMENT_ID , MIN(SALARY) 
FROM 	EMPLOYEES e 
GROUP BY DEPARTMENT_ID
HAVING 	MIN(SALARY) > (	SELECT 	MIN(SALARY) 
						FROM 	EMPLOYEES e 
						WHERE 	DEPARTMENT_ID = 100)
;





-- 문제4) 업무별로 최소 급여를 받는 사원의 정보를 
-- 사원번호,이름,업무,부서번호를 출력하여라. 
-- 단 업무별로 정렬하여라.
SELECT 	e.EMPLOYEE_ID , e.FIRST_NAME , e.JOB_ID ,e.SALARY 
FROM 	EMPLOYEES e 
WHERE 	(JOB_ID, SALARY) IN (	SELECT 	 JOB_ID, MIN(SALARY)
								FROM 	EMPLOYEES e2
								GROUP BY JOB_ID  )
ORDER BY JOB_ID 
;



-- 문제5) EMPLOYEES 테이블에서 (사원번호가 123인 사원의 직업)과 같고 
-- (사원번호가 192인 사원의 급여(SAL))보다 많은 사원의 
-- 사원번호,이름,직업,급여를 출력하라.

SELECT 	EMPLOYEE_ID , FIRST_NAME , JOB_ID , SALARY 
FROM 	EMPLOYEES e 
WHERE 	SALARY > (	SELECT 	SALARY
					FROM 	EMPLOYEES e 
					WHERE 	EMPLOYEE_ID = 192)
AND 	JOB_ID  = (	SELECT 	JOB_ID 
					FROM 	EMPLOYEES e 
					WHERE 	EMPLOYEE_ID = 123)
;


-- 문제6) EMPLOYEES 테이블에서 (50번 부서의 최소 급여)를 받는 사원보다 많은 급여를 받는 
-- 사원의 사원번호,이름,업무,입사일자,급여,부서번호를 출력하라. 
-- 단 50번은 제외
SELECT 	MIN(SALARY) 
FROM 	EMPLOYEES e 
WHERE 	DEPARTMENT_ID = 50
;
SELECT 	*
FROM 	EMPLOYEES e 
WHERE 	SALARY > (	SELECT 	MIN(SALARY) 
					FROM 	EMPLOYEES e 
					WHERE 	DEPARTMENT_ID = 50 )
AND 	DEPARTMENT_ID <> 50
;
profile
마부리입니다

0개의 댓글