※ SubQuery란?
서브쿼리(SubQuery)란 다른 SQL문 안에 포함된 하위 SELECT 문을 의미합니다.
즉, 하나의 쿼리 결과를 또 다른 쿼리에서 조건이나 테이블처럼 활용하는 방식입니다.
서브쿼리는 일반적으로 다음과 같은 경우에 사용됩니다:
📌 조건식에서 다른 쿼리의 결과를 활용할 때
📌 SELECT 절에서 계산된 값을 사용할 때
📌 FROM 절에서 임시 테이블로 사용할 때
-- 예시: 평균 점수보다 높은 학생 조회
SELECT name, score
FROM grade
WHERE score > (SELECT AVG(score) FROM grade);
→ (SELECT AVG(score) FROM grade)는 서브쿼리이며,
이 결과를 메인 쿼리의 조건으로 사용합니다.
※ 서브쿼리의 종류
서브쿼리는 반환되는 행(row)과 열(column)의 개수에 따라 다음과 같이 구분됩니다.
| 종류 | 설명 | 예시 |
|---|---|---|
| 단일 행 서브쿼리 | 결과가 1행 | =, >, < 사용 가능 |
| 다중 행 서브쿼리 | 결과가 여러 행 | IN, ANY, ALL, EXISTS 사용 |
| 다중 열 서브쿼리 | 결과가 여러 열 | 튜플 비교 형태 사용 |
| 스칼라 서브쿼리 | SELECT 절에서 사용 (단일 값 반환) | SELECT (SELECT COUNT(*) ...) |
※ 단일행 & 다중행 서브쿼리
📌 단일행 서브쿼리
-- 평균 점수보다 높은 학생 조회
SELECT name, score
FROM grade
WHERE score > (SELECT AVG(score) FROM grade);
📌 다중행 서브쿼리 (IN / ANY / ALL)
-- AI 전공 학생들의 점수 조회
SELECT name, score
FROM grade
WHERE student_id IN (
SELECT student_id
FROM student
WHERE major = 'AI Engineering'
);
-- 최소 점수보다 높은 점수를 가진 학생 조회 (ALL)
SELECT name, score
FROM grade
WHERE score > ALL (
SELECT score FROM grade WHERE subject = 'Math'
);
→ IN은 여러 개 중 하나와 일치하는지,
ALL은 모두보다 큰지, ANY는 하나라도 큰지를 비교합니다.
※ FROM 절 서브쿼리 (인라인 뷰)
서브쿼리는 FROM 절에서도 사용되어, 결과를 임시 테이블처럼 사용할 수 있습니다.
이를 인라인 뷰(Inline View)라고 부릅니다.
-- 과목별 평균 점수와 최고점수 조회
SELECT subject, avg_score, max_score
FROM (
SELECT subject, AVG(score) AS avg_score, MAX(score) AS max_score
FROM grade
GROUP BY subject
) AS summary
ORDER BY avg_score DESC;
→ 인라인 뷰는 복잡한 집계나 조건 처리를 별도의 테이블처럼 재활용할 때 유용합니다.
※ JOIN이란?
JOIN(조인)은 두 개 이상의 테이블을 공통 컬럼(키, PK/FK 등)을 기준으로 연결하여
하나의 결과 집합을 만드는 연산입니다. RDBMS의 가장 강력한 기능 중 하나이며, 실무 SQL의 핵심입니다.
-- 학생 정보와 성적을 조인
SELECT s.name, s.major, g.subject, g.score
FROM student s
JOIN grade g ON s.student_id = g.student_id;
→ 조인을 사용하면 서로 다른 테이블의 데이터를 한 번의 조회로 결합하여 볼 수 있습니다.
※ 조인의 주요 종류
| 종류 | 설명 | 예시 |
|---|---|---|
| INNER JOIN | 양쪽 테이블에서 조건이 일치하는 행만 반환 | 가장 일반적인 조인 |
| LEFT JOIN | 왼쪽 테이블의 모든 행 + 조건 일치 시 오른쪽 데이터 | 왼쪽 기준 전체 조회 |
| RIGHT JOIN | 오른쪽 테이블의 모든 행 + 조건 일치 시 왼쪽 데이터 | 오른쪽 기준 전체 조회 |
| FULL OUTER JOIN | 양쪽 테이블의 모든 행을 반환 (MySQL은 지원 안 함) | PostgreSQL 등에서 사용 |
| SELF JOIN | 자기 자신과 조인 | 계층 구조 표현 등에 활용 |
※ INNER JOIN / LEFT JOIN 예제
-- INNER JOIN: 공통 student_id가 있는 행만 반환
SELECT s.name, g.subject, g.score
FROM student s
INNER JOIN grade g ON s.student_id = g.student_id;
-- LEFT JOIN: 학생은 있지만 성적이 없는 경우도 포함
SELECT s.name, g.subject, g.score
FROM student s
LEFT JOIN grade g ON s.student_id = g.student_id;
→ INNER JOIN은 교집합, LEFT JOIN은 왼쪽 테이블을 기준으로 한 외부조인입니다.
※ SELF JOIN & CROSS JOIN
-- SELF JOIN: 같은 테이블에서 관계 비교
SELECT e1.name AS 직원, e2.name AS 상사
FROM employee e1
JOIN employee e2 ON e1.manager_id = e2.emp_id;
-- CROSS JOIN: 두 테이블의 가능한 모든 조합
SELECT s.name, g.subject
FROM student s
CROSS JOIN grade g;
→ SELF JOIN은 조직 구조나 계층 표현에, CROSS JOIN은 카테고리 조합 분석 등에 사용됩니다.
※ ANSI JOIN vs Non-ANSI JOIN
과거 SQL에서는 WHERE 절을 사용한 “Non-ANSI JOIN” 방식을 사용했지만,
현재는 가독성과 유지보수성이 높은 ANSI JOIN 문법이 표준입니다.
-- Non-ANSI (옛날 방식)
SELECT s.name, g.subject
FROM student s, grade g
WHERE s.student_id = g.student_id;
-- ANSI (표준 방식, 권장 ✅)
SELECT s.name, g.subject
FROM student s
JOIN grade g ON s.student_id = g.student_id;
→ 표준 ANSI 문법을 사용하는 것이 협업, 유지보수, 복잡한 조인 작성에 훨씬 유리합니다.
'2025 현대오토에버 모빌리티 SW 스쿨(클라우드 2기) > 데이터베이스' 카테고리의 다른 글
| [Database] DML과 트랜잭션(TCL) (0) | 2025.10.07 |
|---|---|
| [Database] DDL과 제약 조건 (0) | 2025.10.07 |
| [Database] SQL 언어 완벽 정리 (2) – 함수와 GROUP BY (0) | 2025.10.07 |
| [Database] SQL 언어 완벽 정리 (1) – 개요 및 SELECT 기본 (0) | 2025.10.07 |
| [Database] 관계형 데이터베이스(RDBMS) 이해 (0) | 2025.10.07 |