SQL

Bigquery - Exists , Not exists

ROSEV 2024. 4. 11. 20:19

 

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