중첩 질의와 결과(IN,ANY,ALL,EXIST)

강상은·2024년 1월 7일

SQL

목록 보기
2/3

1. 중첩 질의란?

하나의 SQL문 처리 결과를 다른 SQL문에 전달하기 위해서 두 개 이상의 SQL문을 하나의 SQL문을 연결

  • 외부 질의의 WHERE 절에서 다시 SELECT ... FROM ... WHERE 형태로 포함된 SELECT문

  • 부질의(subquery)라고 함

  • 중첩 질의는 외부 질의와 구분하기 위해 괄호로 묶는다

  • INSERT, DELETE, UPDATE문에도 사용

2. 중첩 질의 결과(3가지 유형)

2-1. 하나의 스칼라 값(단일 값)

2-2. 하나의 속성으로 이루어진 릴레이션(다중 값)

2-3. 여러 속성으로 이루어진 릴레이션

2-2의 결과

한 속성에 대한 다중 값 반환

  • 외부 질의의 WHERE 절에서 IN,ANY(SOME),ALL,EXISTS 연산자를 사용

  • IN : 한 속성 값이 값들의 집합에 속하는지 여부를 판단

CASE 1

질의 : 영업부나 개발부에 근무하는 사원들의 이름을 검색

SELECT EMPNAME FROM EMPLOYEE
WHERE DNO IN
	(SELECT DEPTNO FROM DEPARTMENT
    WHERE DEPTNAME ='영업' OR DEPTNAME = '개발');

CASE 2

질의 : 영업부나 개발부에 근무하지 않는 사원들의 이름을 검색

SELECT EMPNAME FROM EMPLOYEE
WHERE DNO NOT IN
	(SELECT DEPTNO FROM DEPARTMENT
    WHERE DEPTNAME ='영업' OR DEPTNAME = '개발');
  • ANY : 한 속성이 여러 값 중 하나 이상과 관련이 있는지를 결정할 때 ANY를 사용
질의 : 영업 부서에 근무하는 사원들이 받는 급여와 같은 급여를 받는 사원들의 사원 번호와 이름, 부서명을 검색

SELECT EMPNO, EMPNAME, DEPTNAME FROM EMPLOYEE E,
WHERE E.DNO = D.DEPTNO AND DEPTNAME <> '영업' AND
SALARY = ANY
	(SELECT SALARY FROM EMPLOTEE E, DEPT D
    WHERE E.DNO = D.DEPTNO AND
    	D.DEPTNAME = '영업');
  • ALL : 한 속성이 특정 값들의 집합과 어떤 관계를 가지는지를 테스트할 때 ALL을 사용
질의 : 영업 부서에 근무하는 모든 사원들의 급여보다 높은 급여를 받는 사원의 사번과 이름을 검색

SELECT EMPNO, EMPNAME FROM EMPLOYEE
WHERE SALARY > ALL
	(SELECT SALARY FROM EMPLOYEE E, DEPT D
    WHERE E.DNO = D.DEPTNO AND D.DEPTNAME = '영업');

2-3의 결과

EXISTS 연산자를 사용하여 중첩 질의의 결과가 빈 릴레이션인지 여부를 검사

= 중첩 질의의 결과가 빈 릴레이션 ? 참 : 거짓

CASE 1

질의 : 영업부나 개발부에 근무하는 사원들의 이름 검색

SELECT EMPNAME FROM EMPLOYEE E
WHERE EXISTS 
	(SELECT * FROM DEPARTMENT D WHERE E.DNO = D.DEPTNO AND
    (DEPTNAME = '영업' OR D.DEPTNAME = '개발'));

CASE 2

질의 : 영업부나 개발부에 근무하지않는 사원들의 이름 검색

SELECT EMPNAME FROM EMPLOYEE E
WHERE NOT EXISTS 
	(SELECT * FROM DEPARTMENT D WHERE E.DNO = D.DEPTNO AND
    (DEPTNAME = '영업' OR D.DEPTNAME = '개발'));

0개의 댓글