exists 나, not exists는 서브쿼리로서 결과가 있는지 없는지 등을 파악하기 위해 사용 됩니다.
아래의 코드처럼, 급여가 55000불 이상인 사람들을 알기 위해서 exists를 사용하여, 선택하고 테이블에서 Join해서 가져오는 경우를 보실 수 있습니다.
그래서 조인 필터링과 같이 특정 조건을 만족하는 행을 확인할 수 있습니다.
WITH employee_salaries AS (
SELECT employee_id, employee_name, salary FROM UNNEST([
STRUCT(1 AS employee_id, 'John' AS employee_name, 50000 AS salary),
STRUCT(2, 'Jane', 60000),
STRUCT(3, 'Alice', 55000),
STRUCT(4, 'Bob', 70000)
])
)
SELECT *
FROM employee_salaries AS es
WHERE EXISTS (
SELECT 1
FROM employee_salaries AS es2
WHERE es2.salary >= 55000
AND es2.employee_id = es.employee_id
);
반대로, 조인 필터링의 조건에 부합하지 않는 경우도 구할 수 있습니다.
NOT을 붙여서, 해당 조건에 부합하지 않은 경우에만 나오도록 할 수 있습니다.
WITH employee_salaries AS (
SELECT employee_id, employee_name, salary FROM UNNEST([
STRUCT(1 AS employee_id, 'John' AS employee_name, 50000 AS salary),
STRUCT(2, 'Jane', 60000),
STRUCT(3, 'Alice', 55000),
STRUCT(4, 'Bob', 70000)
])
)
SELECT *
FROM employee_salaries AS es
WHERE NOT EXISTS (
SELECT 1
FROM employee_salaries AS es2
WHERE es2.salary >= 55000
AND es2.employee_id = es.employee_id
);
- Exists를 항상 써야되거나 하는건 아니지만 서브쿼리의 결과가 단순히 존재 여부만 파악할 때 쓰기 좋습니다. 너무 크거나 복잡하면 비용적인 측면에서 불리합니다.
- 특정 조건에 충족하는 행이 존재하는지 여부를 확인하기 편리합니다.
'SQL' 카테고리의 다른 글
SQL 기초 및 활용 (0) | 2021.08.24 |
---|---|
SQL - WITH RECURSIVE (0) | 2021.07.23 |