- 이 글은 제가 공부를 하며, 이해한 것을 바탕으로 작성하는 글입니다.
- 그렇기에 틀리거나 잘못된 부분이 있을 수 있습니다.
- 글의 오류를 발견하시면, 댓글로 말씀해 주시면 정말 감사하겠습니다.
서브 쿼리란, 쿼리 안에 작성하는 또 다른 쿼리로, 여러 곳에서 사용되며, 가독성이 좋다는 장점이 있습니다. 보통 복잡한 쿼리를 작성하는 데 사용됩니다.
사용법은 일반 쿼리 문의 SELECT, FROM, WHERE절 안에 괄호를 치고 쿼리를 또 작성하는 것입니다.
서브 쿼리의 규칙
■ 서브쿼리는 괄호( )로 묶어서 사용
■ 메인 쿼리(outer query)는 연산자의 왼쪽에 기술하고 서브 쿼리는 연산자의 오른쪽에 기술
■ 서브쿼리에서 메인 쿼리(outer query)의 순서로 SELECT 문이 실행
■ 서브쿼리의 서브 쿼리 형태로 중첩하여 작성
서브 쿼리의 예시는 다음과 같다.
이 전체 쿼리에서 where 절 쪽에 있는 괄호 내의 쿼리를 서브 쿼리라고 하고, 그 바깥의 나머지 쿼리를 메인 쿼리 또는 Outer 쿼리라고 한다.
SELECT
order_id,
order_date,
customer_id
FROM
sales.orders
WHERE
customer_id IN (
SELECT
customer_id
FROM
sales.customers
WHERE
city = 'New York'
)
ORDER BY
order_date DESC;
SUBQUERY는 여러 기준으로 구분되는데 우선, SUBQUERY의 위치에 따른 구분으로 정리해 보자.
SUBQUERY 위치에 따른 구분으로는 SELECT, FROM, WHERE에 들어가는 쿼리 3가지로 나눌 수 있다.
- 스칼라 서브쿼리 (Scalar Subquery)
메인 쿼리의 SELECT에 칼럼이나 표현식처럼 사용하는 서브 쿼리
특징으로는 한 개의 값만 표현이 가능하다.
SELECT 이름,
(SELECT 주소
FROM 학생
WHERE 학생부.학번 = 학생개인정보.학번) 주소
FROM 학생
우선 서브쿼리를 보면, 주소 칼럼을 결과로 도출하고 있다.
메인 쿼리는 이름과 서브쿼리에서 나온 주소 칼럼을 가지고 오는 것이다.
- 인라인 뷰 ( Inline View )
메인 쿼리의 FROM절에 나오는 서브 쿼리를 말한다.
FROM 절에 나오므로, 서브쿼리 자체가 하나의 테이블과 같은 역할을 수행하게 된다. 그렇기에 이를 가상 테이블과 같은 역할을 한다 하여, view를 붙여 인라인 뷰라고 부른다.
그 말인 즉, 테이블과 같은 역할을 수행하므로, 여러 개의 칼럼과 로우로 이루어있다고 할 수 있다.
그리고 테이블 역할이므로 Alias도 사용 가능하다.
- 아래 예시를 보자. 직원 중, it 직무를 가지고 있는 사람을 찾아보는 sql를 작성한다고 해보자.
SELECT *
FROM 직원 as A ,
(SELECT 부서_id
FROM 부서
WHERE 부서명 = 'IT') as B
WHERE A.부서_id = B.부서_id
우선, 서브 쿼리부터 해석하고, 다음 메인 쿼리로 넘어가야 한다.
서브 쿼리는 부서명이 IT인 부서 ID를 가지고 오는 쿼리이다. 이를 B라고 별명을 붙였다.
그리고, 메인 쿼리에서는 바로 위에서 가지고 온 부서 ID와 A 테이블에서의 부서 ID가 같은 값을 가지는 것을 가지고 오도록 되어있다.
- 중첩 서브 쿼리 ( Nested Subquery )
중첩 서브 쿼리는 WHERE절에서 나오는 서브 쿼리를 말한다.
WHERE 절은 특정 조건이 나올 수 있게 처리를 할 때 사용하는데, 이 중첩 서브 쿼리는 단일행을 가지고 올 수도 있고, 아니면 다중행을 가지고 올 수도 있다.
아래는 중첩 서브 쿼리의 예이다.
SELECT 이름
FROM 사원
where 부서명=(SELECT 부서명
FROM 부서
WHERE 거주지="서울");
서브 쿼리를 보면 서울에 거주하는 사람들의 부서명을 불러오고, 메인 쿼리에서는 그 사람들의 이름을 가지고 오는 것으로 되어있다.
'DataBase > E.T.C.' 카테고리의 다른 글
[DB] ODBC라는 것은 무엇인가. (0) | 2022.02.12 |
---|---|
[2][SQL] JOIN 총 정리 - JOIN의 종류 및 설명(INNER JOIN, OUTER JOIN) (2) | 2021.07.16 |
[1][SQL] JOIN 총 정리 - JOIN의 정의 (0) | 2021.07.16 |
[0][SQL] JOIN 총 정리 (0) | 2021.07.16 |
댓글