오라클 서브쿼리

Jean·2025년 7월 30일
0

풀스택 교육

목록 보기
22/28

🎂 Oracle SQL 조인

-- ✅ ANSI JOIN 
SELECT *
FROM emp
JOIN dept ON emp.deptno = dept.deptno
WHERE sal > 1000;

-- ✅ Oracle JOIN
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno
AND sal > 1000;

-- ✅ Oracle OUTER JOIN
-- LEFT OUTER JOIN: emp는 모두, dept는 매칭되는 것만
SELECT *
FROM emp, dept
WHERE emp.deptno = dept.deptno(+);

-- RIGHT OUTER JOIN: dept는 모두, emp는 매칭되는 것만
SELECT *
FROM emp, dept
WHERE emp.deptno(+) = dept.deptno;

-- ❌ FULL OUTER JOIN은 문법에서 직접 지원 ❌
-- 대신 UNION으로 해결
SELECT *
FROM emp
LEFT JOIN dept ON emp.deptno = dept.deptno
UNION
SELECT *
FROM emp
RIGHT JOIN dept ON emp.deptno = dept.deptno;

🧁 서브쿼리(Subquery)

쿼리 안에 포함된 또 다른 쿼리를 말합니다.

  • *주쿼리(Main Query)**가 실행되기 전에 먼저 수행됨
  • 소괄호 ( ) 로 감싸 사용
  • 주로 WHERE, FROM, SELECT, HAVING 절 안에 사용됨!!

🟢 단일 행 서브쿼리: 하나의 결과만 반환

-- SMITH의 부서에 속한 직원 정보
SELECT *
FROM emp
WHERE deptno = (SELECT deptno FROM emp WHERE ename = 'SMITH');

🔴 다중 행 서브쿼리: 여러 행이 반환될 경우

  • 단순 비교(=, <, > 등)는 오류 발생
-- ❌ 오류 발생: 서브쿼리가 2개 이상의 deptno를 반환할 경우
SELECT *
FROM emp
WHERE deptno = (SELECT deptno FROM emp WHERE ename IN ('SMITH', 'KING'));

👉 해결: IN, ANY, ALL, SOME 같은 다중행 비교 연산자 사용

🍎 다중 행 비교 연산자

IN

  • 설명: 여러 개의 값 중 하나라도 일치하면 참
  • 형태: 열 IN (서브쿼리)
  • 비교 가능 연산자: =만 사용 가능
select * from emp
where deptno IN (select deptno from emp where ename = 'SMITH' or ename = 'KING');

ANY (또는 SOME)

  • 설명: 서브쿼리 결과 중 하나라도 조건을 만족하면 참
  • 형태: 열 연산자 ANY (서브쿼리)
  • 비교 가능 연산자: =, >, <, >=, <=, !=
  • = ANYIN과 같음
  • > ANY: 최소값보다 크다
  • < ANY: 최대값보다 작다
select * from emp
where sal > ANY (select sal from emp where deptno = 20);
-- → 부서 20번 직원 중 가장 낮은 급여보다 높은 사람들

ALL

  • 설명: 서브쿼리 결과 전체가 조건을 만족해야 참
  • 형태: 열 연산자 ALL (서브쿼리)
  • 비교 가능 연산자: =, >, <, >=, <=, !=
select * from emp
where sal > ALL (select sal from emp where deptno = 20);
-- → 부서 20번에서 가장 높은 급여보다도 높은 사람

정리

연산자설명
IN리스트 중 하나와 같으면 참 (= ANY와 같음)
ANY리스트 중 하나 이상 조건 만족하면 참
SOMEANY와 동일 (동의어)
ALL리스트의 모든 값과 조건 만족해야 참

🍒 예시

-- IN
SELECT * FROM emp
WHERE deptno IN (SELECT deptno FROM emp WHERE ename IN ('SMITH', 'KING'));

-- = ANY → 리스트 중 하나와 같으면 참
SELECT * FROM emp
WHERE deptno = ANY (SELECT deptno FROM emp WHERE ename IN ('SMITH', 'KING'));

-- > ANY → 리스트 중 하나보다 크면 참 (즉, 최소값보다 큼)
SELECT * FROM emp
WHERE sal > ANY (SELECT sal FROM emp WHERE deptno = 20);

-- > ALL → 리스트 전부보다 커야 참 (즉, 최대값보다 큼)
SELECT * FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 20);

-- 위와 동일
SELECT * FROM emp
WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 20);

🟠 다중 열 서브쿼리 (복합 조건)

-- 각각 조건 비교
SELECT *
FROM emp
WHERE job = (SELECT job FROM emp WHERE TO_CHAR(hiredate, 'dd') = '20')
AND deptno = (SELECT deptno FROM emp WHERE TO_CHAR(hiredate, 'dd') = '20')
AND TO_CHAR(hiredate, 'dd') != '20';

-- 👉 튜플 형식으로 한번에 비교
SELECT *
FROM emp
WHERE (job, deptno) = (
  SELECT job, deptno FROM emp WHERE TO_CHAR(hiredate, 'dd') = '20'
)
AND TO_CHAR(hiredate, 'dd') != '20';
profile
햇내기 개발자 지망생

0개의 댓글