MariaDB 서브쿼리

찌끅·2024년 10월 14일

MariaDB 서브쿼리

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

단일 행 서브쿼리는 하나의 행만 반홚나느 서브쿼리이다. 예를 들어, 특정 상품의 최저 가격을 찾는 서브쿼리를 사용할 수 있다.

SELECT product_name, price
FROM products
WHERE price = (SELECT MIN(price) FROm products);
  • products 테이블에서 최저 가격을 가진 상품을 찾는다
  • 서브쿼리 (SELECT MIN(price) FROM products)products 테이블에서 최저 가겨을 반환한다.

2. 다중 행 서브쿼리 (Multi-row Subquery)

다중 행 서브쿼리는 여러 행을 반환할수 있으며, IN, ANY, ALL과 같은 키워드와 함께 사용된다.

예제 1: 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를 반환한다.

예제 2: 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 (...) 구문은 "가격이 반환된 가격들 중 하나보다 크면"을 의미한다.

예제 3: 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 (...) 구문은 "가격이 반환된 모든 가격보다 크면"을 의미한다. 즉, 모든 책의 가격보다 큰 가격을 가진 상품만 선택된다.

3. 상관 서브쿼리 (Correlated Subquery)

상관 서브쿼리는 메인 쿼리의 각 행에 대해 서브쿼리를 수행하며, 메인 쿼리의 값을 참조하는 방식이다.

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를 참조하여 해당 부서의 평균 급여를 계산한다.

4. 집계 함수와 함께 사용하는 서브쿼리

서브쿼리는 집계 함수와 함께 사용하여 특정 조건에 맞는 집계 결과를 조회할 수 있다.

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 절을 사용하여 각 부서의 직원 수가 서브쿼리에서 계산된 평균보다 큰 경우만 선택한다.

5. 서브쿼리로 행 삽입하기 (INSERT INTO)

서브쿼리를 사용하여 한 테이블의 데이터를 다른 테이블에 삽입할 수 있다.

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')는 조건에 맞는 주문 데이터를 반환한다.

6. 서브쿼리로 행 업데이트하기 (UPDATE)

서브쿼리를 사용하여 다른 테이블의 데이터를 기반으로 특정 테이블의 데이터를 업데이트할 수 있다.

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를 반환한다.

7. 서브쿼리로 행 삭제하기 (DELETE)

서브쿼리를 사용하여 다른 테이블의 데이터를 기반으로 특정 행을 삭제할 수 있다.

DELETE FROM orders
WHERE customer_id NOT IN (SELECT customer_id FROM customers);
  • customers 테이블에 존재하지 않는 고객의 주문을 orders 테이블에서 삭제한다.
  • 서브쿼리 (SELECT customer_id FROM customers)는 현재 존재하는 모든 고객 ID를 반환한다.

0개의 댓글