#8 DBMS _SELECT문_SUBQUERY

정진형·2021년 11월 5일
0

DBMS

목록 보기
8/11
post-thumbnail

oracleDB XE11g R2, DBeaver 21.2.3

wihdow10

  1. 서브쿼리(subQuery)
  • Main Query에 반대되는 개념으로 이름을 붙인 것
  • 메인쿼리를 구성하는 소단위 쿼리
  • SELECT, INSERT, DELETE, UPDATE 벌에서 모두 사용 가능
  • 서브쿼리의 결과 집합을 메인 쿼리가 중간 결과값으로 사용
  • 서브쿼리 자체는 일반 쿼리와 다를 바가 없다.
-- SUB QUERY
-- EMPLOYEES 테이블에서 평균 급여보다 작게 받는 사람의
-- EMPLOYEE_ID, FIRST_NAME, LAST_NAME

-- 직원 평균 급여 6462
SELECT ROUND(AVG(SALARY)) FROM EMPLOYEES e;

-- 56
-- 결과는 맞지만 테이블의 변동이 생길경우 대응이 안된다
SELECT 	EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY
FROM	EMPLOYEES e
WHERE	SALARY < 6462
ORDER BY SALARY
;

-- 오류
SELECT 	EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY
FROM	EMPLOYEES e
WHERE	SALARY < ROUND(AVG(SALARY)
ORDER BY SALARY
;

-- 정상 작동했던 셀렉트절을 통채로 가져다 쓴다
SELECT 	EMPLOYEE_ID, FIRST_NAME, LAST_NAME, SALARY
FROM	EMPLOYEES e
WHERE	SALARY < (SELECT ROUND(AVG(SALARY)) FROM EMPLOYEES e)
ORDER BY SALARY
;

-- COUNTRY_ID = 'US'
SELECT	LOCATION_ID
FROM	LOCATIONS l
WHERE	COUNTRY_ID = 'US'
;

-- DEPARTMENTS 테이블에서 LOCATION_ID가 1400, 1500, 1600, 1700 데이터 출력
SELECT	*
FROM	DEPARTMENT d
WHERE	LOCATION_ID IN (1400, 1500, 1600, 1700)
;

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

-- EMPLOYEES 테이블에서
-- 월급이 가장 작은 사람 FIRST_NAME, LAST_NAME
-- subQuery
SELECT	MIN(SALARY)	FROM EMPLOYEES e ;

SELECT	FIRST_NAME, LAST_NAME, SALARY
FROM	EMPLOYEES e
WHERE	SALARY = (SELECT MIN(SALARY) FROM EMPLOYEES e2)
;

-- EMPLOYEES 테이블에서
-- 월급이 가장 많은 사람 FIRST_NAME, LAST_NAME
-- subQuery
SELECT	MAX(SALARY)	FROM EMPLOYEES e ;

SELECT	FIRST_NAME, LAST_NAME, SALARY
FROM	EMPLOYEES e
WHERE	SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES e2)
;

-- EMPLOYEES 테이블에서 월급이 가장 많은 사원의
-- FIRST_NAME, LAST_NAME, JOB_TITLE, SALARY
-- subQuery
SELECT	MAX(SALARY)	FROM EMPLOYEES e ;

SELECT	e.FIRST_NAME, e.LAST_NAME, e.JOB_ID, e.SALARY
FROM	EMPLOYEES e
    INNER JOIN j
    ON e.JOB_ID = j.JOB_ID
WHERE	SALARY = (SELECT MAX(SALARY) FROM EMPLOYEES e)
;

-- EMPLOYEES 테이블에서 평균 급여보다 많은 사원의
-- FIRST_NAME, LAST_NAME, JOB_TITLE, SALARY
-- subQuery
SELECT	e.FIRST_NAME, e.LAST_NAME, e.JOB_ID, e.SALARY
FROM	EMPLOYEES e
    INNER JOIN j
    ON e.JOB_ID = j.JOB_ID
WHERE	SALARY = (SELECT AVG(SALARY) FROM EMPLOYEES e)
;





               

0개의 댓글