서브 쿼리(Sub Query)
 - 다른 SELECT문에 삽입된 SELECT문이다.
 - 간단한 명령문으로 강력한 기능을 제공하는 명령문 작성이 가능하다.
 - 테이블 자체 데이터에 종속된 조건을 사용하여 테이블에서 행을 선택할 때 유용하다.
 - 일반적으로 서브 쿼리가 먼저 실행되고, 그 결과를 사용하여 메인 쿼리에서 사용한다.

 


 서브 쿼리의 사용
 - 괄호로 묶어서 사용한다.
 - 일반적으로 서브 쿼리에서는 ORDER BY절을 사용하지 않는다.
 - 단일 행 연산자(=, >, < 등)와 복수 행 연산자(IN, ANY, ALL 등)를 사용한다. 

 

 

 서브 쿼리 사용 가능 위치
 - SELECT
 - FROM
 - WHERE
 - HAVING
 - ORDER BY
 - UPDATE문의 SET
 - INSERT문의 INTO

 

 

 WHERE절 서브 쿼리

 - ex) K02 팀의 평균 키보다 큰 선수들 조회

1
2
3
4
5
6
7
8
9
SELECT
    player_name,
    team_id,
    height
FROM player
WHERE height > (SELECT AVG(height)
                FROM player
                WHERE team_id = 'K02');
 
 

 

 

 HAVING절의 서브 쿼리

 - ex) K02 팀의 평균 키보다 큰 팀의 팀ID와 평균 키 조회

1
2
3
4
5
6
7
8
9
SELECT
    team_id,
    AVG(height)
FROM player
GROUP BY team_id
HAVING AVG(height) > (SELECT AVG(height)
                      FROM player
                      WHERE team_id = 'K02');
 

 

 

 다중 행 서브 쿼리 사용
 - IN : 목록에 있는 임의의 값과 동일

 - ex) '박동우'와 같은 포지션에 있는 선수의 이름과 포지션 조회

1
2
3
4
5
6
7
SELECT
    player_name,
    position
FROM player 
WHERE position IN (SELECT position
                   FROM player
                   WHERE player_name = '박동우');
 


 - ANY : 반환되는 각각의 값과 개별 비교

 - ex) 

1
2
3
4
5
6
7
8
9
SELECT
    player_name,
    team_id,
    position
FROM player 
WHERE position <> 'FW' 
AND height > ANY (SELECT height
                  FROM player
                  WHERE position = 'FW');
 


 - ALL : 서브 쿼리에 의해 반환되는 모든 값과 비교

 - ex)

1
2
3
4
5
6
7
8
9
SELECT
    player_name,
    team_id,
    position
FROM player 
WHERE position <> 'FW' 
AND height > ALL (SELECT height
                  FROM player
                  WHERE position = 'FW');
 

 

 

 

 오늘의 한 줄 : 오라클에 익숙해진다.


 

 

 

 

 출처 : SK 동반성장 아카데미, 비전공자를 위한 SQL 입문, 「서브쿼리」

+ Recent posts