소리소문 없이... 사랑도 명예도 이름도 남김 없이...
DexCore.net

DataBase/SQL Server

서브쿼리(SubQuery) 특징

탑~! 2026. 4. 30. 09:54

서브쿼리(SubQuery) 특징


o 여러 번의 Select문을 수행하여 얻을 수 있는 결과를 서브쿼리를 이용하여 하나의 쿼리로 결과를 얻을 수 있다.
o 메인쿼리가 서브쿼리를 포함하는 종속적인 관계가 있고 메인쿼리보다 먼저 실행된다.
o 사용할 때는 () 괄호를 잘 묶어줘야 한다.
o 서브쿼리 안에서 Order by 절은 사용할 수 없다.
o SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT VALUES절, UPDATE SET절에서 사용할 수 있다.

 



 

서브쿼리(SubQuery) 종류


1. 단일 행 서브쿼리 (Single Row SubQuery)
2. 다중 행 서브쿼리 (Multi Row SubQuery)
3. 다중 열 서브쿼리 (Multi Column SubQuery)
4. 인라인 뷰 (Inline View)
5. 스칼라 서브쿼리 (Scala SubQuery)

 



 

1. 단일 행 서브쿼리 (Single Row SubQuery)

SELECT절에서 단일 행 연산자를 사용하여 서브쿼리의 결과 값을 하나만 출력하는 쿼리이다.

 

(※ 단일 행 연산자)

: >, <, =, <=, >=, !=, <>

 

1-1) 쿼리 예제

SELECT * 
    FROM [테이블 A]
    WHERE [컬럼 명] [단일 행 연산자] (SELECT [컬럼명] FROM [테이블 B] WHERE [조건절])
    
/* 단일 행 연산자를 사용하여 결과 값을 하나만 도출해내는 형식*/

/* 테이블 예시 */
tb_Student 테이블
tb_StudentInfo 테이블

---------------------------------------------------------
tb_Student 테이블 tb_StudentInfo 테이블
ID NAME  S_ID S_WEIGHT
1 정균 1   80
2 산랑 2   90
3 승냥 3   100
4 겸모 4   110
---------------------------------------------------------

-- 단일 행 서브쿼리
SELECT ID, NAME
FROM TB_Student
     WHERE ID = (SELECT S_ID 
     FROM tb_StudentInfo
                WHERE S_WEIGHT < 90)
                
-- 결과 값
tb_Student
ID NAME
1 정균

 

위의 예제처럼 단일 행 연산자를 사용해서 하나의 결과 값을 도출하는 것이 단일 행 서브쿼리이다.

 



 

2. 다중 행 서브쿼리 (Multi Row SubQuery)

SELECT절에서 다중 행 연산자를 사용하여 서브쿼리의 여러개의 결과 값을 출력하는 쿼리이다.

(단일 행 서브쿼리와 비교해보면 연산자만 바뀌고 하나가 아닌 여러 값을 출력하는 차이가 있음.)

 

(※ 다중 행 연산자)

: IN, ANY, ALL


o IN : 검색된 값 중에 하나만 일치하면 True
o ANY : 검색된 값 중에서 조건에 맞는 것이 하나 이상이면 True
o ALL : 모든 검색된 값과 조건이 맞을 경우 True

 

2-1) 쿼리 예제
 
 
 
  

SELECT * 
    FROM [테이블 A]
    WHERE [컬럼 명] [다중 행 연산자] (SELECT [컬럼명] FROM [테이블 B] WHERE [조건절])
    
/* 다중 행 연산자를 사용하여 조건엥 맞는 여러개의 결과 값을 도출해내는 형식*/

/* 테이블 예시 */
tb_Student 테이블
tb_StudentInfo 테이블

---------------------------------------------------------
tb_Student 테이블 tb_StudentInfo 테이블
ID NAME  S_ID S_WEIGHT
1 정균 1   80
2 산랑 2   90
3 승냥 3   100
4 겸모 4   110
---------------------------------------------------------

-- 다중 행 서브쿼리
SELECT ID, NAME
FROM TB_Student
     WHERE ID <> (SELECT S_ID 
     FROM tb_StudentInfo
                WHERE S_WEIGHT < 90)
                
-- 결과 값
tb_Student
ID NAME
2 산랑
3 승냥
4 겸모

 



 


 

3. 다중 열 서브쿼리 (Multi Column SubQuery)

다중 열 서브쿼리란 여러 개의 컬럼을 검색 하는 서브쿼리이다.

 

특징


o Oracle, MariaDB 지원 O, SQL Server 지원 X
o 비교 대상 컬럼과 1:1로 비교하여 검색하기때문에 비교 대상과 컬럼 개수가 반드시 일치해야함.
o 주로 비교할 때는 IN을 사용하여 비교한다. 

 

3-1) 쿼리 예제

SELECT * 
    FROM [테이블 A]
    WHERE [컬럼 1], [컬럼 2], ... IN (SELECT [컬럼1], [컬럼 2], ... FROM [테이블 B] WHERE [조건절])
    
/* 다중 열 연산자를 사용하여 조건에 맞는 여러개의 컬럼 값을 도출해내는 형식*/

/* 테이블 예시 */
tb_Student 테이블

---------------------------------------------------------
tb_Student 테이블
ID NAME  AGE WEIGHT
1 정균 26    80
2 산랑 26    90
3 승냥 26    100
4 겸모 29    110
---------------------------------------------------------

-- 다중 열 서브쿼리 (나이별 가장 많은 몸무게를 차지하는 사람 조회)
SELECT ID, NAME, AGE, WEIGHT
FROM TB_Student
     WHERE (AGE,WEIGHT) IN (SELECT AGE,MAX(WEIGHT) 
        FROM tb_Student
        GROUP BY AGE)
                
-- 결과 값
tb_Student
ID NAME  AGE WEIGHT
3 승냥 26    100
4 겸모 29    110

 



 

4. 인라인 뷰 (Inline View)

인라인 뷰는 FROM절에서 사용하는 서브쿼리를 의미한다.

 

4-1) 쿼리 예제

SELECT * 
    FROM ([SELECT [컬럼 1], [컬럼 2], ... FROM [테이블] WHERE [조건절] ) AS InlineView_table
    WHERE [조건절]
    
/* FROM 절에 인라인뷰를 사용하여 원하는 테이블을 만들어 테이블로 만들어 사용할 수 있다.*/

/* 테이블 예시 */
tb_Student 테이블

---------------------------------------------------------
tb_Student 테이블
ID NAME  AGE WEIGHT
1 정균 26    80
2 산랑 26    90
3 승냥 26    100
4 겸모 29    110
---------------------------------------------------------

-- 인라인 뷰 서브쿼리 (나이별 가장 많은 몸무게를 차지하는 사람 중 나이가 26살인 사람 조회)
SELECT ID, NAME, AGE, WEIGHT
FROM (SELECT AGE,MAX(WEIGHT)
     FROM tb_Student
                GROUP BY AGE)
     WHERE AGE = 26
                
-- 결과 값
tb_Student
ID NAME  AGE WEIGHT
3 승냥 26    100

 



 

5. 스칼라 서브쿼리 (Scala SubQuery)

SELECT 절에서 사용하는 서브쿼리이며 1행만 반환된다.

 


o 하나의 레코드만 반환되며, 2개 이상의 레코드 반환은 안된다.
o 일치하는 데이터가 없어도 오류가 나지 않고 NULL값을 리턴한다.

 

5-1) 쿼리 예제

SELECT COL1, COL2, (SELECT [COL 3] FROM [테이블 명] WHERE [조건절]) AS COL3
    FROM [테이블 명]
    WHERE [조건절]
    
/* 스칼라 서브쿼리는 1행을 반환하여 원하는 값을 가공하여 하나의 컬럼으로 사용할 수 있다. */

/* 테이블 예시 */
tb_Student 테이블

---------------------------------------------------------
tb_Student 테이블
ID NAME  AGE WEIGHT
1 정균 26    80
2 산랑 26    90
3 승냥 26    100
4 겸모 29    110
---------------------------------------------------------

-- 스칼라 서브쿼리 (tb_Student에서 ID, 이름, 평균 나이 값을 구하라.)
SELECT ID, NAME, (SELECT CEILING(AVG(AGE)) FROM TB_Student) as '평균 나이'
FROM tb_Student
                
-- 결과 값
tb_Student
ID NAME  평균 나이
1 정균  27   
2 산랑  27   
3 승냥  27   
4 겸모  27

위 예제가 좋은것 같지는 않지만 SELECT절에서 한 행을 반환하는 서브쿼리라는 것을 이해해주면 좋을 것 같다.

 

cf) CEILING : 지정한 숫자 보다 크거나 같은 정수를 반환하는 함수.
출처: https://jeongkyun-it.tistory.com/38 [나의 과거일지:티스토리]

728x90
반응형

'DataBase > SQL Server' 카테고리의 다른 글

쿼리 실행시간  (0) 2026.04.30
인덱스 조회  (0) 2026.04.30
DBCC CHECKIDENT란 무엇일까?  (0) 2026.04.30
프로시저 전체 삭제 쿼리  (0) 2026.04.30
SP 쿼리 실행 이력 조회 쿼리  (0) 2026.04.30