본문 바로가기
Database/SQL

[SQL] SQL 고급문법 - 부속질의

by 과외선생J 2020. 11. 23.
반응형

안녕하세요 과외선생J 입니다. 

 

이번에는 부속질의에 대해 공부해보도록 하겠습니다. 

 

부속질의란 하나의 SQL 문 안에 또다른 SQL 문이 삽입되는 것을 말합니다. 

이미 앞에서 조인과 부속질의를 다뤘기 때문에 여기서는 조금 더 자세한 내용을 다룬다고 보시면 됩니다. 

 

한 테이블에 SQL 문을 작성하여 질의하는데 다른 테이블의 내용이 필요할 경우 조인이나 부속질의를 통해 다른 테이블에서 데이터를 가져오는 SQL문을 쓰게 됩니다.  조인과 부속질의를 최대한 간단히 정리하면 다음과 같습니다.

 

조인 : 테이블+테이블 -> 필요 데이터 추출

부속질의 : 1테이블 정보를 가지고 2테이블에서 확인 

 

크게 3가지 부속질의가 있으며 위치와 역할에 따라 SELECT 부속질의, FROM 부속질의, WHERE 부속질의로 구분됩니다. 

좀 더 있어보이게 말하고싶으면  SELECT 부속질의는 스칼라부속질의, FROM 부속질의는 인라인 뷰, WHERE 부속질의는 중첩질의 라고 부르면 됩니다. 

 

1. 중첩질의-where 부속질의

주 질의에서 필요한 조건을 다른 테이블에서 가져오는 질의문이라고 보시면 됩니다. 

 

1) 비교연산자

=, >,<,>=,<=,<>을 이용하는 방법으로 다음 두 예제를 보겠습니다.

 

예제1

SELECT orderid, saleprice 

from orders

where saleprice <= ( select avg(saleprice) from orders);

-> orders 테이블에서 saleprice가 평균판매금액보다 같거나 작은 행을 찾아서 orderid와 saleprice를 출력합니다. 

where 절에서 saleprice랑 ( select avg(saleprice) from orders)랑 비교해서 조건에 맞는 행을 출력한다고 보시면 됩니다.

 

예제2

select orderid, custid, slaeprice

from orders md

where saleprice > (select avg(saleprice) from orders so where md.custid=so.custid);

-> 예제1과 비슷한 내용에 custid가 동일하다는 조건을 하나 더 붙여서 만들어진 예제입니다. 

 

정리 : where 비교1 비교연산자 비교2 순서로 쓰며 비교2에는 ()를 이용하여 타 테이블의 내용을 가져오면 됩니다. 

 

 

2) IN, NOT IN 

IN : 주 질의 속성값이 부속질의 제공값에 속하는지 체크하는 역할. 하나라도 속한게 있으면 참

NOT IN은 반대 역할

 

예제

SELECT SUM(saleprice) "total" 

from orders

where custid in (select custid from customer where address like '%대한민국%');

-> orders 테이블에서 saleprice의 합을 구하는 문

-> orders테이블의 custid가 customer에서 대한민국을 주소로 가진 custid 에 있으면 출력. 없으면 미출력

 

 

3) ALL, SOME(ANY)

비교연산자와 함께 사용, 비교하고자하는 부속질의의 모든값보다 크거나 작다라고 비교할 때는 ALL, 어느 것 하나라도 크거나 작다라고 비교할 때는 SOME이나 ANY를 씁니다.

 

예제 

SELECT orderid, saleprice 

from orders 

where saleprice > all (select saleprice from orders where custid='3');

-> custid가 3인 주문의 saleprice랑 비교하여 모두 클 경우 (최고금액보다 클 경우) 출력, 하나라도 아닐 경우 미출력

 

 

4) EXISTS, NOT EXISTS

-> 존재 여부 확인

-> 주질의가 제공한 속성 값으로 부속질의의 조건 만족하는 값 존재 시 참, 해당 행의 데이터 출력

 

예제 

select sum(saleprice) "total"

from orders od

where exists (select * from customer cs where address like  '%대한민국%' and cs.custid = od.custid);

-> customer 테이블과 order테이블의 custid가 동일하면서 대한민국 주소를 가진 고객들이 order 테이블에 있으면 해당 고객 들의 saleprice의 총합을 출력

 

 

 

2. 스칼라 부속질의 - SELECT 부속질의

-> 스칼라 : 단일값

-> select 문과 update set 절에 사용

-> 단일행, 단일열의 스칼라 값으로만 반환

 

예제 

select (select name from customer cs where cs.custid=od.custid) "name", sum(saleprice) "total"

from orders od

group by od.custid;

-> 고객 별 판매액 산출

 

 

 

 

 

3. 인라인 뷰 - FROM 부속질의

-> 뷰 : 가상테이블, 일시적 생성. 

-> 인라인 뷰 부속 질의 사용 시 해당 뷰에서 주 질의문에 해당하는 행을 출력

 

예제 

select cs.name, sum(od.saleprice) " total " 

from ( select custid, name form customer where custid<=2) cs, orders od

where cs.custid=od.custid

group by cs.name;

-> 고객이름과 saleprice의 충합을 출력하는데 custid가 2 이하인 테이블을 customer테이블로부터 가상으로 만들어서 그 가상 테이블에서 주질의 값을 찾아서 출력. 

 

 

후우.. 적고보면 별 내용이 없어보이는데 적을 때는 왜이렇게 힘들까요 ㅎㅎ 

 

오늘도 공부하신다고 고생하셨습니다 ^^ 

 

반응형

'Database > SQL' 카테고리의 다른 글

[SQL] SQL 고급문법 - index  (0) 2020.11.24
[SQL] SQL 고급문법 - 뷰  (0) 2020.11.23
[SQL] SQL 고급문법 - 내장함수  (0) 2020.11.23
[SQL] sqlplus 데이터정의어 (DDL)  (3) 2020.11.18
[SQL] SQLPlus 명령어 DML - 3탄  (1) 2020.11.17

댓글