서브쿼리란 무엇인가?

서브쿼리(Subquery)는 하나의 SQL 쿼리 안에 중첩된 또 다른 쿼리를 의미합니다.
이 서브쿼리는 주 쿼리(Main Query)의 입력값을 제공하거나 필터링 조건으로 사용됩니다.

서브쿼리는 SELECT, FROM, WHERE 절에서 사용되며, 각각 다음과 같이 나눌 수 있습니다:

  • 스칼라 서브쿼리 (SELECT 절에서 사용)
  • 인라인 뷰 (FROM 절에서 사용)
  • 일반 중첩 서브쿼리 (WHERE 절에서 사용)

1. 스칼라 서브쿼리

SELECT 절에서 사용되는 서브쿼리로, 하나의 값을 반환합니다.
스칼라 서브쿼리는 주로 계산된 컬럼이나 특정 기준에 따른 추가 정보를 포함하는 데 사용됩니다.

예제

문제: 각 직원의 이름과 최고 연봉을 구하세요.

SELECT 
    emp_name, 
    (SELECT MAX(salary) FROM employees) AS max_salary
FROM 
    employees;

특징

  • 반환값: 단일 값(스칼라 값).
  • 사용 시기:
    • 주 쿼리에서 동적으로 계산된 값을 추가하고 싶을 때.
    • 비교적 단순한 계산이나 값을 얻고자 할 때.

2. 인라인 뷰

FROM 절에서 사용되는 서브쿼리로, 하나의 테이블처럼 작동합니다.
이 방식은 서브쿼리를 통해 임시 테이블을 생성하여 주 쿼리가 이를 참조할 수 있게 합니다.

예제

문제: 각 부서의 평균 연봉이 50,000 이상인 부서의 직원 정보를 구하세요.

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

특징

  • 반환값: 임시 테이블(다수의 행과 열).
  • 사용 시기:
    • 주 쿼리에서 사용할 데이터를 미리 가공하거나 집계해야 할 때.
    • 복잡한 데이터를 테이블 형태로 변환해야 할 때.

3. 일반 중첩 서브쿼리

WHERE 절에서 사용되는 서브쿼리로, 특정 조건을 만족하는 데이터를 필터링합니다.
이는 주로 주 쿼리의 조건문에서 동적으로 값을 제공할 때 사용됩니다.

예제

문제: 평균 연봉보다 높은 연봉을 받는 직원 정보를 구하세요.

SELECT 
    emp_name, 
    salary
FROM 
    employees
WHERE 
    salary > (SELECT AVG(salary) FROM employees);

특징

  • 반환값: 단일 값, 단일 컬럼, 혹은 다수의 값.
  • 사용 시기:
    • 필터링 조건을 동적으로 설정해야 할 때.
    • 특정 기준에 따라 데이터를 제한하고 싶을 때.

세 방식의 차이점 비교

구분스칼라 서브쿼리인라인 뷰일반 중첩 서브쿼리
사용 위치SELECT 절FROM 절WHERE 절
반환값단일 값테이블 형태단일 값, 단일 컬럼, 다수 값
주요 목적동적으로 계산된 값 추가임시 테이블로 가공된 데이터 사용필터링 조건 설정
사용 시기컬럼 계산 및 정보 추가복잡한 데이터 집계나 가공조건에 따라 데이터 제한

SQL의 다중행 연산자와 단일행 연산자

SQL에서는 서브쿼리와 함께 다중행 연산자와 단일행 연산자를 사용하여 데이터를 비교하거나 필터링할 수 있습니다.

1. 단일행 연산자

단일행 연산자는 서브쿼리가 단일 값(스칼라 값)을 반환할 때 사용됩니다.
주로 비교 연산자와 함께 사용되며, 하나의 값과 다른 하나의 값을 비교합니다.

사용 가능한 연산자

  • =, >, <, >=, <=, <> (같다, 크다, 작다 등 단순 비교)

예제

문제: 직원 중 평균 연봉보다 높은 연봉을 받는 직원을 구하세요.

SELECT 
    emp_name, 
    salary
FROM 
    employees
WHERE 
    salary > (SELECT AVG(salary) FROM employees);

설명:
  • (SELECT AVG(salary) FROM employees): 단일 값을 반환(평균 연봉).
  • salary >: 단일 값과 비교하는 단일행 연산자.

2. 다중행 연산자

다중행 연산자는 서브쿼리가 여러 개의 행을 반환할 때 사용됩니다.
이는 반환된 다수의 값과 주어진 조건을 비교할 때 활용됩니다.

사용 가능한 연산자

  • IN: 리스트 내의 값과 일치하는 경우.
  • ANY 또는 SOME: 반환된 값 중 하나 이상과 조건을 만족하는 경우.
  • ALL: 반환된 모든 값과 조건을 만족하는 경우.


다중행 연산자 예제

1) IN 연산자

문제: '서울' 지점에서 근무하는 직원들을 구하세요.

SELECT 
    emp_name, 
    branch
FROM 
    employees
WHERE 
    branch IN (SELECT branch FROM branches WHERE city = '서울');

설명:
  • (SELECT branch FROM branches WHERE city = '서울'): 서울에 있는 지점들을 반환(다수의 값).
  • branch IN: 반환된 값 중 하나와 일치하는 경우 필터링.

2) ANY 연산자

문제: 회사의 최고 연봉 중 하나보다 높은 연봉을 받는 직원들을 구하세요.

SELECT 
    emp_name, 
    salary
FROM 
    employees
WHERE 
    salary > ANY (SELECT MAX(salary) FROM employees GROUP BY department_id);

설명:
  • (SELECT MAX(salary) FROM employees GROUP BY department_id): 각 부서의 최고 연봉 리스트를 반환.
  • salary > ANY: 리스트 중 하나라도 만족하면 필터링.

3) ALL 연산자

문제: 모든 부서의 최고 연봉보다 높은 연봉을 받는 직원을 구하세요.

SELECT 
    emp_name, 
    salary
FROM 
    employees
WHERE 
    salary > ALL (SELECT MAX(salary) FROM employees GROUP BY department_id);

설명:
  • (SELECT MAX(salary) FROM employees GROUP BY department_id): 각 부서의 최고 연봉 리스트를 반환.
  • salary > ALL: 반환된 리스트의 모든 값보다 커야 필터링.

다중행 연산자와 단일행 연산자 비교

구분단일행 연산자다중행 연산자
서브쿼리 결과단일 값(스칼라 값)여러 값(리스트)
사용 연산자=, >, <, >=, <=, <>IN, ANY, ALL
적용 대상하나의 값과 비교여러 값과 조건을 비교
사용 시기값 하나를 반환하는 서브쿼리와 함께 사용다수의 값을 반환하는 서브쿼리와 함께 사용

결론

서브쿼리는 적절히 사용하면 SQL의 가독성과 성능을 향상시킬 수 있습니다.

  • 스칼라 서브쿼리: 단순 계산이나 동적 데이터 추가 시.
  • 인라인 뷰: 복잡한 데이터 집계나 필터링이 필요한 경우.
  • 일반 중첩 서브쿼리: 조건문에 동적 데이터를 활용해야 할 때.
  • 단일행 연산자는 단일 값을 다룰 때 사용되고, 다중행 연산자는 여러 값과 비교할 때 유용합니다.

효율적인 SQL 작성을 위해 각 방식의 용도를 명확히 이해하고 활용하세요! 😊

profile
다 먹어버릴거야!

0개의 댓글