http://www.sqlprogram.com/Basics/sql-subquery.aspx
서브 쿼리란 쿼리안에 또 다른 쿼리가 있는 경우를 말한다.
즉, 외형적으로는 한 SELECT문 안에 다른 SELECT이 있는 경우이다.
내부에 있는 서브쿼리 즉 SELECT문은
WHERE절이나 SELECT 컬럼리스트 혹은 FROM절에도 넣을 수 있다.
WHERE절 서브쿼리
특정 조건이 다른 테이블의 값들을 참조하는 경우가 있다.
만약 프로모션이 의류와 신발인 경우 다음과 같이 SELECT문을 만들 수 있다.
WHERE Category IN ('Clothing','Shoes')
Clothing과 Shoes를 하드 코딩할 수 없게 된다.
테이블 데이타를 갱신함으로써 프로모션 변경을 반영할 수 있다.
IN 뒤에 서브쿼리를 지정할 수 있다.
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 |
댓글