not exists 이해하기오라클2024. 5. 28. 16:15
Table of Contents
`not exists` 는 SQL 에서 서브쿼리(subquery)를 사용하여 조건을 만족하지 않는 행(row)을 필터링할 때 사용하는 연산자다. 이는 특정 조건을 만족하는 행이 서브쿼리의 결과에 존재하지 않을 경우, 외부 쿼리의 행을 반환한다.
`NOT EXISTS`는 주로 데이터베이스에서 부정적 조건을 확인하는 데 유용하다.
1. not exists의 기본 구조
`not exists` 는 다음과 같은 구조를 가진다.
SELECT columns
FROM table1
WHERE NOT EXISTS (
SELECT 1
FROM table2
WHERE table2.some_column = table1.some_column
);
- 외부 쿼리 : `table1`에서 데이터를 선택
- 서브쿼리 : `table2`에서 `table1`과 조인 조건을 사용하여 데이터를 선택한다.
- not exists : 서브쿼리의 결과가 존재하지 않을 경우 외부 쿼리의 행을 반환한다.
2 예제
다음은 `not exists` 를 사용하여 데이터베이스에서 특정 조건을 만족하지 않는 데이터를 조회하는 예제이다.
2 - 1 데이터베이스 테이블
employees 테이블 :
employee_id | name | department_id |
1 | Alice | 10 |
2 | Bob | 20 |
3 | Chalie | 30 |
4 | David | 40 |
departments 테이블 :
department_id | department_name |
10 | Sales |
20 | Markeing |
2 - 2 부서에 속하지 않은 직원 조회
`departments` 테이블에 없는 부서에 속한 직원들을 조회하는 쿼리는 다음과 같다.
SELECT employee_id, name
FROM employees e
WHERE NOT EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
);
- 외부쿼리 : `employees` 테이블에서 직원 ID와 이름 선택한다.
- 서브쿼리 : `departments` 테이블에서 `employees`의 `department_id`와 일치하는 행을 선택한다.
- not exists : 서브쿼리의 결과가 존재하지 않을 경우, 즉 직원의 부서 ID가 `departments` 테이블에 없을 경우 해당 직원의 데이터를 반환한다.
2 - 3 결과
위의 예제에서 쿼리는 다음과 같은 결과를 반환한다.
employee_id | name |
3 | Charlie |
`Charlie` 는 부서 ID 30에 속해 있으며, `departments` 테이블에 해당 부서가 존재하지 않으므로 결과에 포함된다.
3. not exists의 장점
- 명확한 논리 표현 : 특정 조건을 만족하지 않는 데이터를 명확하게 표현할 수 있다.
- 효율적 서브쿼리 : 서브쿼리에서 조건이 만족되는 첫번째 행을 찾으면 중지하므로, 많은 경우 성능이 향상된다.
- 복잡한 조건 처리 : 조인을 사용하여 처리하기 어려운 복잡한 부정 조건을 간단하게 처리할 수 있다.
4. not exists 와 기타 연산자 비교
- not in : `not in` 리스트나 서브쿼리의 결과에 없는 값을 필터링한다. 그러나 `null` 값이 포함된 경우 예기치 않은 결과가 발생할 수 있다.
- LEFT JOIN ...IS NULL : `left join` 과 `is null`을 exists는 더 직관적이고 성능이 좋을 수 있다.
-- NOT IN 사용 예시
SELECT employee_id, name
FROM employees
WHERE department_id NOT IN (SELECT department_id FROM departments);
-- LEFT JOIN 사용 예시
SELECT e.employee_id, e.name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id
WHERE d.department_id IS NULL;
결론
`not exists`는 SQL 에서 서브쿼리를 사용하여 특정 조건을 만족하지 않는 데이터를 효율적으로 필터링하는 강력한 도구이다. 명확한 논리 표현과 성능 향상 등의 장점을 제공하며, 복잡한 조건을 처리할 때 특히 유용하다. 이를 활용하여 데이터베이스 쿼리를 최저화하고 원하는 데이터를 정확히 조회할 수 있다.
'오라클' 카테고리의 다른 글
4강 : JOIN과 서브쿼리 활용 (1) | 2024.12.11 |
---|---|
3강 : SQL 기본 함수와 데이터 연산 (0) | 2024.12.11 |
2강 : SQL 기본 문법과 SELECT 활용 (0) | 2024.12.11 |
1강: 오라클 데이터베이스와 SQL 소개 (0) | 2024.12.11 |
ORACLE 에서 힌트 쿼리 이해하기 (0) | 2024.05.28 |
@Soohocoding :: Soohocoding
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!