Post

[SQL] 서브쿼리에 대해 _ SUBQUERY

서브쿼리(Subquery)란?

SQL문에서 메인쿼리 내부에 포함되는 또 다른 쿼리를 의미한다. 서브쿼리는 메인 쿼리의 일부분으로서, 데이터를 검색, 필터링, 비교하는 데 사용된다. 서브쿼리는 괄호( )로 둘러싸여 있으며, SELECT문을 통해 데이터를 반환한다.

✍️ 예제 테이블

(Grade)

IdNameSubjectScore
1김철수수학85
2이영희수학90
3박지민영어75
1김철수영어80
2이영희과학95
3박지민수학85

비상관 서브쿼리(Uncorrelated Subquery)

비상관 서브쿼리는 메인 쿼리와 독립적으로 실행되는 서브쿼리이다. 즉, 서브쿼리는 메인 쿼리와 데이터를 공유하지 않으며, 메인 쿼리의 실행에 영향을 받지 않는다. 비상관 서브쿼리는 일반적으로 한 번만 실행되며, 그 결과는 메인쿼리에서 사용된다.

1
2
3
SELECT *
FROM TableA
WHERE id IN (SELECT id FROM TableB); -- subquery

💡 추가 연산자

연산자의미
ALL서브쿼리의 모든 결과에 대해 ~ 하다.
ANY서브쿼리의 하나 이상의 결과에 대해 ~ 하다.

비상관 서브쿼리 사용 예시

1
2
3
SELECT * FROM Grade
WHERE Score > ALL (
  SELECT Score FROM Grade WHERE Name = '박지민');

박지민의 모든 성적 보다 높은 모든 학생의 성적을 출력(즉, MAX보다 높은), 만약 ‘ANY’ 사용시 하나 이상의 성적 보다 높은 모든 학생을 출력(즉, MIN보다 높은)한다.

IdNameSubjectScore
2이영희수학90
2이영희과학95

상관 서브쿼리(Correlated subquery)

상관 서브쿼리는 메인 쿼리의 데이터에 의존하는 서브쿼리이다. 즉, 서브 쿼리가 메인 쿼리의 결과에 따라 달라진다. 서브쿼리 내부에서 메인 쿼리의 테이블을 참조하는 경우, 이를 상관 서브 쿼리라고 한다. 상관 서브쿼리는 메인 쿼리의 각 행에 대해 실행되므로, 일반적으로 비상관 서브쿼리보다 성능이 느릴 수 있다.

1
2
3
SELECT a.*
FROM TableA a
WHERE EXISTS (SELECT 1 FROM TableB b WHERE a.id = b.id);

💡 추가 연산자

연산자의미
EXISTS서브쿼리가 하나 이상의 행을 반환하는 경우 참(True)를 반환
NOT EXISTS서브쿼리가 단 한개의 행도 반환하지 않을 때 참(True)를 반환

상관 서브쿼리 사용예시

1
2
3
4
5
6
7
SELECT g.*
FROM Grade g
WHERE g.Score > (
  SELECT AVG(gg.Score)
  FROM Grade gg
  WHERE gg.Id = g.Id
);

각 학생이 수강하는 과목 중에서 평균 성적보다 높은 성적을 받은 과목들을 찾는 쿼리

IdNameSubjectScore
1김철수수학85
2이영희과학95
3박지민수학85
This post is licensed under CC BY 4.0 by the author.