MariaDB | 서브쿼리

2025. 1. 27. 18:54Database/SQL

서브쿼리란?

  • 서브쿼리는 다른 쿼리 안에 포함된 쿼리를 말한다. 
  • 부모 쿼리(Outer Query)의 결과를 도출하기 위해 중간 데이터를 제공하거나 
  • 특정 조건을 충족시키는 데이터를 필터링하는 데 사용된다. 
  • 괄호 ()로 감싸서 사용하며, SELECT, FROM, WHERE, HAVING 등 다양한 위치에 쓸 수 있다. 

 

서브쿼리 예시

-- 1. WHERE절에 사용
SELECT 이름, 점수
FROM 학생
WHERE 점수 > (SELECT AVG(점수) FROM 학생);

-- 2. FROM절에 사용
SELECT 반, 이름, 점수
FROM (SELECT 반, AVG(점수) AS 평균점수 FROM 학생 GROUP BY 반) AS 반평균
WHERE 평균점수 >= 80;

-- 3. SELECT절에 사용
SELECT 이름, 점수, 
       (SELECT AVG(점수) FROM 학생) AS 전체평균점수
FROM 학생;

-- 4. HAVING절에 사용
SELECT 반, AVG(점수) AS 평균점수
FROM 학생
GROUP BY 반
HAVING AVG(점수) >= (SELECT AVG(점수) FROM 학생);

 

서브쿼리의 유형

-- 1. 단일 행 서브쿼리 (=) 
-- 서브쿼리 결과가 한 행만 반환됨. 
-- 예: 최고 점수를 가진 학생의 이름 찾기 
SELECT 이름
FROM 학생
WHERE 점수 = (SELECT MAX(점수) FROM 학생);

-- 2. 다중 행 서브쿼리 (IN, ANY, ALL)
-- 서브쿼리 결과가 여러 행을 반환함
-- 예: 특정 반(1, 2반)에 속한 학생들의 이름 찾기
SELECT 이름
FROM 학생
WHERE 반 IN (SELECT 반 FROM 반정보 WHERE 반 IN (1, 2));

-- 3. 다중 열 서브쿼리
-- 서브쿼리가 여러 열을 반환함.
-- 예: 특정 조건에 맞는 (반, 이름) 쌍 찾기
SELECT 이름
FROM 학생
WHERE (반, 이름) IN (SELECT 반, 이름 FROM 특별학생);

-- 4. 스칼라 서브쿼리
-- 서브쿼리가 한 행과 한 열만 반환하며, 값처럼 사용.
-- 예: 평균 점수를 결과에 추가
SELECT 이름, 점수, 
       (SELECT AVG(점수) FROM 학생) AS 평균점수
FROM 학생;

 

주의사항

  1. 서브쿼리의 반환값
    • =를 사용할 때는 단일 값만 반환해야 해. 그렇지 않으면 오류가 발생해.
    • 여러 행을 반환할 가능성이 있다면 IN, ANY, ALL을 사용.
  2. JOIN과의 차이
    • 서브쿼리 하나의 쿼리 안에 또 다른 쿼리를 중첩하는 방식이고
    • JOIN 여러 테이블을 한 번에 결합
    • 서브쿼리는 가독성이 좋을 수 있지만, 복잡한 쿼리에서는 성능 문제가 발생할 가능성이 있어 JOIN이 더 적합하다. 
  3. 성능 문제
    • 서브쿼리는 내부적으로 별도의 쿼리를 실행하므로, 반복적으로 실행되면 느려질 수 있다. 
    • 성능이 중요한 경우, JOIN으로 대체하거나 인덱스를 사용하는 최적화를 고려해야 한다.