[MySQL] EXISTS
EXISTS
EXISTS는 MySQL에서 서브쿼리의 결과가 존재하는지 여부를 확인하는데 사용하는 조건문이다.
주로 특정 조건에 맞는 데이터가 존재하는지 여부를 확인할 때 사용하며, 참 또는 거짓의 값을 반환한다.
EXISTS는 보통 SELECT문과 함께 사용되며, 데이터의 유무에 따라 로직을 결정하는 데 유용하다.
기본 구조
SELECT 칼럼명
FROM 테이블명
WHERE EXISTS (
서브쿼리
);
위 구조에서 EXISTS 안의 서브쿼리가 실행되며, 서브쿼리의 결과에 한 개 이상의 레코드가 존재하면 참을 반환하고, 그렇지 않으면 거짓을 반환한다.
작동 방식
EXISTS는 서브쿼리가 반환하는 데이터를 확인하지 않는다. 대신, 서브쿼리가 최소한 한 개의 행이라도 반환하면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환한다. 이 점에서 EXISTS는 반환되는 행의 수나 데이터 값과 무관하게 빠르게 동작한다.
SELECT 1
FROM users
WHERE EXISTS (
SELECT 1
FROM orders
WHERE users.id = orders.user_id
);
예를 들어 다음과 같은 쿼리가 있을 때, EXISTS는 orders 테이블에 해당 사용자의 주문이 한 건이라도 있는지 확인하고, 주문이 있으면 참을 반환한다.
EXISTS와 IN의 차이
두 기능 모두 특정 조건을 충족하는 데이터를 확인할 수 있지만, 동작 방식에 차이가 있다.
EXISTS | 서브쿼리가 조건을 충족하는지 여부만 확인하기 때문에, 조건을 만족하는 첫 번째 결과를 찾으면 즉시 멈추고 참 또는 거짓을 반환 |
IN | 서브쿼리의 결과와 비교하여 조건에 맞는 데이터를 모두 확인 |
특정 사용자가 주문을 했는지 확인할 때 IN을 사용하는 방식과 EXISTS를 사용하는 방식의 차이는 다음과 같다.
-- IN을 사용한 예
SELECT name
FROM users
WHERE id IN (
SELECT user_id
FROM orders
);
-- EXISTS를 사용한 예
SELECT name
FROM users
WHERE EXISTS (
SELECT 1
FROM orders
WHERE users.id = orders.user_id
);
두 쿼리는 논리적으로 동일한 결과를 반환할 수 있지만, EXISTS는 조건을 만족하는 첫 번째 레코드를 찾으면 검색을 멈추므로 대규모 데이터 셋에서 더 효율적일 수 있다.
NOT EXISTS
NOT EXISTS는 EXISTS와 반대로 서브쿼리의 결과가 존재하지 않을 때 참을 반환하는 조건문이다.
주로 특정 조건에 맞는 데이터가 존재하지 않는 경우를 확인할 때 사용된다.
SELECT name
FROM users u
WHERE NOT EXISTS (
SELECT 1
FROM orders o
WHERE u.id = o.user_id
);
위 예시는 users 테이블에 있는 사용자가 orders 테이블에 아무런 주문을 하지 않은 경우, 해당 사용자의 이름을 반환한다.
'💾 Data > SQL' 카테고리의 다른 글
[MySQL] JSON_TABLE(), JSON_ARRAY() (2) | 2024.09.23 |
---|---|
[MySQL] 데이터를 구분자로 Split 하기 (0) | 2024.09.13 |
[MySQL] PERCENT_RANK() (0) | 2024.09.04 |
[MySQL] INNER, LEFT, RIGHT JOIN (0) | 2024.08.12 |
[MySQL] SQL 변수 선언 및 사용 (0) | 2024.08.06 |