반응형

서브쿼리(subquery)는 쿼리 안에 포함되는 또 다른 쿼리이다. 조인하지 않고 다른 테이블과 일치하는 행을 찾거나, 조인 결과를 다시 조인할 수 있다. 서브쿼리의 주요 특징은 다음과 같다.


- 반드시 소괄호로 감싸 사용
- 주 쿼리를 실행하기 전에 1번만 실행
- 비교 연산자에 서브쿼리를 사용하는 경우 서브쿼리를 오른쪽에 기술
- 내부에는 ORDER BY 사용 불가

WHERE 서브쿼리

WHERE문에 사용하는 서브 쿼리를 중첩 서브쿼리(nested subquery)라고도 한다. 이를 조건문의 일부로 사용할 수 있다.

단일 행

서브쿼리의 결과가 1행만 반환되는 경우이다. 다음은 쿼리 기본 형식이다.

SELECT [열 이름]
FROM [테이블]
WHERE [열] = (SELECT [열] FROM [테이블] WHERE [조건])

주의할 점은 비교 연산자를 사용할 때는 반드시 단일 행 케이스여야 한다. 즉, 가장 바깥의 WHERE에 =,<,> 등을 사용하려면 하나 이하의 결과만 반환해야 오류 없이 동작한다. 만약 반환 결과가 여러 개가 필요하면 IN, ANY, ExISTS, ALL을 사용할 수 있다.

IN

IN은 앞서 설명한 것처럼 OR 대신 사용할 수 있다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT [열 이름]
FROM [테이블]
WHERE [열] IN (SELECT [열] FROM [테이블] WHERE [조건])

ANY

ANY는 하나라도 만족하는 조건을 검색한다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT column_name(s)
FROM table_name
WHERE column_name operator ANY
  (SELECT column_name
  FROM table_name
  WHERE condition);

ALL

ALL은 ANY와 다르게 모든 것을 만족하는 것을 검색한다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT column_name(s)
FROM table_name
WHERE column_name operator ALL
  (SELECT column_name
  FROM table_name
  WHERE condition);

EXISTS

EXISTS는 조건의 결과가 있는지 없는지를 확인해 1개라도 있으면 TRUE, 없으면 FALSE를 반환한다. 기본 형식은 다음과 같이 사용할 수 있다.

SELECT column_name(s)
FROM table_name
WHERE EXISTS
(SELECT column_name FROM table_name WHERE condition);

만약 결과가 없다면 FALSE이므로 위 쿼리는 아무것도 반환하지 않는다. 이를 반대로 적용하려면 EXISTS 앞에 NOT만 붙여준다.

FROM 서브쿼리

FROM 문에서는 보통 조인을 많이 활용하기 때문에 이와 결합해서 사용한다. 조인인 대상에 별도의 필터링서브쿼리 결과)을 수행하는 것으로 이해된다. 기본 형식은 다음과 같이 사용할 수 있다.(inline view라고도 함)

SELECT [열 이름]
FROM [테이블] AS a
    INNER JOIN (SELECT [열] FROM [테이블] WHERE [조건]) AS b ON a.key = b.key
WHERE [조건]

참고자료

  1. 강성욱. Do it! SQL 입문. 이지스 퍼블리싱.
  2. W3 Schools MySQL Tutorial
반응형