DB

📌 Oracle SQL 고급 문법 총정리

Mostlove 2025. 5. 2. 17:45
728x90
반응형

1. 👤 직원과 관리자 이름 조회 (Self Join + Sub Query)

Executive 부서에 소속된 사원의 이름과 해당 사원의 관리자 이름을 조회하는 방법

✅ Self Join + Join 활용

SELECT A.last_name AS emp_name, B.last_name AS mgr_name
FROM employees A
JOIN employees B ON A.manager_id = B.employee_id
JOIN departments1 D ON A.department_id = D.department_id
WHERE D.department_name = 'Executive';

✅ Sub Query 활용

SELECT A.last_name AS emp_name,
       (SELECT B.last_name FROM employees B
        WHERE B.employee_id = A.manager_id) AS mgr_name
FROM employees A
WHERE A.department_id = (SELECT department_id FROM departments1
                         WHERE department_name = 'Executive');

2. 💰 급여 조건 조합 쿼리 (UNION, MINUS, INTERSECT)

조건 사용 예시
급여 > 10,000 OR 부서번호 = 100 UNION 사용
급여 > 10,000 AND 부서번호 ≠ 100 MINUS 사용
급여 > 10,000 AND 부서번호 = 100 INTERSECT 사용
-- UNION
SELECT employee_id, salary, department_id FROM employees
WHERE salary > 10000
UNION
SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 100;

-- MINUS
SELECT employee_id, salary, department_id FROM employees
WHERE salary > 10000
MINUS
SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 100;

-- INTERSECT
SELECT employee_id, salary, department_id FROM employees
WHERE salary > 10000
INTERSECT
SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 100;

3. 🔍 Sub Query 구조와 활용

📌 종류와 위치

구분  설명 예시  
Scalar SubQuery SELECT절에서 단일 값 반환 각 사원의 관리자 이름
Inline View FROM절에서 서브쿼리를 테이블처럼 사용 부서별 최고 급여 사원
Nested SubQuery WHERE절에서 조건으로 사용 평균 이상 급여 직원 조회

✅ 예시1: Scalar SubQuery

SELECT employee_id, first_name,
       (SELECT first_name FROM employees B WHERE B.employee_id = A.manager_id) AS mgr_name
FROM employees A;

✅ 예시2: Inline View

SELECT e.department_id, e.employee_id, e.first_name, e.salary
FROM employees e
JOIN (SELECT department_id, MAX(salary) AS max_sal FROM employees GROUP BY department_id) d
ON e.department_id = d.department_id AND e.salary = d.max_sal;

✅ 예시3: Nested SubQuery

SELECT department_id, department_name
FROM departments1
WHERE department_id IN (
    SELECT department_id FROM employees
    WHERE salary > (SELECT AVG(salary) FROM employees)
);

4. 💸 트랜잭션(Transaction)과 롤백(Rollback)

  • Transaction: 일련의 작업 단위 (예: 계좌이체)
  • Commit: 작업 확정
  • Rollback: 작업 취소
UPDATE employees SET salary = salary + 1000 WHERE employee_id = 100;
-- 아직 메모리 상태
COMMIT;  -- 확정
-- 또는
ROLLBACK;  -- 취소

🔒 Lock 개념

  • 작업 중 commit 되지 않으면 다른 사용자가 해당 행 접근 불가
  • 원인: 해당 사용자가 락을 걸고 있기 때문

5. 👓 View (가상 테이블)

  • View: 복잡한 JOIN 쿼리를 미리 만들어 테이블처럼 사용
  • 장점: 보안, 유지보수, 권한 위임

✅ 단순 뷰

CREATE OR REPLACE VIEW emp_vw1
AS SELECT employee_id, last_name, salary FROM employees1;

✅ 복합 뷰

CREATE OR REPLACE VIEW emp_vw2 AS
SELECT e.employee_id, e.last_name, d.department_name, l.city, c.country_name, r.region_name
FROM employees e
JOIN departments1 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
JOIN regions r ON c.region_id = r.region_id;

✅ View에서 데이터 변경

  • 단순 뷰: 가능 (단, NOT NULL 조건 주의)
  • 복합 뷰: 제한 있음 (함수, GROUP BY 등 포함 시 불가)

6. 🎯 입사일이 빠른 10명 조회

-- 잘못된 예시
SELECT ROWNUM, employee_id, hire_date
FROM employees
WHERE ROWNUM <= 10
ORDER BY hire_date;

-- 정확한 예시
CREATE TABLE emp_hired_ASC AS
SELECT * FROM employees ORDER BY hire_date;

SELECT ROWNUM, employee_id, last_name, hire_date
FROM emp_hired_ASC
WHERE ROWNUM <= 10;

📌 요약 포인트

  • Self Join은 같은 테이블에서 여러 역할을 참조할 때 사용
  • Sub Query는 위치에 따라 역할이 다름
  • 집합 연산자(UNION, MINUS, INTERSECT)는 조건 조합에 따라 선택
  • 트랜잭션과 롤백은 데이터 일관성을 보장
  • View는 복잡한 쿼리를 단순하게 관리하고 보안 향상에도 기여
반응형