SQL

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

황기하 2022. 11. 25.

http://www.sqlprogram.com/Basics/sql-subquery.aspx

 

쿼리: 서브쿼리 - SQL 프로그래밍 배우기 (Learn SQL Programming)

쿼리 : 서브쿼리 (Subquery) 서브 쿼리란 쿼리안에 또 다른 쿼리가 있는 경우를 말한다. 즉, 외형적으로는 한 SELECT문 안에 다른 SELECT이 있는 경우이다. 내부에 있는 서브쿼리 즉 SELECT문은 WHERE절이나

www.sqlprogram.com

서브 쿼리란 쿼리안에 또 다른 쿼리가 있는 경우를 말한다.
즉, 외형적으로는 한 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 * FROM Products 
WHERE Category IN (SELECT category FROM Promotion WHERE Active=1)

 

 

계산필드 서브쿼리

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

 

SELECT name, (SELECT COUNT(*) FROM Orders o WHERE o.CustId=c.Id) COUNT
FROM Customer c

 

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

 

FROM절 서브쿼리

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

 

SELECT p.*,c.* 
FROM Products p, (SELECT category,type FROM Promotion WHERE Active=1) c
WHERE p.Category=c.category

'SQL' 카테고리의 다른 글

SQL> SQL 함수의 사용  (0) 2022.11.25
SQL> DECALRE : 로컬 변수 선언  (0) 2022.11.25
SQL> 테이블 조인 (JOIN)  (0) 2022.11.25

댓글