SQL - 서브쿼리

안녕하세요, SQL 열정가 여러분! SQL 서브쿼리의 흥미로운 세계로 안내해드리게 되어 매우 기쁩니다. 컴퓨터 과학을 오랫동안 가르쳐온 사람으로서, 서브쿼리는 SQL 실력을 좋은 수준에서 위에 올려드는 비밀의 소스와 같다고 말씀드릴 수 있습니다. 그럼 서브쿼리의 미스터리를 함께 풀어보겠습니다!

SQL - Sub Queries

SQL 서브쿼리

서브쿼리란 무엇인가요?

상상해보세요, 샌드위치를 만들 때. 도우는 주쿼리이고, 샌드위치를 정말 맛있게 만드는 것은 안에 들어있는 가득한 재료들 - 그게 서브쿼리입니다! SQL 용어로는, 서브쿼리는 다른 쿼리 내에 포함된 쿼리입니다. 질문 속에서 또 다른 질문을 하는 것처럼, 단일 쿼리로는 불가능한 복잡한 연산을 수행할 수 있게 해줍니다.

간단한 예를 보겠습니다:

SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');

이 쿼리에서, 괄호 안에 있는 부분이 서브쿼리입니다. 이 서브쿼리는 'Marketing' 부서의 department_id를 찾아내고, 이를 주쿼리가 사용하여 해당 부서의 모든 직원을 찾습니다.

따라야 할 규칙

더 깊이 다하기 전에, 서브쿼리를 사용할 때 따라야 할 중요한 규칙 몇 가지를 살펴보겠습니다:

  1. 서브쿼리는 괄호로 둘러싸여야 합니다.
  2. 서브쿼리의 SELECT 절은 일반적으로 하나의 컬럼만 반환합니다. 주쿼리에서 비교를 위한 여러 컬럼이 있는 경우는 예외입니다.
  3. 서브쿼리에서 ORDER BY 명령을 사용할 수 없습니다. 하지만 주쿼리에서는 ORDER BY를 사용할 수 있습니다.
  4. 여러 행을 반환하는 서브쿼리는 여러 값 연산자(예: IN 연산자)와 함께 사용되어야 합니다.

다음 표는 이 규칙들을 요약합니다:

규칙 설명
괄호 서브쿼리는 괄호로 둘러싸여야 합니다
단일 컬럼 서브쿼리 SELECT는 일반적으로 하나의 컬럼만 반환합니다
ORDER BY 없음 ORDER BY는 서브쿼리에서 사용할 수 없습니다
여러 행 여러 행을 반환하는 서브쿼리는 여러 값 연산자와 함께 사용되어야 합니다

SELECT 문과 서브쿼리

서브쿼리는 SELECT 문과 함께 가장 자주 사용됩니다. 그들은 동적으로 조건을 기반으로 데이터를 검색하는 데 매우 강력할 수 있습니다. 더 복잡한 예를 보겠습니다:

SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

이 쿼리는 모든 제품 중 평균 가격보다 비싼 제품을 선택합니다. 서브쿼리는 평균 가격을 계산하고, 주쿼리는 이 결과를 사용하여 제품을 필터링합니다.

다른 예제는 SELECT 절에서 서브쿼리를 사용합니다:

SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;

이 쿼리는 각 직원의 이름과 급여뿐만 아니라 모든 직원의 평균 급여를 각 행에 포함시킵니다. 각 직원에 대한 미니 보고서를 가지는 것과 같습니다!

INSERT 문과 서브쿼리

서브쿼리는 INSERT 문과 함께 사용하여 테이블에 다른 테이블의 데이터를 채울 수 있습니다. 예를 들어:

INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

이 쿼리는 평균 급여의 1.5배 이상을 받는 모든 직원을 high_salary_employees 테이블에 추가합니다. 이는 회사의 VIP 수입자 명단을 만드는 것과 같습니다!

UPDATE 문과 서브쿼리

서브쿼리는 UPDATE 문을 더 강력하게 만들 수 있습니다. 예를 보겠습니다:

UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');

이 쿼리는 'Electronics' 카테고리의 모든 제품의 가격을 10% 인상합니다. 서브쿼리는 'Electronics' 카테고리의 category_id를 찾아내고, 주쿼리는 이를 사용하여 올바른 제품을 업데이트합니다.

DELETE 문과 서브쿼리

마지막으로, DELETE 문과 서브쿼리를 사용하는 예를 보겠습니다:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);

이 쿼리는 최근 1년 동안 주문을 하지 않은 모든 고객의 주문을 삭제합니다. 서브쿼리는 이러한 고객을 찾아내고, 주쿼리는 그들의 주문을 삭제합니다.

그럼 여러분! SQL 서브쿼리의 세계를 함께 여행했습니다. 연습이 완벽을 이루는 열쇠이므로, 자신의 데이터베이스에서 이 쿼리들을 실험해보지 마세요.

항상 학생들에게 말씀드리지만, SQL은 스위스 아르바이트와 같고 - 서브쿼리는 그 비밀의 칼날처럼 어려운 상황에서 도와줍니다. 그러니 계속 탐구하고, 쿼리를 작성하고, 가장 중요한 것은 계속 배우세요!

Credits: Image by storyset