MariaDB | 서브쿼리
2025. 1. 27. 18:54ㆍDatabase/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 학생;
주의사항
- 서브쿼리의 반환값
- =를 사용할 때는 단일 값만 반환해야 해. 그렇지 않으면 오류가 발생해.
- 여러 행을 반환할 가능성이 있다면 IN, ANY, ALL을 사용.
- JOIN과의 차이
- 서브쿼리는 하나의 쿼리 안에 또 다른 쿼리를 중첩하는 방식이고
- JOIN은 여러 테이블을 한 번에 결합
- 서브쿼리는 가독성이 좋을 수 있지만, 복잡한 쿼리에서는 성능 문제가 발생할 가능성이 있어 JOIN이 더 적합하다.
- 성능 문제
- 서브쿼리는 내부적으로 별도의 쿼리를 실행하므로, 반복적으로 실행되면 느려질 수 있다.
- 성능이 중요한 경우, JOIN으로 대체하거나 인덱스를 사용하는 최적화를 고려해야 한다.