**서브쿼리(subquery)**는 SELECT 구문 안에 다른 SELECT 쿼리를 포함시키는 방식으로, 중첩된 쿼리로 데이터를 다시 조회하거나 계산할 수 있게 해주는 강력한 도구입니다. 이 서브쿼리는 괄호(()) 안에 작성되며, 쿼리의 일부로 처리됩니다.
서브쿼리의 기본 원리
서브쿼리는 하나의 쿼리 내에 다른 쿼리를 내부적으로 실행하는 방식입니다. 서브쿼리는 **괄호 ()**로 둘러싸여 있으며, 외부 쿼리에서 결과를 사용하게 됩니다.
📌 예시 분석
SELECT title, rating
FROM books
WHERE rating > (SELECT AVG(rating) AS rating_avg FROM books);
1. 서브쿼리 부분: (SELECT AVG(rating) AS rating_avg FROM books)
- 이 부분은 서브쿼리로, books 테이블에서 rating 컬럼의 평균값을 구하고 있습니다.
- AVG(rating)는 평균 값을 계산하는 집계 함수입니다. 이 서브쿼리는 books 테이블의 모든 rating 값의 평균을 계산하고, 이 값은 rating_avg라는 **별칭(alias)**로 불립니다.
- 서브쿼리에서 나온 값은 하나의 숫자로 반환됩니다. 예를 들어, rating_avg = 4.2라고 할 수 있습니다.
2. 외부 쿼리 부분: SELECT title, rating FROM books WHERE rating > (서브쿼리)
- 외부 쿼리는 books 테이블에서 **title**과 **rating**을 가져옵니다.
- WHERE rating > (서브쿼리)는, 서브쿼리에서 계산된 평균값(rating_avg)보다 큰 rating을 가진 레코드만 선택합니다.
- 예를 들어, 만약 서브쿼리에서 rating_avg = 4.2가 반환되면, 외부 쿼리는 rating 값이 4.2보다 큰 모든 title과 rating을 반환합니다.
📌 서브쿼리 예시 2: 여러 컬럼을 이용한 서브쿼리 사용
서브쿼리는 단일 컬럼뿐만 아니라 여러 컬럼에도 사용할 수 있습니다. 예를 들어, 특정 조건을 만족하는 데이터를 서브쿼리로 먼저 추출한 후, 그 결과를 외부 쿼리에서 활용하는 방식입니다.
sql
SELECT title, rating
FROM books
WHERE rating > (
SELECT AVG(rating)
FROM books
WHERE author = '한강'
);
이 예시에서는 author가 '한강'인 책들의 평균 rating을 구하는 서브쿼리를 작성하고, 그 평균보다 높은 rating을 가진 책만을 선택합니다.
서브쿼리 사용 시 유의점
- 성능 문제
- 서브쿼리가 단일 결과를 반환할 때는 성능이 좋지만, 만약 서브쿼리가 다수의 값을 반환하면 성능 문제가 발생할 수 있습니다. 이런 경우에는 JOIN이나 IN 절을 사용하는 것이 더 효율적일 수 있습니다.
- 서브쿼리의 위치
- 서브쿼리는 SELECT, WHERE, HAVING, FROM 등 여러 위치에서 사용될 수 있습니다. 각 위치에서 서브쿼리는 다르게 동작하므로 사용하는 위치에 따라 쿼리의 결과가 달라질 수 있습니다.
- IN, EXISTS와 결합
- 서브쿼리를 IN이나 EXISTS와 결합하여 여러 값을 비교하거나 조건을 설정할 수도 있습니다.
SELECT title, rating
FROM books
WHERE rating IN (SELECT rating FROM books WHERE author = '한강');
4️⃣ 고급 팁 – 개발자 성장에 도움 되는 활용법
- 🔥 서브쿼리 성능 최적화
- 서브쿼리는 성능에 부담을 줄 수 있기 때문에, **JOIN**이나 WITH 구문을 사용하여 서브쿼리를 최적화할 수 있습니다.
- 서브쿼리가 반환하는 값이 단일 값이라면, 성능에 크게 영향을 미치지 않지만, 다수의 값을 반환하는 서브쿼리는 **JOIN**을 고려하는 것이 좋습니다.
- ✅ JOIN vs 서브쿼리
- **JOIN**은 같은 테이블의 여러 컬럼을 합칠 때, 서브쿼리는 값을 구할 때 유용하게 사용됩니다.
- 예시: JOIN은 두 테이블을 합치는 데 유용하지만, 집계값을 계산하는 데는 서브쿼리가 더 편리할 때가 있습니다.
- 🚀 서브쿼리 사용 시 EXISTS 활용
- 서브쿼리 내에서 **EXISTS**를 사용할 경우, 해당 조건이 존재하는지 여부를 빠르게 확인할 수 있어 효율적입니다.
SELECT title, rating
FROM books
WHERE EXISTS (SELECT 1 FROM reviews WHERE reviews.book_id = books.book_id);
결론
서브쿼리는 쿼리 내에서 다른 쿼리를 실행하는 강력한 기능입니다. 이때 서브쿼리의 결과는 단일 값이나 여러 값일 수 있으며, WHERE, HAVING, FROM 등의 다양한 위치에서 활용됩니다. AVG()와 같은 집계 함수를 서브쿼리에서 사용하고, 그 값을 외부 쿼리에서 비교하는 방식으로 데이터를 효율적으로 처리할 수 있습니다!
서브쿼리와 함께 쿼리 최적화 방법을 잘 익히면, 복잡한 데이터 분석 작업을 효율적이고 우아하게 처리할 수 있을 거야!
'기술블로그' 카테고리의 다른 글
📌 MySQL Safe Update Mode란? 활성화, 비활성화 (0) | 2025.03.25 |
---|---|
📌 My Sql에서 가장 많은 책을 출판한 저자의 최근 출판된 책 찾기 (0) | 2025.03.25 |
📌 MySQL Group By와 집계 함수 활용(Error Code 1055 해결 방법) (0) | 2025.03.25 |
📌 Select *와 Select 컬럼 지정의 차이점: 성능 최적화와 효율적인 쿼리 작성 (0) | 2025.03.25 |
📌 My Sql에서 부분 일치 검색으로 중복 데이터 제거하기 (0) | 2025.03.25 |