Database/RDBMS

[MSSQL] 서브쿼리(SubQuery)란 무엇일까? / 특징 / 종류 / 예제

JeongKyun 2021. 11. 28.

서브쿼리(SUBQUERY)란?

이번 글에서는 서브쿼리에 대해서 알아볼 것이다.

 

서브쿼리의 정의부터 알아보면,

 

SELECT 쿼리문 안에 포함 되어있는 또 하나의 별도 SELECT 쿼리문을 말한다.

 


 

서브쿼리(SubQuery) 특징

  • 여러 번의 Select문을 수행하여 얻을 수 있는 결과를 서브쿼리를 이용하여 하나의 쿼리로 결과를 얻을 수 있다.
  • 메인쿼리가 서브쿼리를 포함하는 종속적인 관계가 있고 메인쿼리보다 먼저 실행된다.
  • 사용할 때는 () 괄호를 잘 묶어줘야 한다.
  • 서브쿼리 안에서 Order by 절은 사용할 수 없다.
  • 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

  • IN : 검색된 값 중에 하나만 일치하면 True
  • ANY : 검색된 값 중에서 조건에 맞는 것이 하나 이상이면 True
  • 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)

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

 

특징

  • Oracle, MariaDB 지원 O, SQL Server 지원 X
  • 비교 대상 컬럼과 1:1로 비교하여 검색하기때문에 비교 대상과 컬럼 개수가 반드시 일치해야함.
  • 주로 비교할 때는 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행만 반환된다.

 

  • 하나의 레코드만 반환되며, 2개 이상의 레코드 반환은 안된다.
  • 일치하는 데이터가 없어도 오류가 나지 않고 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 : 지정한 숫자 보다 크거나 같은 정수를 반환하는 함수.

 

 

 

이상 서브쿼리의 정리를 마치겠습니다!

반응형

댓글

💲 많이 본 글