이것을 확실히 이해하려면 EXISTS()를 정확히 이해해야 함. 추가로 IN()과 어떤 점이 다른지도 봐야함.
일단 참고 자료)
[Oracle] 오라클 EXISTS, NOT EXISTS 사용법 정리 (IN, JOIN 비교)
오늘은 EXISTS에 대해 알아보도록 하겠습니다!
사실 제 네이버 블로그에 있는 게시들을 옮겨온것이긴 합니다...ㅋㅋㅋ
EXISTS를 알기 전에 사실 서브쿼리에 대해 알고있어야 하는데요!쉽게 말하면 서브쿼리는하나의 쿼리문 안에 하나의 쿼리문이 또 존재하는데 이때 내부에 있는 쿼리문을 서브 쿼리라고 합니다!!또한 서브쿼리는 SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT문의 VALUES, UPDATE문의 SET에 사용 가능하며사용되는 위치에 따라 FROM 절에 사용시 인라인 뷰, SELECT 절에 사용시 스칼라 서브쿼리, WHERE 절에 사용시 서브쿼리 라고 불립니다!!간단한 예를 들어 보겠습니다!!
| SELECT * FROM employees WHERE salary < (SELECT salary FROM employees WHERE LAST_NAME = 'Lee'); |
|---|
"LEE 보다 급여가 작은 사람에 대한 정보를 출력해라"라는 의미가 되겠네요.
이렇게 우리는 LEE의 급여를 모르기 때문에 WHERE 절에 서브쿼리를 사용해 LEE의 급여를 알아내어 메인 쿼리에서 사용합니다!이러한 서브쿼리를 비연관 서브쿼리라고 합니다주로 위와 같이 메인 쿼리에 값을 제공하기 위한 목적으로 사용됩니다!!또 한가지 말씀드리자면만약 위와 같은 상황에서 서브쿼리에서 반환하는 값이 단일 값이 아니라면 어떻게 될까요?당연히 에러가 발생하겠죠?즉, LEE 라는 이름을 가진 사람이 2명 이상이라면 에러가 발생합니다위에서 사용한 것 처럼 <, >, <=, >= , <> 등은 단일 행 연산자
라고 하여 서브쿼리에서 반환되는 값이 1개일때만 사용가능합니다.
그럼 비연관 서브쿼리와 단일 행 연산자가 있으니 그 반대도 있겠군요?!그것을 연관 서브쿼리 그리고 다중 행 연산자라고 합니다!!먼저 다중 행 연산자 부터 이야기하면서브쿼리에서 반환되는 값이 2개 이상일 때 다중행 연산자를 사용해야 합니다!!이 또한 예를 들어 보도록 하겠습니다!!
| 123 | SELECT * FROM EMPLOYEESWHERE EMPLOYEE_IDIN (SELECT MANAGER_ID FROM EMPLOYEES); | cs |
|---|
결과를 보도록 할까요?
이러한 결과 값이 나옵니다!!
여기서 IN은 서브쿼리에서 반환하는 값중 해당하는 값이 있을 경우 그 값을 반환하는 다중 행 연산자 입니다!!당연히 사용된 테이블은 employees 테이블 하나이기 때문에 서브쿼리에서 반환된 값들이 모두 메인 쿼리에 존재하겠죠.그럼 서브쿼리에서 반환된 값은 총 18개가 되겠습니다!!이렇게 반환되는 값이 여러개 일때 사용하는것이 다중 행 연산자이며여기에는 IN, ALL, ANY, EXISTS가 있습니다!!그럼 이제 연관 서브쿼리가 무엇인지 알아보도록 하면서 오늘의 주제인 EXISTS에 대해 배워보겠습니다!!연관 서브쿼리는 일반적으로 메인쿼리가 먼저 수행되어 읽혀진 데이터를 서브쿼리에서 조건이 맞는지 확인하고자 할 때 주로 사용됩니다!!
예로 보시죠!!