subQuery

기혁·2023년 2월 13일
0

DBMS 학습

목록 보기
7/13

day04

📌 서브쿼리란?

  • Main Query에 반대되는 개념으로 이름을 붙인것
  • 메인쿼리를 구성하는 소단위 쿼리
  • select, insert, delete, update 절에서 모두 사용 가능
  • 서브쿼리의 결과 집합을 메인 쿼리가 중간 결과
    값으로 사용
  • 서브쿼리자체는 일반 쿼리와 다를 바가 없다.

📢 예제1

-- 6462

SELECT 	ROUND(AVG(SALARY)) 
FROM 	EMPLOYEES e 
;
SELECT 	*
FROM 	EMPLOYEES e 
WHERE 	SALARY < 6462
;

위 2개는 같은 결과값

  • 아래와 같은 쿼리문은 전체 사원의 평균 급여값보다 낮은사람을 구하는 것 이다.
SELECT 	*
FROM 	EMPLOYEES e 
WHERE 	SALARY < (	SELECT 	ROUND(AVG(SALARY)) -- ( ) 안에 들어간게 서브쿼리
					FROM 	EMPLOYEES e )	
;

여기서 조건은 평균급여값보다 낮은사람이며 WHERE문의 ( )문에 들어간 쿼리문이 서브 쿼리문이며 이 쿼리문이 평균 급여값이다. 그래서 WHERE문은 SALARY < 평균급여값이 된다고 볼수 있다.

📢 예제2

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

위의 쿼리문은 다 같은 값이다.

📢 예제3

월급이 가장 적은 사원

SELECT 	*
FROM 	EMPLOYEES e 
WHERE 	e.SALARY = (SELECT 	MIN(SALARY)
				   FROM 	EMPLOYEES e2)
;

급여 = ( ) 구문의 값은 급여가 제일 낮은사람
따라서 월급이 가장 적은 사원이 출력이 된다.

📢 예제4

월급이 가장 많은 사원

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

💡 KeyPoint
조건문 = 급여 > kochhar의 급여
-> Kochhar의 급여보다 많은 사원

📢 문제2)

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

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

💡 KeyPoint
조건문 = 급여 < 회사 전체 급여평균
-> 급여의 평균보다 적은 사원

📢 문제3)

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

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

💡 KeyPoint
부서가 중복되서 출력되면 안돼기에 중복 제거 GROUP BY문을 썼다.
Having으로 조건문이 시작된다.

최소급여 > 100번 부서의 최소급여
-> 100번 부서의 최소 급여보다 최소 급여가 많은 다른 모든 부서

📢 문제4)

업무별로 최소 급여를 받는 사원의 정보를 사원번호,이름,업무,부서번호를 출력하여라.
단 업무별로 정렬하여라.

SELECT 	EMPLOYEE_ID , FIRST_NAME , JOB_ID  , DEPARTMENT_ID 
FROM 	EMPLOYEES e 
WHERE 	(JOB_ID,SALARY) IN (SELECT JOB_ID,MIN(SALARY)
							FROM	EMPLOYEES e2
							GROUP BY JOB_ID)
ORDER BY JOB_ID 
;

💡 KeyPoint
업무별로 = (JOB_ID,SALARY)
최소 급여를 받는 = 서브쿼리문

단 업무별로 정렬하여라.
-> 서브쿼리문에서 GROUP BY를 썼다.

📢 문제5)

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

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

💡 KeyPoint
1번째 조건
JOB_ID (사원번호) = 사원번호가 123인 사원
사원번호가 123인 사원의 직업과 같고
2번쨰 조건
SALARY(급여) > 사원번호가 192인 사원의 급여
사원번호가 192인 사원보다 급여가 많다.

📢 문제6)

EMPLOYEES 테이블에서 (50번 부서의 최소 급여)를
받는 사원보다 많은 급여를 받는 사원의 사원번호,이름,업무,입사일자,급여,부서번호를 출력하라.
단, 50번은 제외

SELECT 	EMPLOYEE_ID , FIRST_NAME , JOB_ID , HIRE_DATE , SALARY , DEPARTMENT_ID 
FROM 	EMPLOYEES e 
WHERE 	SALARY > (	SELECT	MIN(SALARY)
					FROM	EMPLOYEES e2
					WHERE	DEPARTMENT_ID = '50')
AND 	DEPARTMENT_ID != '50'
ORDER BY DEPARTMENT_ID 
;

💡 KeyPoint
1번째 조건
급여 > 50번 부서의 최소 급여
= 50번 부서의 최소 급여보다 많은 급여를 받는 사원
2번째 조건
단, 50번은 제외

profile
⭐️내가만든쿠키⭐️

0개의 댓글