-- ✅ 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;
쿼리 안에 포함된 또 다른 쿼리를 말합니다.
- *주쿼리(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 (서브쿼리)
=
, >
, <
, >=
, <=
, !=
= ANY
는 IN
과 같음> 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 | 리스트 중 하나 이상 조건 만족하면 참 |
SOME | ANY 와 동일 (동의어) |
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';