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 테이블에 없는 조건의 서브쿼리를 실행하면 결과 데이터로 아무 행도 출력하지 않음.'SQL' 카테고리의 다른 글
| [SQL] 데이터를 추가, 수정, 삭제하는 데이터 조작어_1 (0) | 2025.12.01 |
|---|---|
| [SQL] SQL 속 또 다른 SQL, 서브쿼리_3 (0) | 2025.12.01 |
| [SQL] SQL 속 또 다른 SQL, 서브쿼리_1 (0) | 2025.12.01 |
| [SQL] 조인 (0) | 2025.12.01 |
| [SQL] 다중행 함수와 데이터 그룹화_2 (0) | 2025.12.01 |