[mysq]서브쿼리란?
mysql에서 보편적으로 가장 많이 사용하는 쿼리는
select * from table; 명령어일 것이다. 이 때, 다른 테이블의 컬럼들도 같이 select 할 때에는, 보고자 하는 테이블의 관계가 있을 때에는 inner join이나 outer join 등을 사용하여 많이들 사용할 것이다. 그런데 간혹 select * from 의 *에 또다시 select를 하는 쿼리가 있는 경우가 있는데, 이를 서브쿼리라고 한다.
그렇다면 서브쿼리는 무엇일까?
- 서브쿼리는 한 쿼리 내에서 다른 쿼리를 사용할 수 있는 기능으로서, 여러형태로 사용할 수 있는데 보통 where절, from절, 그리고 select 절에서 많이 사용된다.
아래에는 select, where, from 각각의 사용 예시이다.
1. where절 예시
SELECT name, age
FROM students
WHERE age > (SELECT AVG(age) FROM students);
여기서 서브쿼리는 학생들의 평균 나이를 계산하고, 메인 쿼리는 평균 나이보다 많은 학생들의 이름과 나이를 반환합니다.
2. from절 예시
SELECT avg_age_department.department, avg_age_department.avg_age
FROM (
SELECT department, AVG(age) as avg_age
FROM employees
GROUP BY department
) as avg_age_department;
여기서 서브쿼리는 각 부서별로 직원의 평균 나이를 계산하고, 메인 쿼리는 이를 반환합니다.
3. select절 예시
SELECT orders.order_id, orders.total,
(SELECT COUNT(*) FROM order_details WHERE order_details.order_id = orders.order_id) AS items_count
FROM orders;
여기서 서브쿼리는 각 주문에 대해 관련 상세 항목의 수를 계산하고, 메인 쿼리는 주문 ID, 총액, 항목 수를 반환합니다.
특히 서브쿼리는 inner join과 비슷하지만 약간의 유형이 다른데, 아래의 경우에 많이 사용되곤 한다.
1. 집계 기능 사용
- 서브쿼리를 사용하면 특정 그룹 또는 분류에 대해 집계 기능을 적용한 후 이를 메인 쿼리와 결합할 수 있다. 이러한 경우에는 inner join만을 사용하여 서브쿼리와 동일한 결과를 얻기는 힘들다.
2. 비교 연산
- 서브쿼리는 특정 값과 비교할 때 주로 사용된다.(예를 들어, 평균값, 최대값 등). 이러한 서브쿼리를 통해 메인 쿼리의 각 행을 특정 계산 값과 비교할 수 있다.
3. 가독성 및 유지보수
- 서브쿼리를 사용하면 복잡한 쿼리를 여러 단계로 분리하여 쿼리의 가독성을 향상시킬 수 있다. 이는 유지보수를 좀 더 쉽게하는 이점이 있다.
4. 논리적 제약 조건
- 어떤 경우에는 쿼리의 논리적인 제약 조건 때문에 서브쿼리가 inner join보다 더 적합할 때가 있다. 예를 들어, 한 테이블의 특정 값이 다른 테이블의 특정 값보다 큰 행만 반환하려면 서브쿼리를 사용하는 것이 좋다.
<예시>
그렇다면 서브쿼리의 예시를 보도록 하자.
1. 집계 기능 사용 예시
SELECT employees.name, employees.salary
FROM employees
WHERE employees.salary > (
SELECT AVG(salary) FROM employees WHERE department_id = 10
);
이 쿼리는 department_id가 10인 부서의 평균 급여보다 더 많이 받는 직원을 검색하는 서브쿼리다.
2. 비교 연산 예시
SELECT name, age
FROM students
WHERE age > (
SELECT MAX(age) - 5 FROM students
);
이 쿼리는 학생 중에서 최고령 학생의 나이보다 5세 적은 학생보다 나이가 많은 학생을 찾는다.
3. 가독성 및 유지보수
SELECT name, total_sales
FROM (
SELECT name, SUM(sales) as total_sales
FROM sales
GROUP BY name
) as subquery
WHERE total_sales > 1000;
이 쿼리는 각 이름별 총 판매량을 계산한 후, 1000을 초과하는 판매량을 가진 이름만을 반환한다.
4. 논리적 제약 조건
SELECT product_id, product_name
FROM products
WHERE price > (
SELECT price FROM products WHERE product_id = 200
);
이 쿼리는 product_id가 200인 제품의 가격보다 더 비싼 제품을 찾습니다.
이번에 서브쿼리를 검색하고 알아보게 된 계기는, 이번에 인수인계 받은 프로젝트에서 서브쿼리를 많이 사용하였는데 내가 서브쿼리를 제대로 사용해본적이 없었기 때문이다.
그렇기에 이번 기회를 통해 서브쿼리에 대해 좀 더 공부를 해볼 예정이다.