서브쿼리의 기본 개념
서브쿼리는 다른 쿼리 내에 포함된 쿼리를 의미하며, 복잡한 데이터 검색 및 조작을 가능하게 한다. 주로 SELECT, INSERT, UPDATE, DELETE 문에서 활용되며, 메인 쿼리에 필요한 데이터를 제공하는 역할을 수행한다. 서브쿼리는 반환하는 데이터의 형태에 따라 단일 행 서브쿼리, 다중 행 서브쿼리, 다중 열 서브쿼리로 분류할 수 있다.
단일 행 서브쿼리는 하나의 행만을 반환하며, 비교 연산자(=, >, <, ≥, ≤, <>)와 함께 사용됩니다. 다중 행 서브쿼리는 여러 개의 행을 반환하며, IN, ANY, ALL 연산자와 함께 사용된다. 다중 열 서브쿼리는 여러 개의 열을 반환하며, 주로 두 개 이상의 열을 비교할 때 사용된다.
서브쿼리는 그 위치에 따라 WHERE 절 서브쿼리, FROM 절 서브쿼리, SELECT 절 서브쿼리로 나눌 수 있다. WHERE 절 서브쿼리는 조건절에서 사용되어 특정 조건을 만족하는 데이터를 필터링하는 데 사용된다. FROM 절 서브쿼리는 테이블처럼 사용되어 메인 쿼리에서 데이터를 검색하는 데 사용된다. SELECT 절 서브쿼리는 SELECT 목록에서 사용되어 각 행에 대한 추가 정보를 제공하는 데 사용된다.
서브쿼리를 효과적으로 사용하면 복잡한 쿼리를 단순화하고 가독성을 높일 수 있다. 하지만, 과도한 서브쿼리 사용은 성능 저하를 초래할 수 있다. 특히, 상관 서브쿼리(Correlated Subquery)는 메인 쿼리의 각 행에 대해 서브쿼리를 반복적으로 실행하므로 성능에 큰 영향을 미칠 수 있다. 따라서, 가능하면 JOIN을 사용하여 동일한 결과를 얻는 것이 좋다.
•
단일 행 서브쿼리: =, >, <, >=, <=, <> 연산자 사용
•
다중 행 서브쿼리: IN, ANY, ALL 연산자 사용
•
다중 열 서브쿼리: 여러 열 비교 시 사용
서브쿼리 실습 예제
•
테이블 생성
CREATE TABLE 고객 (
고객ID INT PRIMARY KEY,
이름 VARCHAR(50),
등급 VARCHAR(20)
);
CREATE TABLE 주문 (
주문ID INT PRIMARY KEY,
고객ID INT,
주문일자 DATE,
총액 DECIMAL(10, 2),
FOREIGN KEY (고객ID) REFERENCES 고객(고객ID)
);
SQL
복사
•
SELECT 절 서브쿼리 : 각 고객의 이름과 함께 평균 주문 금액을 표시한다.
SELECT
고객.이름,
(SELECT AVG(총액) FROM 주문 WHERE 주문.고객ID = 고객.고객ID) AS 평균주문금액
FROM
고객;
SQL
복사
•
WHERE 절 서브쿼리 : 평균 주문 금액보다 높은 주문을 한 고객의 이름을 표시한다.
SELECT 이름
FROM 고객
WHERE 고객ID IN
(SELECT 고객ID FROM 주문 GROUP BY 고객ID HAVING AVG(총액) > (SELECT AVG(총액) FROM 주문));
SQL
복사
•
FROM 절 서브쿼리 : 각 고객별 총 주문 금액을 계산하고, 총 주문 금액이 높은 순서대로 정렬한다.
SELECT 고객.이름, 주문합계.총주문금액
FROM 고객
JOIN (SELECT 고객ID, SUM(총액) AS 총주문금액 FROM 주문 GROUP BY 고객ID) AS 주문합계
ON 고객.고객ID = 주문합계.고객ID
ORDER BY 주문합계.총주문금액 DESC;
SQL
복사