SQL 서브쿼리와 인라인뷰
[toc]
서브쿼리
서브쿼리의 종류
1. 스칼라 서브쿼리
- SELECT절에 사용되는 서브쿼리
- 실행횟수가 많다는 단점이 존재, 생각보다 활용도가 떨어질 것 같음
2. 인라인뷰
- FROM절에 사용되는 서브쿼리
- 기본적으로 한 번만 실행
3. 서브쿼리
- WHERE절에 사용되는 서브쿼리
- 기본적으로 한 번만 실행, join 및 인라인뷰로 풀어서 사용 가능
스칼라 서브쿼리
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도 같이 출력함
SEQ | ORDERID | ORDERDATE | SHIPDATE | CUSTOMERID | PRODUCTID | productname |
---|
10001 | CA-2015 | 2015-04-30 | 2015-05-02 | SD-20485 | FUR-BO-10 | Bookcase |
10002 | CA-2015 | 2015-06-17 | 2015-06-19 | SD-20485 | OFF-PA-90 | Paper Set |
10003 | CA-2015 | 2015-07-10 | 2015-07-12 | SD-20485 | TEC-PH-08 | Phone |
인라인뷰
서브쿼리
1
2
3
4
| SELECT ORDERID , CUSTOMERID , PRODUCTID
FROM class.c_order co
WHERE QUANTITY = 1
;
|
✅ WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.
ORDERID | CUSTOMERID | PRODUCTID |
---|
CA-2015-1234 | SD-20485 | OFF-PA-90 |
CA-2015-1278 | AB-10123 | TEC-PH-08 |
CA-2015-1402 | SD-20485 | FUR-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문입니다.
ORDERID | CUSTOMERID | PRODUCTID |
---|
CA-2015-1234 | SD-20485 | OFF-PA-90 |
CA-2015-1402 | SD-20485 | FUR-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문입니다.
서브쿼리
1
2
| SELECT *
FROM class.c_order co
|
✅ 스칼라 서브쿼리(SELECT절 내부에서 실행되는 쿼리)를 포함하고 있습니다.
SEQ | ORDERID | ORDERDATE | SHIPDATE | CUSTOMERID | PRODUCTID | QUANTITY | STATE |
---|
3836 | CA-2015 | 2015-04-30 | 2015-05-02 | SD-20485 | FUR-BO-10 | 1 | Texas |
3837 | CA-2015 | 2015-06-17 | 2015-06-19 | AB-10123 | OFF-PA-90 | 3 | Nevada |
3838 | CA-2015 | 2015-07-10 | 2015-07-12 | SD-20485 | TEC-PH-08 | 1 | Texas |
1
2
3
4
| SELECT *
FROM class.c_product cp
WHERE PRODUCTID = (SELECT PRODUCTID from class.c_order co WHERE SEQ = "3836")
;
|
✅ WHERE절 서브쿼리 또는 조건 필터링을 포함한 SELECT문입니다.
PRODUCTID | PRODUCTNAME | CATEGORY | PRICE |
---|
FUR-BO-10 | Bookcase | Furniture | 180 |
서브쿼리
- c_orderd에서 SEQ = “3836”인 PRODUCTID를 출력
1
2
3
| SELECT PRODUCTID
FROM class.c_order co
WHERE SEQ = "3836";
|
메인쿼리
- 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"
);
|
PRODUCTID | PRODUCTNAME | CATEGORY | PRICE |
---|
FUR-BO-10 | Bookcase | Furniture | 180 |
Summary
- 서브쿼리는 사용되는 위치에 따라 명칭이 다름
- 스칼라 쿼리(SELECT)
- 인라인뷰(FROM)
- 서브쿼리(WHERE)
- 인라인뷰는 일반 테이블과 논리적으로 같음