Data 결합

✒️ 2025-05-28 16:43 내용 수정


다중 테이블연산과 VIEW를 이용한 테이블 결합


1. SUBQUERY 사용

1) WHERE절

SELECT HIRE_DATE 
FROM EMPLOYEES
WHERE FIRST_NAME = 'Diana'
2007-02-07 00:00:00.000
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE 
FROM EMPLOYEES
WHERE HIRE_DATE < TO_DATE('2007-02-07', 'YYYY-MM-DD')
ORDER BY HIRE_DATE;
SELECT EMPLOYEE_ID, FIRST_NAME, HIRE_DATE 
FROM EMPLOYEES
WHERE HIRE_DATE < (SELECT HIRE_DATE 
					FROM EMPLOYEES
					WHERE FIRST_NAME = 'Diana')
ORDER BY HIRE_DATE;

subquery 1.png


2) HAVING절

-- EMPLOYEES 테이블에서 직종별 평균 급여를 출력하되, 
-- 평균 급여가 Peter Tucker 사원보다 크고,
-- 직종에 'MAN'를 포함하는 경우만 출력
SELECT JOB_ID, AVG(SALARY)
FROM EMPLOYEES
WHERE JOB_ID LIKE '%MAN%'
GROUP BY JOB_ID
HAVING AVG(SALARY) > (SELECT SALARY				
					  FROM EMPLOYEES
					  WHERE FIRST_NAME = 'Peter' AND LAST_NAME = 'Tucker');

subquery 2.png


3) FROM절

-- EMPLOYEES 테이블과 DEPARTMENTS 테이블을 이용해서
-- 부서 이름이 'Sales'인 부서에서 입사일이 2006년 이후인 직원 정보 출력
SELECT *
FROM (SELECT *
	  FROM EMPLOYEES e JOIN DEPARTMENTS d
	  ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
	  WHERE DEPARTMENT_NAME = 'Sales')
WHERE HIRE_DATE < TO_DATE('2006-01-01', 'YYYY-MM-DD');

4) SELECT

-- EMPLOYEES 테이블과 DEPARTMENTS 테이블을 이용해서
-- 각 부서별 평균 급여와 전체 급여 평균을 출력
SELECT D.DEPARTMENT_NAME, AVG(E.SALARY) AS DEP_AVG,
		(SELECT AVG(SALARY)
		 FROM EMPLOYEES) AS TOTAL_AVG
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
GROUP BY D.DEPARTMENT_NAME;

2. JOIN을 사용한 여러 테이블 조합


1) INNER JOIN

-- 위의 테이블들을 이용해서 사원의 이름, 부서 이름, 도시, 국가를 출력한다.
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME, L.CITY, C.COUNTRY_ID
FROM EMPLOYEES e JOIN DEPARTMENTS d 
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
JOIN LOCATIONS l 
ON D.LOCATION_ID = L.LOCATION_ID
JOIN COUNTRIES c 
ON L.COUNTRY_ID = C.COUNTRY_ID;

INNER EXAM.png


2) OUTER JOIN

2-1) LEFT OUTER JOIN

-- EMPLOYEES 테이블과 DEPARTMENTS 테이블로
-- 사원이 어느 부서에 있는지 조회
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES e LEFT OUTER JOIN DEPARTMENTS d 
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

2-2) RIGHT OUTER JOIN

-- 위의 정보를 RIGHT OUTER JOIN을 써서 비교해보기
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES e RIGHT OUTER JOIN DEPARTMENTS d 
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

2-3) FULL OUTER JOIN

-- FULL OUTER JOIN을 써서 위의 두 결과와 비교해보기
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES e FULL OUTER JOIN DEPARTMENTS d 
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

3. UNION을 사용한 테이블 결합

1) UNION

-- EMPLOYEES 테이블과 DEPARTMENTS 테이블을 이용해서
-- 사원 이름과 부서 이름의 모든 값을 출력
SELECT E.FIRST_NAME FROM EMPLOYEES e 
UNION
SELECT D.DEPARTMENT_NAME FROM DEPARTMENTS d
ORDER BY FIRST_NAME;

2) UNION ALL

-- EMPLOYEES 테이블과 DEPARTMENTS 테이블을 이용해서
-- 사원 이름과 부서 이름의 모든 값을 출력
SELECT E.FIRST_NAME FROM EMPLOYEES e 
UNION ALL
SELECT D.DEPARTMENT_NAME FROM DEPARTMENTS d
ORDER BY FIRST_NAME;

4. VIEW 생성 및 수정

-- EMPLOYEES 테이블, DEPARTMENTS 테이블, LOCATION 테이블을 이용해서
-- 사원 이름, 직종, 입사일, 급여, 보너스, 부서 이름, 도시 정보를 저장한 VIEW 생성
CREATE OR REPLACE VIEW INFO AS -- VIEW가 존재하면 수정, 없다면 새로 생성
(
	SELECT E.FIRST_NAME, E.JOB_ID, E.HIRE_DATE, E.SALARY, (E.COMMISSION_PCT*E.SALARY) AS BONUS,
			D.DEPARTMENT_NAME,
			L.CITY
	FROM EMPLOYEES e JOIN DEPARTMENTS d 
	ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
	JOIN LOCATIONS l 
	ON D.LOCATION_ID = L.LOCATION_ID
);

SELECT * FROM INFO;

VIEW 1.png