탑크리에듀(www.topcredu.co.kr), 오라클자바커뮤니티(http://ojc.asia)에서 제공하는 초보자를 위한 SQL기초 강좌 입니다. SQL에서 자주 사용하는 서브쿼리와 같이 사용되는 연산자중 ANY, SOME, EXISTS, NOT EXISTS에 대한 이론 및 실습 예문으로 구성한 강좌 입니다.
3. ANY(SOME)
• 주로 서브 쿼리와 함께 사용되며 서브쿼리에서 여러 개의 값이 나오
게 되는 경우 이 값들에 대해 어떤 한 값 보다만 어떻다라고 비교할
때 사용된다.
• WHERE sal > any (500, 600, 700)와 같은 구문을 보면 sal > 500 or sal >
600 or sal > 700 형태로 해석되어 3개의 값 중 하나의 값인 500보다 크
면 된다(sal > 500), 만약 700보다 크다면 모든 값보다 크게 된다.
• =, !=, >, <, <=, >= 연산자 앞에 나타나며 이어서 여러값을 가진 리스
트나 서브쿼리가 오게된다.
4. ALL
• ALL은 집합의 모든 값과 비교를 하게 되는데, 모든 값과 비교하여
TRUE가 되어야 한다.
• 예를 들어 급여가 500, 600, 700 모두 보다 큰 값을 원한다면 ALL을 사
용하면 되는데 sal > all(500, 600, 700) 형태가 되고 이것은 sal > 500 and
sal > 600 and sal > 700의 의미로 결국 sal > 700와 같다.
• =, !=, >, <, <=, >= 연산자 앞에 나타나며 이어서 여러값을 가진 리스
트나 서브쿼리가 오게된다.
5. ANY(SOME), ALL 예문 - 1
-- 먼저 30번 부서 사원들의 급여를
확인해 보자.(가장 작은 값이 950,
큰 값은 2850이다)
SELECT sal FROM emp WHERE
deptno=30;
1600
……
2850
……
950
-- 어떠한 하나의 값만 만족시키면 되므로 sal > 950
과 같은 결과이다. any대신 some을 사용해도 된다.
SELECT ename, sal FROM emp
WHERE sal > ANY (SELECT sal FROM emp
WHERE deptno = 30);
ADAMS 1100
……
KING 5000
6. ANY(SOME), ALL 예문 - 2
-- 전부를 만족시키기 위해서는 30번부서
의 최고 급여인 2850보가 커야 한다. 즉
sal > 2850의 의미
SELECT ename, sal FROM emp
WHERE sal > ALL
(SELECT sal FROM emp
WHERE deptno = 30);
-- 좌측 ALL을 이용한 쿼리를 ANY로 변환하
면 다음과 같다. WHERE NOT (sal <= 2850)
형태가 되어 결국 sal > 2850이 된다.
SELECT ename, sal
FROM emp e1
WHERE NOT (sal <= ANY (SELECT sal
FROM emp
WHERE deptno = 30));
7. ANY(SOME), ALL 예문 - 3
-- ALL 구문을 ANY를 사용하지 않고 NOT EXISTS로 변환하면 다음과 같다. 사원을 출력하
는데 급여가 30번 부서원들의 급여보다 작거나 같은 것이 존재하지 않는 것을 추출, 즉 30번
부사원들의 모든 급여보다 큰 급여를 가진 사원을 추출
SELECT ename, sal
FROM emp e1
WHERE NOT EXISTS (SELECT e2.sal
FROM emp e2
WHERE e2.deptno = 30
AND e1.sal <= e2.sal);
8. EXISTS, NOT EXISTS
• EXISTS : 서브 쿼리가 적어도 하나의 행을 돌려주면 TRUE가 된다. 즉
존재하기만 하면 TRUE.
• NOT EXISTS : 서브 쿼리가 적어도 하나의 행을 돌려주지 않으면
TRUE가 된다. 존재하지 않으면 TRUE.
9. EXISTS, NOT EXISTS 예문 - 1
-- 부서테이블(DEPT)에서 사원을 한명이라도 가지고 있는 부서출력. 40번 부서는 EMP테이
블에서 부서원들이 한명도 없다.
SELECT dname as "부서명", deptno as "부서코드"
FROM dept WHERE EXISTS ( SELECT * FROM emp
WHERE dept.deptno = emp.deptno);
ACCOUNTING 10
RESEARCH 20
SALES 30
10. EXISTS, NOT EXISTS 예문 - 2
-- 앞 쿼리 구문을 IN연산자를 이용하면 다음과 같다. (IN은 OR로 해석된다.)
대부분 IN을 이용하는 것보다 EXISTS를 사용하는 것이 쿼리 성능면에서 장
점을 가진다.
SELECT dname as "부서명", deptno as "부서코드"
FROM dept WHERE deptno IN ( SELECT deptno FROM emp
WHERE deptno is not null);
11. EXISTS, NOT EXISTS 예문 - 3
-- 사원테이블(MYEMP1), 수강테이블(MYSUGANG1) 테이블에서 한과목 이
상 수강한 사원의 수는
SELECT COUNT(empno) FROM myemp1 E
WHERE EXISTS (
SELECT 1 FROM mysugang1 S
WHERE e.empno = s.empno
)
12. EXISTS, NOT EXISTS 예문 - 4
-- 강좌테이블(MYLECTURE1)에서 수강생이 한명도 없는 과목이름을 출력
하세요.
SELECT lecture_nm FROM mylecture1 l
WHERE NOT EXISTS (
SELECT 1 FROM mysugang1 s
WHERE l.lecture_id = s.lecture_id
);