서브쿼리는 SELECT, UPDATE, DELETE 문장 안에서 사용되는 SELECT문장입니다. 서브쿼리는 보조적인 SELECT문으로, 전체적인 쿼리문의 일부분으로 사용됩니다. 서브쿼리를 사용하면, 보다 복잡한 조건절을 만들 수 있고, 그 결과로 더 정확한 결과를 도출할 수 있습니다.
1. 서브쿼리의 종류
서브쿼리는 크게 단일행 서브쿼리와 다중행 서브쿼리로 나뉩니다.
- 단일행 서브쿼리: 결과값이 한 행 이하인 서브쿼리
- 다중행 서브쿼리: 결과값이 여러 행인 서브쿼리
2. 예시
1) SELECT문에서 서브쿼리 사용하기
다음은 customers 테이블에서 가장 많은 주문을 한 고객을 검색하는 예시입니다.
SELECT first_name, last_name, email
FROM customers
WHERE customer_id = (
SELECT customer_id
FROM orders
GROUP BY customer_id
ORDER BY COUNT(*) DESC
LIMIT 1
);
이 쿼리는 서브쿼리 (SELECT customer_id FROM orders GROUP BY customer_id ORDER BY COUNT(*) DESC LIMIT 1)를 사용하여 orders 테이블에서 가장 많은 주문을 한 고객의 ID를 검색합니다. 그리고 외부 쿼리에서 해당 고객의 정보를 가져옵니다.
2) INSERT문에서 서브쿼리 사용하기
다음은 orders 테이블에 새로운 주문을 추가하는 예시입니다. 이때, 새로운 주문의 customer_id는 customers 테이블에서 가장 최근에 가입한 고객의 ID로 설정됩니다.
INSERT INTO orders (customer_id, order_date, total_amount)
VALUES (
(SELECT customer_id
FROM customers
ORDER BY registration_date DESC
LIMIT 1),
NOW(),
100.00
);
이 쿼리는 서브쿼리 (SELECT customer_id FROM customers ORDER BY registration_date DESC LIMIT 1)를 사용하여 customers 테이블에서 가장 최근에 가입한 고객의 ID를 검색합니다. 그리고 INSERT 문에서 해당 ID와 새로운 주문의 날짜와 금액을 함께 추가합니다.
3) UPDATE 문에서 서브쿼리를 사용하기
예를 들어, "orders" 테이블에서 가장 최근에 주문된 날짜를 찾고 그 날짜 이후 주문한 모든 고객의 "is_late" 컬럼 값을 업데이트하는 경우 다음과 같이 쿼리를 작성할 수 있습니다:
UPDATE orders
SET is_late = 1
WHERE order_date > (
SELECT MAX(order_date)
FROM orders
)
이 쿼리에서, 서브쿼리는 "orders" 테이블에서 가장 최근 주문 날짜를 찾습니다. 그리고 이 날짜 이후에 주문한 모든 주문의 "is_late" 컬럼 값을 1로 업데이트합니다.
'DB' 카테고리의 다른 글
[MySQL] UNION 연산자 사용법 (0) | 2023.03.13 |
---|---|
[MySQL] 뷰 (view) 생성, 수정, 삭제, 조회 하는 방법 (0) | 2023.03.13 |
[MySQL] 날짜 형식 변환 방법 (0) | 2023.03.11 |
[MySQL] 몫과 나머지 구하기 (0) | 2023.03.11 |
[MySQL] 그룹별 최대값, 최소값 구하는 방법 (0) | 2023.03.10 |
댓글