본문 바로가기
SQL

[SQL] SQL 속 또 다른 SQL, 서브쿼리_2

by lmyourpearl 2025. 12. 1.

IN 연산자

-- IN 연산자 사용하기

SELECT *
		FROM EMP
	WHERE DEPTNO IN (20,30);

다중행 서브쿼리의 데이터를 비교하는 다중행 연산자로 IN을 사용해도 효과는 같음

-- 부서별 최고 급여와 같은 급여를 받는 사원 정보 출력하기

SELECT *
    FROM EMP
  WHERE SAL IN (SELECT MAX(SAL)
                  FROM EMP
                  GROUP BY DEPTNO);

ANY, SOME 연산자

서브쿼리가 반환한 여러 결괏값 중 메인쿼리와 조건식을 사용한 결과가 하나라도 true라면 메인쿼리 조건식을 true로 반환.

메인쿼리와 값을 비교할 때 ANY나 SOME 연산자를 등가 비교 연산자 (=)와 함께 사용하면 IN 연산자와 같은 기능을 수행.

** 하지만 사용하지않음. 그냥 IN씀

-- ANY 연산자 사용하기

SELECT *
	 FROM EMP
 WHERE SAL = ANY (SELECT MAX(SAL)
                    FROM EMP
                    GROUP BY DEPTNO);

SQL에서 = ANY 연산자는 IN 연산자와 기능적으로 동일하며,  ANY 연산자가 더 범용적이기 때문에 사용함.

범용성 (Versatility) 및 표준 구문:

  • IN 연산자는 오직 **등가 비교(=)**만을 처리할 수 있도록 설계된 특별한 연산자
  • 반면, ANY와 SOME 연산자는 모든 비교 연산자(=, !=, >, <, >=, <=)와 함께 사용될 수 있도록 SQL 표준에 정의되어 있음
-- SOME 연산자 사용하기

SELECT *
    FROM EMP
  WHERE SAL = SOME (SELECT MAX(SAL)
                      FROM EMP
                      GROUP BY DEPTNO);

-- 30번 부서 사원의 최대 급여보다 적은 급여를 받는 사원 정보 출력

SELECT *
    FROM EMP
  WHERE SAL < ANY (SELECT SAL
                     FROM EMP
                    WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;

중복을 제거한다면 950,1250,1500,1600,2850이 되고 ANY연산자는 서브쿼리 결괏값중 최소한 하나라도 조건식을 만족하면 메인쿼리 조건식의 결과가 true가 됨.

그러므로 서브쿼리에서 가장 큰 값인 2850보다 적은 메인쿼리 행은 모두 true가 되며,2850보다만 작으면 true이기 때문.

즉, < ANY 연산자는 서브쿼리 결괏값 중 급여의 최댓값(SAL = 2850)보다 작은 값을 모두 출력.

따라서 < ANY 연산자는 서브쿼리에 MAX 함수를 적용한 값을 ANY 연산자 없이 비교 연산자 < 만 사용항 결과와 같은 효과를 냄.

< ANY 연산자를 사용한 경우 서브쿼리에 MAX 함수를 사용한 경우
SELECT *
FROM EMP
WHERE SAL < ANY (SELECT SAL
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
SELECT *
FROM EMP
WHERE SAL < (SELECT MAX(SAL)
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL, EMPNO;
-- 30번 부서 사원의 최소 급여보다 많은 급여를 받는 사원 정보

SELECT *
    FROM EMP
  WHERE SAL > ANY (SELECT SAL
                    FROM  EMP
                    WHERE DEPTNO = 30);

ALL연산자

ALL 연산자는 서브쿼리의 모든 결과가 조건식에 맞아 떨어져야만 메인 쿼리의 조건식이 true가 됨.

-- 부서 번호가 30번인 사원의 최소 급여보다 더 적은 급여를 받는 사원

SELECT *
    FROM EMP
  WHERE SAL < ALL (SELECT SAL
                    FROM  EMP
                   WHERE DEPTNO = 30); -- 950보다 작은 값만 출력
-- 부서 번호가 30번인 사원의 최대 급여보다 더 많은 급여를 받는 사원

SELECT *
    FROM EMP
  WHERE SAL > ALL (SELECT SAL
                    FROM  EMP
                   WHERE DEPTNO = 30); -- 2850과 비교하여 더 큰 값인 데이터만 출력

EXISTS 연산자

서브쿼리에 결괏값이 하나 이상 있으면 조건식이 모두 true, 없으면 모두 false가 됨.

특정 서브 쿼리 결괏값 유무로 메인쿼리의 데이터 노출 여부를 결정해야 할 때 간혹 사용함. 잘 안씀

-- 서브쿼리에 결괏값이 있을 때
SELECT *
    FROM EMP
  WHERE EXISTS (SELECT DNAME
                  FROM DEPT
                WHERE DEPTNO = 10); -- 결괏값이 있으므로 EMP의 모든 행을 출력
-- 서브쿼리에 결괏값이 없을 때
SELECT *
    FROM EMP
  WHERE EXISTS (SELECT DNAME
                 FROM DEPT
                 WHERE DEPTNO = 50);
-- DEPT 테이블에 없는 조건의 서브쿼리를 실행하면 결과 데이터로 아무 행도 출력하지 않음.