SQL 연산자 : ALL, ANY, SOME, IN, EXISTS

ALL, ANY, SOME, IN, EXISTSSQL에서 서브쿼리와 함께 사용되는 연산자 입니다. 주로 비교 연산에서 여러 값을 다룰 때 활용됩니다. 이번 포스트에서는 각 연산자의 사용법에 대해서 간단하게 정리해보았습니다.

연산자 ALL

ALL 연산자서브쿼리의 모든 행이 조건을 만족할 때 참이 됩니다.

SELECT column1
FROM your_table
WHERE column2 > ALL (SELECT column2 FROM another_table);

이 예제에서는 your_table의 column2가 another_table의 모든 값보다 큰지를 확인합니다.

SELECT column1
FROM your_table
WHERE column2 > (SELECT MAX(column2) FROM another_table);

ALL 연산자의 사용은 MAX 함수 사용과 유사한 결과를 가져올 수 있습니다.

ANY 또는 SOME

ANY 또는 SOME서브쿼리의 어떤 행이라도 조건을 만족할 때 참이 됩니다.

-- ANY 사용
SELECT column1
FROM your_table
WHERE column2 > ANY (SELECT column2 FROM another_table);

-- SOME 사용
SELECT column1
FROM your_table
WHERE column2 > SOME (SELECT column2 FROM another_table);

이 예제에서는 your_table의 column2가 another_table의 어떤 값보다 큰지를 확인합니다.

연산자 IN

IN서브쿼리의 결과 집합에 값이 포함되어 있는지 여부를 확인합니다.

SELECT column1
FROM your_table
WHERE column2 IN (
  SELECT column2 
  FROM another_table 
  WHERE condition
);

이 예제에서는 your_table의 column2 값이 another_table의 특정 조건을 만족하는 값 중 하나인지를 확인합니다.

EXISTS

EXISTS서브쿼리의 결과가 존재하는지 여부를 확인합니다. 서브쿼리의 결과가 하나 이상의 행을 반환하면 참이 됩니다.

한 테이블이 다른 테이블과 외래키(FK)와 같은 관계가 있을 때 유용합니다.

일반적으로 SELECT절까지 가지 않기에 IN에 비해 속도나 성능면에서 더 좋습니다.

반대로 조건에 맞지 않는 ROW만 추출하고 싶으면 NOT EXISTS를 사용합니다.

EXISTS 다음으로 오는 SELECT에서 1 대신 아무거나(*, ‘a’, …) 입력해도 상관 없습니다.

SELECT column1
FROM your_table
WHERE EXISTS (
  SELECT 1 
  FROM another_table 
  WHERE your_table.column1 = another_table.column1
);

위 쿼리에서, EXISTS 다음에 오는 서브쿼리는 another_table에서 조건을 만족하는 행이 적어도 하나 이상 존재하는지 확인합니다.

이 서브쿼리가 먼저 실행되고 결과가 생성된 후에 메인 쿼리가 실행되어 그 결과를 반환합니다.


IN , EXISTS 연산자 차이

-- IN 연산자
SELECT column1
FROM your_table
WHERE column2 IN (
  SELECT column2 
  FROM another_table 
  WHERE condition);

-- EXISTS 연산자
SELECT column1
FROM your_table AS t1
WHERE EXISTS (
  SELECT 1 
  FROM another_table AS t2 
  WHERE t1.column2 = t2.column2);

EXISTS와 IN은 둘다 WHERE절에서 사용되며, 조건에 따라 데이터를 필터링하여 결과를 조회할 때 사용되는 공통점을 가지고 있습니다.

IN 연산자는 주로 값의 목록이나 서브쿼리에서 반환되는 결과 집합에 대해 사용됩니다.

성능

  • EXISTS 연산자는 서브쿼리가 결과를 반환하는지 여부에만 관심이 있습니다.
  • IN 연산자는 EXISTS에 비해 성능 떨어집니다.

NULL 처리

  • IN 연산자는 서브쿼리에서 NULL 값을 반환하면 주 쿼리에서는 일치하는 행이 없다고 간주됩니다.
  • EXISTS 연산자는 서브쿼리가 결과를 반환하면 참(true)으로 간주되므로, 서브쿼리에서 NULL 값이 반환되더라도 EXISTS는 참을 반환합니다.

참고할 만한 글

Leave a Comment

목차