이 글은 SQLD를 공부하며 서브쿼리(Subquery)에 대해 정리한 글이다.
메인쿼리와 서브쿼리
- 서브쿼리(Subquery)는
SELECT
문 내에 다시SELECT
문을 사용하는 SQL문을 의미함 - 서브쿼리는 인라인 뷰(Inline View)와 스칼라 서브쿼리(Scala Subquery) 등이 있음
- 인라인 뷰 :
FROM
구에SELECT
문을 사용 - 스칼라 서브쿼리 :
SELECT
문에 서브쿼리를 사용
- 인라인 뷰 :
WHERE
구에SELECT
문을 사용하는 것도 서브쿼리라고 함
SELECT *
FROM STUDENT
WHERE DEPTNO =
(SELECT DEPTNO FROM DEPT
WHERE DEPTNO=1);
- 위 예시에서
WHERE
구에 있는SELECT
문이 서브쿼리임- 서브쿼리를 사용할 때에는 괄호 안에 넣어서 사용함
- 서브쿼리 밖에 있는
SELECT
문을 메인쿼리(Main Query)라고 함
SELECT *
FROM (SELECT DEPTNO DEPT, NAME
FROM STUDENT) A
WHERE DEPT <= 2;
- 위 예시와 같이
FROM
구에SELECT
문을 사용하면 가상의 테이블을 만드는 효과를 얻을 수 있음 FROM
구에SELECT
문을 사용한 것을 인라인 뷰라고 함
단일 행 서브쿼리와 다중 행 서브쿼리
- 서브쿼리는 반환하는 행 수에 따라서 단일 행 서브쿼리와 멀티 행 서브쿼리(혹은 다중 행 서브쿼리)로 분류됨
- 단일 행 서브쿼리는 단 하나의 행반 반환하는 서브쿼리
- 비교연산자를 사용함
- 다중 행 서브쿼리는 여러 개의 행을 반환하는 서브쿼리
IN
,ANY
,ALL
,EXISTS
를 사용
다중 행 서브쿼리(Multi Row Subquery)
- 다중 행 서브쿼리는 서브쿼리 결과로 여러 개의 행을 반환하는 것으로, 다중 행 연산자를 사용함
- 다중 행 연산자는
IN
,ALL
,ANY
,EXISTS
가 있음
IN 연산자
IN
은 반환되는 여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산
SELECT NAME, DEPT, AGE
FROM STUDENT, DEPT
WHERE STUDENT.DEPTNO = DEPT.DEPTNO
AND STUDENT.STDNO
IN (SELECT STDNO FROM STUDENT
WHERE AGE >= 23);
IN(Subquery)
에서 STUDENT 테이블에서 AGE가 23 이상인 STDNO를 반환- 반환된 STDNO와 메인쿼리에 있는 STDNO와 비교하여 같은 것을 조회함
ALL 연산자
- 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참이 됨
SELECT *
FROM STUDENT
WHERE AGE <= ALL(SELECT AGE FROM STUDENT WHERE DEPTNO=1)
- 서브쿼리 우선 동작으로, STUDENT 테이블에서 DEPTNO가 1인 AGE 데이터를 선택
- 선택된 AGE들보다 작은 데이터를 STUDENT 테이블에서 조회
SELECT *
FROM STUDENT
WHERE AGE <= ALL(23, 25);
- STUDENT 테이블에서 AGE가 23보다 작은 데이터와 25보다 작은 데이터를 동시에 만족하는 데이터를 조회함
- (왜인지 MySQL에서 동작하지 않음... Syntax Error 발생)
EXISTS 연산자
- EXISTS는 서브쿼리를 사용하여 특정 데이터의 존재 여부를 확인하는 것
- EXISTS의 결과로 참 혹은 거짓 반환
SELECT NAME, DEPT, AGE
FROM STUDENT, DEPT
WHERE STUDENT.DEPTNO = DEPT.DEPTNO
AND EXISTS (SELECT 1 FROM STUDENT
WHERE AGE < 20);
- AGE가 20보다 작은 데이터가 있으면 참(TRUE)을, 없으면 거짓(FALSE)을 반환
스칼라 서브쿼리
- 스칼라 서브쿼리(Scala Subquery)는 반드시 한 행과 한 칼럼만 반환하는 서브쿼리
- 여러 행이 반환되면 오류가 발생
SELECT NAME AS '이름',
AGE AS '나이',
DEPTNO AS '학과코드',
(SELECT AVG(AGE) FROM STUDENT) AS '평균나이'
FROM STUDENT
WHERE AGE >= 23;
SELECT AVG(AGE) FROM STUDENT
가 스칼라 서브쿼리- 학생의 데이터를 조회할 때, 평균 나이 데이터를 계산하여 새로운 칼럼을 만들어 조회한 것
연관 서브쿼리
- 연관 서브쿼리(Correlated Subquery)는 서브쿼리 내에서 메인쿼리 내의 칼럼을 사용하는 것을 의미
- 메인쿼리의 데이터를 받아서 서브쿼리를 실행
SELECT NAME, DEPTNO
FROM STUDENT A
WHERE A.DEPTNO =
(SELECT DEPTNO FROM DEPT B
WHERE B.DEPTNO = A.DEPTNO);
Reference
1. 2024 이기적 SQL 개발자 이론서 + 기출문제 / https://product.kyobobook.co.kr/detail/S000212055970
2024 이기적 SQL 개발자 이론서+기출문제 | 임호진 - 교보문고
2024 이기적 SQL 개발자 이론서+기출문제 | 본 도서는 SQL 개발자 시험 경향을 분석하여 수험생들이 혼자서도 학습할 수 있도록 한 완벽 대비서로서, 시행처인 한국데이터산업진흥원에서 공개한 202
product.kyobobook.co.kr
'Data Science > SQL' 카테고리의 다른 글
SQLD | SQL 활용 - 그룹 함수(Group Function) (0) | 2024.03.03 |
---|---|
SQLD | SQL 활용 - 조인(JOIN) (0) | 2024.03.03 |
SQLD | SQL 기본 - DECODE문, CASE문, 그리고 WITH구문 (0) | 2024.03.02 |
SQLD | SQL 기본 - GROUP 연산과 SELECT문 실행 순서 (0) | 2024.03.02 |
SQLD | SQL 기본 - NULL의 특징과 NULL 값 조회 (2) | 2024.03.01 |