서브쿼리(SUBQUERY)란?
이번 글에서는 서브쿼리에 대해서 알아볼 것이다.
서브쿼리의 정의부터 알아보면,
SELECT 쿼리문 안에 포함 되어있는 또 하나의 별도 SELECT 쿼리문을 말한다.
서브쿼리(SubQuery) 특징
- 여러 번의 Select문을 수행하여 얻을 수 있는 결과를 서브쿼리를 이용하여 하나의 쿼리로 결과를 얻을 수 있다.
- 메인쿼리가 서브쿼리를 포함하는 종속적인 관계가 있고 메인쿼리보다 먼저 실행된다.
- 사용할 때는 () 괄호를 잘 묶어줘야 한다.
- 서브쿼리 안에서 Order by 절은 사용할 수 없다.
- SELECT, FROM, WHERE, HAVING, ORDER BY, INSERT VALUES절, UPDATE SET절에서 사용할 수 있다.
서브쿼리(SubQuery) 종류
- 단일 행 서브쿼리 (Single Row SubQuery)
- 다중 행 서브쿼리 (Multi Row SubQuery)
- 다중 열 서브쿼리 (Multi Column SubQuery)
- 인라인 뷰 (Inline View)
- 스칼라 서브쿼리 (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 : 지정한 숫자 보다 크거나 같은 정수를 반환하는 함수.
이상 서브쿼리의 정리를 마치겠습니다!
반응형
'Database > RDBMS' 카테고리의 다른 글
[MSSQL] 작은 따옴표를 치환하는 방법 (쌍 따옴표 변환 / set quoted_identifier) (3) | 2022.04.19 |
---|---|
[MSSQL] Cursor문이란? (사용 방법 / 사용 이유 / 특징 정리) (3) | 2022.01.14 |
[MSSQL] INSERT문의 기본적인 3가지 사용법 (0) | 2021.11.26 |
[MSSQL] DBCC CHECKIDENT란 무엇일까? (0) | 2021.11.23 |
[MSSQL] TRUNCATE vs DELETE 차이점 (0) | 2021.11.23 |
댓글