손에 잡히는 10분 SQL 11장 참고
SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01'
-- [1]
SELECT cust_id
FROM Orders
WHERE order_num IN (20007,20008);
이렇게 결과를 보고직접 넣어도 되지만 서브쿼리를 이용하면 이렇게 하지 않아도 된다
--[2]
SELECT cust_id
FROM Orders
WHERE order_num IN (SELECT order_num
FROM OrderItems
WHERE prod_id = 'RGAN01');
[1]과 [2]의 결과는 같다.
서브쿼리는 항상 안에 있는 쿼리를 먼저 처리하고 그 다음 바깥쪽에 있는 쿼리를 처리한다.
두 개의 값은 콤마로 구분되어 전달된다.
이렇게 서브쿼리를 사용하면 유연하고 강력한 SQL문을 작성할 수 있다. 제한은 없지만 너무 많은 서브쿼리를 사용하면 그만큼 많은 쿼리문을 수행하는 것과 다름 없기 때문에 성능에 유의하여야 한다.
서브쿼리로 계산필드 만들기
서브쿼리로 계산필드를 생성해 사용할 수도 있다.
주문수량을 Customer의 고객별로 보고싶다고 하자. Orders 테이블에는 주문정보와 고객ID가 있다.
SELECT cust_name, cust_state,
(SELECT COUNT(*)
FROM Orders
WHERE Orders.cust_id = Customers.cust_id ) AS orders
FROM Customers
ORDER BY cust_name;
위의 쿼리에서 서브쿼리는 특정 cust_id의 전체 row수를 COUNT(*)로 세고 있다. 그 때의 cust_id를 기준으로 바깥쿼리에서 customer 정보를 가져오고 있다.
이처럼 두 개의 테이블에서 이름이 같은 열을 접근할 때에는 모호할 수 있기 때문에 .(마침표)로 구분하여 테이블을 명시하는 문법을 사용하는 것이 좋다.
'Database > SQL' 카테고리의 다른 글
[코테를 위한 Oracle 정리] 9. 테이블 JOIN (0) | 2024.08.04 |
---|---|
[코테를 위한 Oracle 정리] 7. 그룹핑 : GROUP BY, HAVING (0) | 2024.08.03 |
[코테를 위한 Oracle 정리] 6. 그룹 함수를 사용해 데이터 요약하기 (0) | 2024.08.03 |
[코테를 위한 Oracle 정리] 5. 데이터 조작 : 내장 함수 (0) | 2024.08.01 |
[코테를 위한 Oracle 정리] 4. 열 계산 및 연결하기 (0) | 2024.07.31 |