💾 Data/SQL

[MySQL] EXISTS

heywantodo 2024. 9. 11. 16:22
728x90
반응형

[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 테이블에 아무런 주문을 하지 않은 경우, 해당 사용자의 이름을 반환한다.

728x90
반응형