10장(서브쿼리 사용하기)
SQL을 이용하여 서브쿼리도 만들 수 있다.(서브쿼리는 쿼리 안에 있는 쿼리이다.
서브쿼리로 필터링 하기
RGAN01 이라는 제품을 구매한 고객 리스트를 원한다고 가정해보자. 이 정보를 가져오려면 다음 순서대로 해야한다.
RGAN01을 주문한 주문 번호를 가져온다.
이전 단계에서 가져온 주문 번호로 고객ID를 가져온다.
이전 단계에서 가져온 고객ID로 고객 상세 정보를 가져온다.
원하는 제품을 주문한 번호를 알았으니 다음 단계는 주문 번호와 관련 있는 고객 ID를 가져오는 것이다. IN절을 사용하자.
이번에는 주문 번호를 가져오는 첫 번째 쿼리를 서브쿼리로 만들어 두 개의 쿼리를 합쳐보자
서브쿼리는 항상 안에 있는 쿼리를 먼저 처리하고, 그 다음 바깥쪽에 있는 쿼리를 처리한다.
이제 RGAN01을 주문한 모든 고객 ID를 알고 있다. 다음 단계는 고객 ID로 각 고객의 정보를 가져오는 것이다.
가장 안쪽에 있는 서브쿼리에서는 주문 번호를 가져오고, 가져온 주문 번호는 그 바깥쪽에 있는 서비쿼리의 WHERE절에 사용된다. 두 번쨰 서브쿼리는 고객 ID를 가져오고, 이 고객 ID는 가장 바깥쪽에 있는 쿼리의 WHERE절에 사용된다. 가장 바깥쪽의 쿼리가 실제 원하는 데이터를 가져온다.
계산 필드로 서브쿼리 사용하기
주문 수량을 Customer 테이블에 있는 고객별로 보고 싶다고 가정해보자.
- Customer테이블에서 고객 리스트를 가져온다.
- Orders 테이블에서 각각의 고객이 주문한 수를 센다.
이 select문은 Customer 테이블에서 고객 이름, 주소, 주문수량을 가져온다. orders는 괄호로 묶인 서브쿼리에 의해 구해진 계산 필드이다.
이 예제에서는 서브쿼리가 다섯 번 수행 된다, 그 이유는 다섯명의 고객이 반환 되었기 때문이다. 서브쿼리에 있는 WHERE절은 이전에 사용된 WHERE절과는 조금 다르다. 이전에는 컬럼명만 적었는데 이 문장에서는 Orders.cust_id나 Customers.cust_id와 같이 테이블과 컬럼 이름을 모두 명시하는 완전한 컬럼명을 사용하였다.
WHERE Orders.cust_id = Customers.cust_id
이 WHERE절은 Orders 테이블에 있는 cust_id와 Customers 테이블에서 가져온 정보가 일치하는지 비교하도록 한다.
컬럼명이 모호할 가능성이 있을 때마다 테이블명과 컬럼명을 마침표로 구분하여 적는 문법을 사용한다.
원래 행이 5개니까 5개가 반환 되었고
이러면 다 5개의 orders 라는 잘못된 값이 반환 될 수밖에 없다.