단일 행 서브쿼리는 하나의 행만 반홚나느 서브쿼리이다. 예를 들어, 특정 상품의 최저 가격을 찾는 서브쿼리를 사용할 수 있다.
SELECT product_name, price
FROM products
WHERE price = (SELECT MIN(price) FROm products);
products 테이블에서 최저 가격을 가진 상품을 찾는다(SELECT MIN(price) FROM products)는 products 테이블에서 최저 가겨을 반환한다.다중 행 서브쿼리는 여러 행을 반환할수 있으며, IN, ANY, ALL과 같은 키워드와 함께 사용된다.
IN을 사용하는 서브쿼리SELECT order_id, customer_id
FROM orders
WHERE customer_id IN (SELECT customer_id FROM customers WHERE city = 'Seoul');
orders 테이블에서 city가 'Seoul'인 고객의 customer_id에 해당하는 주문만 조회한다.(SELECT customer_id FROM customers WHERE city = 'Seoul')는 city가 'Seoul'인 모든 고객의 ID를 반환한다.ANY를 사용하는 서브쿼리SELECT product_name, price
FROM products
WHERE price > ANY (SELECT price FROM products WHERE category = 'Electronics');
products 테이블에서 category가 'Electronics'인 상품의 가격보다 높은 상품을 찾는다.(SELECT price FROM products WHERE category = 'Electronics')는 전자 제품의 모든 가격을 반환한다.price > ANY (...) 구문은 "가격이 반환된 가격들 중 하나보다 크면"을 의미한다.ALL을 사용하는 서브쿼리SELECT product_name, price
FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'Books');
products 테이블에서 category가 'Books'인 모든 상품의 가격보다 높은 상품을 찾는다.(SELECT price FROM products WHERE category = 'Books')는 책의 모든 가격을 반환한다.price > ALL (...) 구문은 "가격이 반환된 모든 가격보다 크면"을 의미한다. 즉, 모든 책의 가격보다 큰 가격을 가진 상품만 선택된다.상관 서브쿼리는 메인 쿼리의 각 행에 대해 서브쿼리를 수행하며, 메인 쿼리의 값을 참조하는 방식이다.
SELECT e.employee_id, e.name, e.salary
FROM employees e
WHERE e.salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
employees 테이블에서 동일한 부서(department_id) 내에서 평균 급여보다 높은 직원만 조회한다.(SELECT AVG(salary) FROM employees WHERE department_id = e.departMent_id_)는 메인 쿼리의 각 department_id를 참조하여 해당 부서의 평균 급여를 계산한다.서브쿼리는 집계 함수와 함께 사용하여 특정 조건에 맞는 집계 결과를 조회할 수 있다.
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) > (SELECT AVG(employee_count) FROM (SELECT COUNT(*) AS employee_count FROM employees GROUP BY department_id) AS dept_count);
(SELECT COUNT(*) AS employee_count FROM employees GROUP BY department_id) 이 부분은 각 부서의 직원 수를 계산한다.dept_count라는 서브쿼리로 감싸고 이 결과의 평균을 계산한다.HAVING 절을 사용하여 각 부서의 직원 수가 서브쿼리에서 계산된 평균보다 큰 경우만 선택한다.서브쿼리를 사용하여 한 테이블의 데이터를 다른 테이블에 삽입할 수 있다.
INSERT INTO archived_orders (order_id, customer_id, order_date)
SELECT order_id, customer_id, order_date
FROM orders
WHERE order_date < '2024-01-01';
orders 테이블에서 2024년 1월 1일 이전에 이루어진 주문을 archived_orders 테이블에 삽입한다.(SELECT order_id, customer_id, order_date FROM orders WHERE order_date < '2024-01-01')는 조건에 맞는 주문 데이터를 반환한다.서브쿼리를 사용하여 다른 테이블의 데이터를 기반으로 특정 테이블의 데이터를 업데이트할 수 있다.
UPDATE products
SET price = price * 0.9
WHERE product_id IN (SELECT product_id FROM promotions WHERE discount = '10%');
promotions 테이블에서 10% 할인이 적용된 상품에 대해 products 테이블에서 가격을 10% 할인한다.(SELECT product_id FROM promotions WHERE discount = '10%')는 할인된 상품의 ID를 반환한다.서브쿼리를 사용하여 다른 테이블의 데이터를 기반으로 특정 행을 삭제할 수 있다.
DELETE FROM orders
WHERE customer_id NOT IN (SELECT customer_id FROM customers);
customers 테이블에 존재하지 않는 고객의 주문을 orders 테이블에서 삭제한다.(SELECT customer_id FROM customers)는 현재 존재하는 모든 고객 ID를 반환한다.