티스토리 뷰

SQL(Structured Query Language)에서 서브쿼리는 다른 쿼리 내부에 중첩된 쿼리로, 주로 조건이나 결과를 도출하는 데 사용됩니다. 이번 글에서는 SQL 서브쿼리의 개념과 종류, 활용 방법 등을 자세히 살펴보겠습니다.

서브쿼리란?

서브쿼리는 다른 SQL 문장 내부에 중첩된 SELECT 문장을 의미합니다. 주로 WHERE 절, FROM 절, HAVING 절에 사용되며, 이를 통해 복잡한 조건을 표현하거나 보다 정교한 데이터 추출을 가능하게 합니다.


종류

단일 행 서브쿼리 (Single-row Subquery)

서브쿼리의 결과가 하나의 행을 반환하는 경우 사용됩니다. 이런 서브쿼리는 주로 비교 연산자와 함께 사용됩니다.

SELECT employee_name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

 

다중 행 서브쿼리 (Multiple-row Subquery)

서브쿼리의 결과가 여러 행을 반환하는 경우 사용됩니다. 이런 서브쿼리는 IN, ANY, ALL과 같은 연산자와 함께 사용됩니다.

SELECT customer_id
FROM orders
WHERE order_date IN (SELECT MAX(order_date) FROM orders GROUP BY customer_id);

 

스칼라 서브쿼리 (Scalar Subquery)

서브쿼리의 결과가 단일 값을 반환하는 경우 사용됩니다. 이런 서브쿼리는 주로 SELECT 절이나 WHERE 절에 사용됩니다.

SELECT employee_name, (SELECT department_name FROM departments WHERE department_id = employees.department_id) AS department_name
FROM employees;

 


서브 쿼리 연산자

1. IN 연산자

IN 연산자는 서브쿼리의 결과가 여러 값을 반환할 때 사용됩니다. 외부 쿼리의 조건과 서브쿼리의 결과 중 하나라도 일치하면 조건을 만족합니다.

SELECT column_name
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);​

2. NOT IN 연산자

NOT IN 연산자는 IN 연산자와 반대로 작동합니다. 즉, 외부 쿼리의 조건과 서브쿼리의 결과 중 일치하지 않는 값들을 반환합니다.

SELECT column_name
FROM table_name
WHERE column_name NOT IN (SELECT column_name FROM another_table WHERE condition);​

3. EXISTS 연산자

EXISTS 연산자는 서브쿼리의 결과가 존재하는지 여부를 확인합니다. 서브쿼리가 결과를 반환하면 외부 쿼리의 조건을 만족시킵니다.

SELECT column_name
FROM table_name
WHERE EXISTS (SELECT column_name FROM another_table WHERE condition);​

4. NOT EXISTS 연산자

NOT EXISTS 연산자는 EXISTS 연산자와 반대로 작동합니다. 즉, 서브쿼리가 결과를 반환하지 않을 때 외부 쿼리의 조건을 만족시킵니다.

 

SELECT column_name
FROM table_name
WHERE NOT EXISTS (SELECT column_name FROM another_table WHERE condition);​

5. ANY 연산자

ANY 연산자는 서브쿼리의 결과 중 하나라도 외부 쿼리의 조건과 일치하면 조건을 만족시킵니다. 보통 비교 연산자와 함께 사용됩니다.

SELECT column_name
FROM table_name
WHERE column_name > ANY (SELECT column_name FROM another_table WHERE condition);​

6. ALL 연산자

ALL 연산자는 서브쿼리의 모든 결과가 외부 쿼리의 조건과 일치해야 조건을 만족시킵니다. 보통 비교 연산자와 함께 사용됩니다.

SELECT column_name
FROM table_name
WHERE column_name > ALL (SELECT column_name FROM another_table WHERE condition);​

 

 

+) 추가적인 연산자

7. 비교 연산자와 함께 사용되는 서브쿼리

서브쿼리는 비교 연산자와 함께 사용되어 특정 조건을 만족시키는 데이터를 추출하는 데 유용합니다.

 

 특정 조건을 만족하는 직원의 정보를 추출

SELECT employee_name, department_id
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'IT');​

 

8. 다중 열 서브쿼리

서브쿼리에서는 하나 이상의 열을 반환할 수 있습니다. 이를 통해 복잡한 조건을 설정하거나 다양한 비교를 수행할 수 있습니다.

 

1) 여러 열을 비교하는 경우: 서브쿼리의 결과를 튜플로 반환하여 여러 열을 비교할 수 있습니다.

부서별 평균 연봉과 실제 직원의 연봉을 비교

SELECT employee_name, salary
FROM employees
WHERE (department_id, salary) IN (SELECT department_id, AVG(salary) FROM employees GROUP BY department_id);

 

 

2) 여러 열을 기반으로 한 조건 설정: 여러 열에 대한 조합을 사용하여 특정 조건을 설정할 수 있습니다.

 

부서별로 가장 높은 연봉을 받는 직원의 정보를 추출

SELECT employee_name, salary
FROM employees e
WHERE (department_id, salary) = (SELECT department_id, MAX(salary) FROM employees WHERE department_id = e.department_id GROUP BY department_id);

 

3) 복잡한 비교 논리: 서브쿼리의 결과를 사용하여 복잡한 논리적 연산을 수행할 수 있습니다.

SELECT employee_name, department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id
WHERE (e.department_id, e.salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);

 

9. 서브쿼리의 결과를 사용하는 UPDATE 문

 

서브쿼리의 결과를 사용하여 UPDATE 문을 실행할 수 있습니다. 이를 통해 특정 조건을 만족하는 행을 업데이트할 수 있습니다.

 특정 부서의 직원들의 연봉을 일괄적으로 인상

UPDATE employees
SET salary = salary * 1.1
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'HR');​

활용 방법

서브쿼리는 복잡한 데이터 추출이나 조건 설정에 매우 유용하게 사용될 수 있습니다. 주로 다음과 같은 상황에서 활용됩니다

  • 데이터 필터링: 특정 조건을 만족하는 데이터만 추출할 때 서브쿼리를 사용합니다.
  • 조건 비교: 서브쿼리를 통해 다른 테이블의 값과 비교하여 조건을 설정할 수 있습니다.
  • 결과 계산: 서브쿼리를 활용하여 데이터의 평균, 합계 등을 계산하고 이를 기반으로 다른 작업을 수행할 수 있습니다.

활용 예시

데이터 필터링 사용 사례: 고객 중에서 주문한 상품이 있는 고객들의 목록을 추출합니다.

SELECT customer_id, customer_name
FROM customers
WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);​

조건 비교 사용 사례: 각 부서의 평균 급여보다 높은 급여를 받는 직원의 정보를 추출합니다.

SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees GROUP BY department_id);​

결과 계산 사용 사례: 각 부서의 직원 수와 함께 가장 많은 직원이 속한 부서의 정보를 추출합니다.

SELECT department_id, department_name, employee_count
FROM departments
WHERE employee_count = (SELECT MAX(employee_count) FROM (SELECT department_id, COUNT(*) as employee_count FROM employees GROUP BY department_id) AS temp);​

주의사항

  • 성능 문제: 서브쿼리는 성능에 영향을 줄 수 있으므로 필요한 경우 최적화를 고려해야 합니다.
  • 가독성: 서브쿼리가 복잡해지면 가독성이 저하될 수 있으므로, 적절한 경우에만 사용하는 것이 좋습니다.
  • 결과 예측: 서브쿼리를 사용할 때 결과를 정확히 예측할 수 있어야 합니다. 때로는 예상치 못한 결과가 발생할 수 있으므로 주의가 필요합니다.

 


결론

SQL 서브쿼리

  • 복잡한 데이터 추출이나 조건 설정에 매우 유용한 도구
  • 올바르게 사용하면 가독성이 향상되고 데이터를 더 정교하게 처리 가능
  • 성능 문제나 가독성 저하를 고려하여 적절한 상황에서 사용해야 함

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함