SMALL
서브쿼리 (Sub Query)
SELECT 쿼리문 안에 포함 되어있는 또 하나의 별도 SELECT 쿼리문을 말한다.
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 50
2 경록 2 75
3 치혁 3 80
4 준석 4 65
---------------------------------------------------------
-- 단일 행 서브쿼리
SELECT ID, NAME
FROM TB_Student
WHERE ID = (SELECT S_ID
FROM tb_StudentInfo
WHERE S_WEIGHT < 60)
-- 결과 값
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 50
2 경록 2 75
3 치혁 3 80
4 준석 4 65
---------------------------------------------------------
-- 다중 행 서브쿼리
SELECT ID, NAME
FROM TB_Student
WHERE ID <> (SELECT S_ID
FROM tb_StudentInfo
WHERE S_WEIGHT < 70)
-- 결과 값
tb_Student
ID NAME
2 경록
3 치혁
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 50
2 경록 25 75
3 치혁 25 80
4 준석 24 65
5 용석 24 55
---------------------------------------------------------
-- 다중 열 서브쿼리 (나이별 가장 많은 몸무게를 차지하는 사람 조회)
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
1 원석 26 50
3 치혁 25 80
4 준석 24 65
'Database' 카테고리의 다른 글
[SQL] 프로시저와 트리거의 차이점 (0) | 2023.02.12 |
---|---|
[SQL] RANK, DENSE_RANK, ROW_NUMBER 순위함수 (0) | 2023.02.12 |
[SQL] 인라인 뷰 (Inline View) (0) | 2023.02.12 |
[SQL] 뷰(VIEW) (0) | 2023.02.12 |
[SQL] 집합연산자 (0) | 2023.02.09 |
댓글