Post

07. SQL 서브쿼리와 인라인뷰

07. SQL 서브쿼리와 인라인뷰

SQL 서브쿼리와 인라인뷰

[toc]

서브쿼리

서브쿼리의 종류

  • 서브쿼리는 사용되는 위치에 따라 명칭이 다름

1. 스칼라 서브쿼리

  • SELECT절에 사용되는 서브쿼리
  • 실행횟수가 많다는 단점이 존재, 생각보다 활용도가 떨어질 것 같음

2. 인라인뷰

  • FROM절에 사용되는 서브쿼리
  • 기본적으로 한 번만 실행

3. 서브쿼리

  • WHERE절에 사용되는 서브쿼리
  • 기본적으로 한 번만 실행, join 및 인라인뷰로 풀어서 사용 가능

스칼라 서브쿼리

  • SELECT절에 사용되는 쿼리
1
2
3
4
5
6
7
SELECT SEQ, ORDERID, ORDERDATE, SHIPDATE, CUSTOMERID, PRODUCTID,
(SELECT productname
 from class.c_product
 WHERE productid = co.PRODUCTID) as productname
FROM class.c_order co 
WHERE CUSTOMERID = "SD-20485"
;

WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.

서브쿼리

  • c_product에서 productid = co.PRODUCTID인 productname 컬럼을 출력함(별칭은 productname)

메인쿼리

  • c_order에서 CUSTOMERID = “SD-20485”인 SEQ, ORDERID, ORDERDATE, SHIPDATE, CUSTOMERID, PRODUCTID 컬럼을 출력하는데 서브쿼리의 조건을 담은 productname도 같이 출력함
SEQORDERIDORDERDATESHIPDATECUSTOMERIDPRODUCTIDproductname
10001CA-20152015-04-302015-05-02SD-20485FUR-BO-10Bookcase
10002CA-20152015-06-172015-06-19SD-20485OFF-PA-90Paper Set
10003CA-20152015-07-102015-07-12SD-20485TEC-PH-08Phone

인라인뷰

  • FROM절에 사용되는 쿼리

서브쿼리

1
2
3
4
SELECT ORDERID , CUSTOMERID , PRODUCTID 
FROM class.c_order co 
WHERE QUANTITY = 1
;

WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.

ORDERIDCUSTOMERIDPRODUCTID
CA-2015-1234SD-20485OFF-PA-90
CA-2015-1278AB-10123TEC-PH-08
CA-2015-1402SD-20485FUR-BO-10
  • c_order 테이블에서 ORDERID , CUSTOMERID , PRODUCTID 컬럼을 출력할 건데 QUANTITY = 1인 조건을 검(데이터 생략)

메인쿼리

1
2
3
4
5
6
SELECT *
FROM (SELECT ORDERID , CUSTOMERID , PRODUCTID 
FROM class.c_order co 
WHERE QUANTITY = 1) as s1
WHERE customerid = 'SD-20485'
;

WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.

ORDERIDCUSTOMERIDPRODUCTID
CA-2015-1234SD-20485OFF-PA-90
CA-2015-1402SD-20485FUR-BO-10
  • 위의 조건으로 출력된 데이터 중 customerid = ‘SD-20485’인 데이터만 다시 출력(별칭은 s1)
  • 조건을 하나 더 거는 것과 비슷함
  • 그러나 메인쿼리에서 서브쿼리 조건에 없는 컬럼을 출력하는 것은 불가능
1
2
3
4
5
6
SELECT STATE -- 에러발생
FROM (SELECT ORDERID , CUSTOMERID , PRODUCTID 
FROM class.c_order co 
WHERE QUANTITY = 1) as s1
WHERE customerid = 'SD-20485'
;

WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.


서브쿼리

  • WHERE절에 사용되는 쿼리
1
2
SELECT *
FROM class.c_order co

스칼라 서브쿼리(SELECT절 내부에서 실행되는 쿼리)를 포함하고 있습니다.

SEQORDERIDORDERDATESHIPDATECUSTOMERIDPRODUCTIDQUANTITYSTATE
3836CA-20152015-04-302015-05-02SD-20485FUR-BO-101Texas
3837CA-20152015-06-172015-06-19AB-10123OFF-PA-903Nevada
3838CA-20152015-07-102015-07-12SD-20485TEC-PH-081Texas
1
2
3
4
SELECT *
FROM class.c_product cp
WHERE PRODUCTID = (SELECT PRODUCTID from class.c_order co WHERE SEQ = "3836")
;

WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.

PRODUCTIDPRODUCTNAMECATEGORYPRICE
FUR-BO-10BookcaseFurniture180

서브쿼리

  • c_orderd에서 SEQ = “3836”인 PRODUCTID를 출력
1
2
3
SELECT PRODUCTID 
FROM class.c_order co 
WHERE SEQ = "3836";
PRODUCTID
FUR-BO-10

메인쿼리

  • c_product에서 PRODUCTID가 서브쿼리를 만족하는 PRODUCTID인 모든 컬럼을 출력
1
2
3
4
5
6
7
SELECT *
FROM class.c_product cp
WHERE PRODUCTID = (
  SELECT PRODUCTID 
  FROM class.c_order co 
  WHERE SEQ = "3836"
);
PRODUCTIDPRODUCTNAMECATEGORYPRICE
FUR-BO-10BookcaseFurniture180

Summary

  • 서브쿼리는 사용되는 위치에 따라 명칭이 다름
    1. 스칼라 쿼리(SELECT)
    2. 인라인뷰(FROM)
    3. 서브쿼리(WHERE)
  • 인라인뷰는 일반 테이블과 논리적으로 같음
    • where문에 조건을 쿼리로 표현한 것