SQL programming 
쿼리 : 서브쿼리 (Subquery)

서브 쿼리란 쿼리안에 또 다른 쿼리가 있는 경우를 말한다. 즉, 외형적으로는 한 SELECT문 안에 다른 SELECT이 있는 경우이다. 내부에 있는 서브쿼리 즉 SELECT문은 WHERE절이나 SELECT 컬럼리스트 혹은 FROM절에도 넣을 수 있다.





WHERE절 서브쿼리

WHERE 절은 조건식으로 특정 레코드를 필터링할 때 사용하는데, 특정 조건이 다른 테이블의 값들을 참조하는 경우가 있다. 예를 들어 상품 프로모션 카테고리에 있는 제품 리스트를 뽑을 때 만약 프로모션이 의류와 신발인 경우 다음과 같이 SELECT문을 만들 수 있다. SELECT * FROM Products WHERE Category IN ('Clothing','Shoes') 그런데 프로모션 카테고리를 매주 변경한다면, Clothing과 Shoes를 하드 코딩할 수 없게 된다. 이런 경우는 프로모션 카테코리를 관리하는 테이블을 만들고, 테이블 데이타를 갱신함으로써 프로모션 변경을 반영할 수 있다. 이렇게 가변적은 조건 필터링을 구현할 때, IN 뒤에 서브쿼리를 지정할 수 있다. 아래 예제는 Promotion 테이블로부터 Active컬럼이 1인 레코드들의 category 컬럼 데이타를 가져오는 서브쿼리를 보여주고 있다.





계산 필드 서브쿼리

서브 쿼리는 또한 SELECT문의 컬럼 리스트안의 계산 필드처럼 사용될 수 있다. 즉, SELECT문에서 컬럼명 대신 서브쿼리로 어떤 값을 생성, 리턴하는 경우이다. 예를 들어, 고객들의 고객당 주문수를 출력할 필요가 있을 경우, 아래와 같이 서브쿼리를 써서 COUNT를 계산할 수 있다.


  • 서브쿼리 SELECT COUNT(*)는 특정 조건의 레코드 수를 카운트 한다
  • 서브쿼리안의 WHERE절은 고객아이디를 맞추기 위한 것으로 o는 Orders 테이블의 Alias이고, c는 Customer 테이블의 Alias이다. 테이블 Alias는 테이블 뒤에 첨부할 수 있다.
  • 서브쿼리 뒤의 COUNT는 서브쿼리 전체가 리턴하는 값에 대한 컬럼 Alias이다.



FROM절 서브쿼리

SELECT의 FROM절에도 서브쿼리를 쓸 수 있는데, 이 서브쿼리 결과는 FROM절의 새 임시 테이블처럼 사용된다. 예를 들어, 다음 서브쿼리는 필터링한 Promotion 테이블에서 category와 type 컬럼만을 갖는 임시 테이블을 정의하고 있다. 이렇게 정의된 임시 테이블로부터 SELECT 리스트에서 보이듯이 임시테이블의 컬럼을 출력할 수도 있다.





본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.