Lsiron

MySQL 서브쿼리(ANY, ALL) 본문

데이터베이스/MySQL

MySQL 서브쿼리(ANY, ALL)

Lsiron 2024. 7. 13. 04:25

서브쿼리란?

서브쿼리(Subquery)는 SQL 쿼리 내에 포함된 또 다른 SQL 쿼리이다. 서브쿼리는 쿼리 결과를 제한하거나 특정 조건을 만족하는 데이터를 선택하는 데 사용된다.

 

서브쿼리 특징

  • 알려지지 않은 기준을 이용한 검색에 유용하다.
  • 메인 쿼리가 실행되기 이전에 한 번만 실행한다.
  • 한 문장에서 여러 번 사용 가능하다.

서브쿼리 주의사항

  • 서브쿼리는 괄호와 함께 사용되어야 한다.
  • 서브쿼리 안에서 ORDER BY 절은 사용할 수 없다.
  • 서브쿼리는 연산자의 오른쪽에 사용돼야 한다.
  • 서브쿼리는 오로지 SELECT문으로만 작성 할 수 있다.

서브쿼리 종류

단일 행 서브쿼리 (Single-row Subquery): 결과가 한 행만 나오는 서브쿼리 이다. 서브쿼리가 결과를 1개의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리.

SELECT employee_id, name
FROM employees
WHERE department_id = (SELECT department_id
                       FROM departments
                       WHERE department_name = 'Sales');

 

다중 행 서브쿼리 (Multi-row Subquery): 결과가 한 행만 나오는 단일 행 서브쿼리와는 다르게 서브쿼리가 결과를 2개 이상 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리.

SELECT employee_id, name
FROM employees
WHERE department_id IN (SELECT department_id
                        FROM departments
                        WHERE location_id = 1700);

 

서브쿼리의 반환 값에 따른 분류 (비교연산 가능)

ANY (또는 SOME): 서브쿼리 결과 중 하나라도 조건을 만족하면 true를 반환한다.

SELECT name
FROM employees
WHERE salary > ANY (SELECT salary
                    FROM employees
                    WHERE department_id = 10);

 

ALL : 서브쿼리 결과 모두가 조건을 만족해야 true를 반환한다.

SELECT name
FROM employees
WHERE salary > ALL (SELECT salary
                    FROM employees
                    WHERE department_id = 10);

 

서브쿼리의 위치에 따른 분류

SELECT 절에서의 서브쿼리: SELECT 절 내에서 값을 계산하거나 반환하는 데 사용된다.

SELECT name,
       (SELECT AVG(salary)
        FROM employees
        WHERE department_id = e.department_id) AS avg_dept_salary
FROM employees e;

 

FROM 절에서의 서브쿼리: 서브쿼리를 임시 테이블처럼 사용하여 메인 쿼리에서 참조한다.

SELECT e.name, d.avg_salary
FROM employees e
JOIN (SELECT department_id, AVG(salary) AS avg_salary
      FROM employees
      GROUP BY department_id) d
ON e.department_id = d.department_id;

 

WHERE 절에서의 서브쿼리: WHERE 절에서 특정 조건을 지정하는 데 사용된다.

SELECT name
FROM employees
WHERE department_id IN (SELECT department_id
                        FROM departments
                        WHERE location_id = 1700);

 

HAVING 절에서의 서브쿼리: GROUP BY로 그룹화된 결과에 조건을 적용할 때 사용된다.

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary)
                      FROM employees
                      WHERE department_id = 10);

 

스칼라 서브쿼리 (Scalar Subquery) 

 

  • 스칼라 서브쿼리는 정확히 하나의 값(하나의 행과 하나의 열)을 반환하는 서브쿼리이다. 마치 JOIN을 사용한 것과 같은 결과를 나타낸다.
  • 일반적으로 SELECT, WHERE, HAVING 절에서 사용될 수 있으며, 단일 값을 필요로 하는 모든 컨텍스트에서 사용될 수 있다.
SELECT name,
       (SELECT AVG(salary)
        FROM employees
        WHERE department_id = e.department_id) AS avg_dept_salary
FROM employees e;