📌 My Sql에서 가장 많은 책을 출판한 저자의 최근 출판된 책 찾기
📌 개념 정리
이번 포스팅에서는 MySQL에서 서브쿼리(subquery)를 활용하여 데이터를 효율적으로 조회하는 방법을 설명합니다. 서브쿼리는 쿼리 내에 또 다른 쿼리를 포함시켜, 더 복잡한 조건을 처리할 수 있는 강력한 도구입니다. 예시를 통해 서브쿼리를 어떻게 활용하는지, 그리고 그 결과가 어떻게 나오는지 쉽게 비유를 들어 설명합니다.
🚦 서브쿼리란 무엇인가?
서브쿼리는 쿼리 안에 포함된 또 다른 쿼리입니다. 마치 한 문제를 풀기 위해 다른 문제를 풀고, 그 결과를 바탕으로 최종 답을 구하는 과정과 비슷합니다. 예를 들어, 우리가 어떤 저자가 가장 많은 책을 출판했는지 알고 싶다면, 먼저 저자별로 책의 개수를 계산하고, 그 중에서 가장 많이 출판한 저자를 찾아야 합니다. 이때 서브쿼리를 사용하면 간단히 해결할 수 있습니다.
서브쿼리는 WHERE, FROM, SELECT와 같은 위치에서 사용할 수 있습니다. 서브쿼리의 결과를 외부 쿼리가 참조하여, 더 복잡한 조건을 처리하는 방식입니다.
💻 서브쿼리 예시 및 설명
📌 예시: 가장 많은 책을 출판한 저자 찾기
SELECT title, author, publishing FROM books
WHERE author = (SELECT author FROM books GROUP BY author ORDER BY COUNT(*) DESC LIMIT 1)
ORDER BY publishing DESC LIMIT 1;
설명: 이 쿼리는 서브쿼리를 사용하여 가장 많은 책을 출판한 저자를 찾아, 그 저자가 쓴 가장 최근의 책을 조회하는 예시입니다. 이 쿼리는 두 부분으로 나뉩니다:
- 서브쿼리 (SELECT author FROM books GROUP BY author ORDER BY COUNT(*) DESC LIMIT 1)
- 이 부분은 books 테이블에서 **저자(author)**별로 책의 개수를 세고, 그 중 가장 많이 출판한 저자를 찾는 쿼리입니다. GROUP BY author는 저자별로 데이터를 그룹화하고, ORDER BY COUNT(*) DESC는 각 저자별로 출판된 책의 개수를 기준으로 내림차순 정렬합니다. LIMIT 1을 사용하여 가장 많이 출판한 하나의 저자만 가져옵니다.
- 외부 쿼리 SELECT title, author, publishing FROM books WHERE author = ... ORDER BY publishing DESC LIMIT 1;
- 이 부분은 서브쿼리에서 찾은 가장 많은 책을 출판한 저자가 쓴 책들 중에서 가장 최근에 출판된 책을 찾는 쿼리입니다. ORDER BY publishing DESC는 최신 출판일 순으로 정렬하고, LIMIT 1은 그 중 첫 번째 책만 가져옵니다.
이 두 쿼리가 결합되어 서브쿼리를 통해 저자 정보를 구하고, 그 저자의 책 중에서 가장 최근 책을 가져옵니다.
📌 서브쿼리의 역할
서브쿼리는 내부 쿼리로, 외부 쿼리의 조건에 맞는 데이터를 필터링하는 역할을 합니다. 예시에서는 먼저 가장 많은 책을 출판한 저자를 찾고, 그 저자가 쓴 책들 중에서 가장 최신 책을 찾아내는 데 사용되었습니다. 서브쿼리가 없었다면, 이 두 단계를 한 번에 처리하는 것은 복잡했을 것입니다.
🚀 서브쿼리 활용의 장점
- 복잡한 조건을 단순화: 서브쿼리를 사용하면 복잡한 조건을 하나의 쿼리로 해결할 수 있습니다. 예를 들어, 위 쿼리처럼 두 개의 쿼리를 한 번에 처리하여 더 효율적으로 데이터를 추출할 수 있습니다.
- 가독성 향상: 서브쿼리를 사용하면 복잡한 계산을 외부 쿼리에서 분리하여 가독성을 높일 수 있습니다. 각 단계의 처리가 분명히 나누어져 있어, 쿼리가 더 명확해집니다.
- 성능 최적화: 일부 경우, 서브쿼리를 사용하여 불필요한 데이터 검색을 줄이고 성능을 향상시킬 수 있습니다. 예를 들어, 특정 조건만 필요한 데이터를 미리 계산하여 가져오는 방식입니다.
🧪 실전 활용 예시
서브쿼리는 비즈니스 로직을 처리할 때 매우 유용합니다. 예를 들어, 전자상거래 사이트에서 가장 많이 판매된 제품을 찾거나, 최고 평점을 받은 영화를 찾는 데 사용할 수 있습니다.
예시 1: 가장 많은 판매량을 기록한 제품 찾기
SELECT product_name, sales FROM products
WHERE product_id = (SELECT product_id FROM sales GROUP BY product_id ORDER BY SUM(quantity) DESC LIMIT 1);
예시 2: 평균 평점이 높은 영화 찾기
SELECT movie_title, average_rating FROM movies
WHERE movie_id = (SELECT movie_id FROM reviews GROUP BY movie_id ORDER BY AVG(rating) DESC LIMIT 1);
🧠 고급 팁
🔥 서브쿼리 최적화
서브쿼리가 너무 복잡하거나 실행 시간이 오래 걸리는 경우, JOIN을 사용하는 방법도 고려해볼 수 있습니다. JOIN은 서브쿼리보다 더 효율적일 수 있으며, 데이터베이스에서 직접적으로 연관된 테이블을 결합하여 더 빠르게 결과를 얻을 수 있습니다.
✅ 서브쿼리의 깊이 제한
서브쿼리가 너무 깊어지면 성능이 저하될 수 있습니다. 서브쿼리 중첩을 줄이고, 필요한 부분만 쿼리하도록 신경써야 합니다.
✅ 마무리 요약 및 복습 포인트
- 서브쿼리는 내부 쿼리로 외부 쿼리의 조건을 처리하는 유용한 도구입니다.
- 복잡한 조건을 처리할 때 서브쿼리를 사용하면 쿼리의 가독성과 효율성을 높일 수 있습니다.
- 실무에서 서브쿼리를 활용하여 복잡한 비즈니스 로직을 간단히 처리할 수 있습니다.
- 성능 최적화를 위해 서브쿼리를 적절히 사용하고, 필요 시 JOIN을 고려하는 것이 중요합니다.
이 포스팅을 통해 서브쿼리에 대한 이해를 깊이 있게 다지고, 실무에서 유용하게 활용할 수 있는 방법을 익히셨길 바랍니다! 🚀