Jong_seoung 2023. 11. 14. 22:34
반응형

부속질의

하나의 SQL문 안에 다른 SQL문이 중첩된 질의

다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공할때 사용

데이터가 대량일 경우 조인보다 성능이 더 좋음

주질의와 부속질의로 구성됨

주질의는 외부질의라고도 하며 부속질의는 내부질의라고 함

 

스칼라 부속질의 - select 부속질의

SELECT절에서 사용되며 단일 값을 반환하기 때문에 스칼라 부속질의라고 한다.

 

인라인 뷰 - FROM 부속질의

FROM절에서 결과를 뷰 형태로 반환하기 때문에 인라인 뷰라고 한다.

 

중첩 질의 - WHERE 부속질의

WHERE절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용된다.

상관 혹은 비 상관 형태이다.

 

스칼라 부속질의

SELECT 절에서 사용되는 부속질의

부속질의의 결과 값을 단일 행, 단일 열의 스칼라 값으로 반환한다.

SELECT문과 UPDATE SET절에 사용된다.

주질의와 부속질의와의 관계는 상관/비상관 모두 가능하다.

 

 

문제1

고객별 판매액을 보이시오. 단, 결과는 고객이름과 고객별 판매액을 출력한다.

select (select cname from cust where cust.cid=orders.cid) as name,
sum(select price from book where book.bid=orders.bid) as price 
from orders group by cid;

 

문제2

orders 테이블에 각 주문에 맞는 도서이름을 입력하시오.

update table orders 
set title = (select title from book where book.bid=orders.bid);

더보기

oreders 테이블에 title 속성 추가하기

alter table orders add title varchar(20);

 

문제3

안양사는 고객이 주문한 정보를 출력하시오. 단, 결과는 고객이름, 주문번호, 주문일을 출력한다.

select (select cname from cust where cust.cid=orders.cid), oid, odate 
from orders 
where cid in (select cid from cust where addr = 'anyang');

더보기

헷갈릴수도 있는 부분

 

 

인라인 뷰

FROM 절에서 사용되는 부속질의

테이블 이름 대신 인라인 뷰 부속질의를 사용하면 보통의 테이블과 같은 형태로 사용가능

가상의 테이블인 뷰 형태로 제공되기 때문에 상관 부속질의로 사용될 수는 없음

 

 

문제1

고객번호가 2이하인 고객의 판매액을 보이시오. 단, 결과는 고객이름과 고객별 판매액을 출력한다.

select cname, sum(price) 
from (select cid,cname from cust where cid<=2) cs, orders, (select price from book where book.bid=orders.bid) b 
where cs.cid=orders.cid and b.bid=orders.bid  
group by cid;

 

문제2

주문한 고객의 이름과 주문일, 책이름을 보이되, 주문하지 않은 고객의 이름과 주문하지 않은 책 이름도 함께 보여라.

select cname, odate, title
from (select cname from cust left outer join orders on cust.cid=orders.cid) cs
left outer join book on book.bid=orders.bid
union
select cname, odate, title 
from (select cname from cust left outer join orders on cust.cid=orders.cid) cs 
left outer join book on book.bid=orders.bid

 

 

중첩질의

WHERE절에서 사용되는 부속질의

술어 부속질의라고도 함

술어 연산자 반환 행 반환 열 상관
비교 =, , , =, =, <> 단일 단일 가능
집합 IN, NOT IN 다중 단일 가능
한정(quantified) ALL, SOME(ANY) 다중 단일 가능
존재 EXISTS, NOT EXISTS 다중 다중 필수

 

 

문제1

평균 주문금액 이하의 주문에 대해서 주문번호와 금액

select oid,price
from orders.book
where orders.bid=book.bid and
price <= (select avg(price) from orders,book 
where orders.bid=book.bid);

 

문제2

각 고객별 평균 주문금액보다 큰 금액의 주문 내역에 대해서 주문번호, 고객번호, 금액을 보이시오. (상관 부속질의)

select oid,cid, price 
from (select oid,cid,price from orders natural join book) t1 
where t1.price > (select avg(price) 
from (select oid,cid,price from orders natural join book) t2 
where t1.cid=t2.cid)

 

문제3

1번 고객이 주문한 도서의 최고 금액보다 더 비싼 도서를 구입한 주문의 주문번호와 금액을 보이시오.

select oid, price 
from orders od,book b
where od.bid=b.bid and
price > all(select price from orders od, book b where od.bid=b.bid and cid=1);

반응형