해당 포스트는
SQLD
를 학습하며 정리한 내용에 대한 포스트입니다.
이론을 학습한 내용을 정리하고 퀴즈, 기출문제 등을 기록하려고 합니다.
🌈 SUB QUERY (서브쿼리)
💡 SUB QUERY의이름
1 2 3 SELECT (스칼라서브쿼리 SCALA SUBQUERY) FROM (인라인뷰 INLINE VIEW) WHERE(HAVING) X = (중첩서브쿼리 NESTED SUBQUERY)
💻 MAIN QUERY와 SUB QUERY
Subquery는 SELECT문 내에 다시 SELECT문을 사용하는 SQL문이다.
Subquery의 형태는 FROM구에 SELECT문을 사용하는 인라인 뷰(Inline View)
와 SELECT문에 Subquery를 사용하는 스칼라 서브쿼리(Scala Subquery)
등이 있다.
WHERE 또는 HAVING 에 SELECT문을 사용하면 중첩 서브쿼리(Nested Subquery)
라고 한다.
메인 쿼리의 컬럼이 포함된 서브쿼리를 연관 서브쿼리
, 메인 쿼리의 컬럼이 포함되지 않은 서브쿼리를 비연관 서브쿼리
라고 한다.
- 아래는 키가 177 초과되는 데이터를 출력한다.
- 김용만의 키가 177임을 알고 있을때 할 수 있는 쿼리문이다.
- 그러나 몰랐을 때는 어떻게 해야 할까? 이 때, 서브 쿼리를 적절히 이용하면 된다.
- 통상적으로 사람을 기억할 때는 키가 포인트가 되는 것이 아니라, 이름을 기억한다.
위의 예에 WHERE 구에 있는 SELECT문은 서브쿼리(Subquery)이고 괄호 내에 SELECT문을 사용한다.
서브쿼리 밖에 있는 SELECT문은 메인쿼리(Main Query)이다,
FROM구에 SELECT문을 사용하여 가상의 테이블을 만드는 효과를 얻을 수 있다.
이렇게 FROM구에 SELECT문을 사용한 것이 인라인 뷰(inline View)이다.
💻 SCALA SUBQUERY(스칼라 서브쿼리)
주로 SELECT 절에 위치하지만 컬럼이 올 수 있는 대부분에 위치에 사용가능
스칼라 Subquery는 반드시 한 행과 한 컬럼만 반환하는 서브쿼리이다.
만약 여러 행이 반환되면 오류가 발생한다.
앞의 예처럼 직원 급여를 조회할 때 평균급여를 같이 계산하여 조회한다.
스칼라 SUBQUERY를 사용해서 직원의 평균급여를 함께 계산한 것이다.
💻 INLINE VIEW (인라인 뷰)
- 인라인뷰는 FROM절 등 테이블명이 올 수 있는 위치에 사용가능
1
2
3
4
5
6
7
8
9
10
11
SELECT M.PRO_CODE,
S.PRO_NAME,
S.PRICE,
M.MEMBER_ID
M.CONTENT
FROM PRO_REVIEW M,
`(SELECT PRO_CODE,
PRO_NAME,
PRICE,
FROM PRODUCT) S`
WHERE M.PRO_CODE = S.PRO_CODE
💻 NESTED SUBQUERY (중첩 서브쿼리)
- WHERE절과 HAVING절에서 사용가능
메인 쿼리와의 관계에 따라 다음과 같이 나눌 수 있다.
비연관 서브쿼리 (Uncooreleated Subquery) | 메인 쿼리와 관계를 맺고 있지 않음 |
연관 서브쿼리 (Corelated Subquery) | 메인 쿼리와 관계를 맺고 있음 |
비연관 서브쿼리 (Uncooreleated Subquery) : 서브 쿼리 내에 메인 쿼리의 컬럼이 존재하지 않음
연관 서브쿼리 (Corelated Subquery) :서브 쿼리 내에 메인 쿼리의 컬럼이 존재
서브쿼리 종류(반환 행)
서브쿼리(Subquery)는 반환하는 행 수가 한 개인 것과 여러 개인 것에 따라서 단일 행 서브쿼리와 멀티 행 서브쿼리로 분류된다.
다중 컬럼의 데이터를 반환할 경우 다중 컬럼 서브쿼리라 한다.
서브쿼리 종류 | 설명 |
---|---|
단일 행 서브쿼리 | - 서브쿼리를 실행하면 그 결과는 반드시 한 행만 조회된다. - 비교 연산자인 =, <, <=, >, >=, <>를 사용한다. |
다중 행 서브쿼리 | - 서브쿼리를 실행하면 그 결과는 여러 개의 행이 조회된다. - 다중 행 비교 연산자인 IN, ANY, ALL, EXISTS를 사용한다. |
다중 컬럼 서브쿼리 | - 서브쿼리가 여러 컬럼의 데이터를 반환 |
단일 행 Subquery
단일 행 서브쿼리는 단 하나
의 행만 반환하는 서브쿼리로 비교 연산자(=, <, <=, >=, <=)를 사용한다.
다중 행 Subquery
다중 행 서브쿼리는 서브쿼리 결과가 여러 개의 행을 반환
하는 것으로 다중 행 연산자(IN, ANY, ALL,EXISTS)를 사용해야 한다.
다중 행 연산 | 설명 |
---|---|
IN | - Main query의 비교조건이 Subqueary의 결과 중 하나만 동일하면 참이 된다(OR조건). |
ALL | - Main query와 Subquery의 결과가 모두 동일하면 참이 된다. - < ALL: 최솟값을 반환한다. - > ALL: 최댓값을 반환한다. |
ANY | - Main query의 비교조건이 Subquery의 결과 중 하나 이상 동일하면 참이 된다. - < ANY: 하나라도 크게 되면 참이 된다. - > ANY: 하나라도 작게 되면 참이 된다. |
EXISTS | - Main query와 Subquery의 결과가 하나라도 존재하면 참이 된다. |
ANY
위의 쿼리문을 실행해보면 에러가 발생한다.
그 이유는 반드시 비교대상이 숫자 1개의 값이 나와야 되는데 서브쿼리를 따로 실행해보면 2개가 나오는 것을 알 수 있다.
비교대상의 모호성이 발생되면서 문법이 맞지 않는 것이다.
예시 코드 서브쿼리 앞에 ANY를 붙였다.
서브쿼리 별과값이 170, 173이었다.
서브 쿼리 앞에 ANY의 의미는 OR의 개념과 비슷하다.
170이거나 173이다. 즉 다시 말해 170이상인 데이터를 다 출력하겠다 라는 의미가 되는 것이다.
기억할 것은 서브쿼리가 반환하는 값이 키(Height)라는 것이다.
- ANY와 동일한 역할을 하는것으로 SOME도 존재한다.
- 부등호를
=
을 바꾸게 되면 170, 173과 똑같은 결과값을 리턴해준다.
ALL
ALL은 서브쿼리의 결과값 둘 다 만족하는 데이터만 출력한다.
즉, AND의 개념과 유사하다.
- 즉, 170, 173을 만족하는 값은 173인 것이다.
IN
IN은 MAIN QUERY의 비교조건이 SUBQUERY의 결과 중 하나만 동일하면 참이된다. (OR조건과 유사)
IN은 반환되는 여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산이다.
EXISTS
EXISTS는 SUBQUERY로 어떤 데이터 존재 여부를 확인하는 것이다
즉, EXISTS의 결과는 참과 거짓인 BOOLEAN 값이 반환된다
첫 번째 SELECT문의 결과를 토대로 하여 WHERE EXISTS의 SELECT를 비교해서 맞는 행이 존재한다면 출력하는 것이다.
- DISTINCT와 비슷한 역할을 한다.
🎯 추가 내용
📚 레퍼런스
정미나. (유튜브 선생님에게 배우는) 유선배 SQL개발자(SQLD) 과외노트 / [정미나 저] (2023). Print.
한국데이터산업진흥원. SQL 자격검정 실전문제 : 국가공인 SQL전문가·국가공인 SQL개발자 / 한국데이터산업진흥원 [편] (2020). Print.