본문 바로가기
Database/SQL

[SQL] SQLPlus 명령어 DML - 3탄

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

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

 

이번 포스팅은 DML 명령어 3탄입니다!! 

 

드디어 마지막입니다. 이번까지만 하면 DML 은 다 끝납니다!!(아마도 그렇겠죠..?)

 

바로 시작하겠습니다. 

 

* 본 포스팅은 중부기술교육원 수업과 한빛미디어 데이터베이스 개론과 실습 책을 기본바탕으로 공부한 뒤 작성되었음을 알립니다. 

 

* 교재의 예제 위주로 이해를 돕기 위해 각 문법에 대한 해설을 달았습니다. 

* SQLdeveloper를 사용하도 되나 SQLPlus로 수업을 하였기에 예제결과는 cmd창으로 보여드립니다. 

 

1. SELECT 문

7) 조인

두개 이상의 테이블을 연결하여 질의 하는 방법으로는 조인과 부속질의가 있습니다. 그 중 조인부터 보겠습니다. 

조인은 내부조인과 외부조인이 있으며 다음과 같은 문법을 씁니다.

 

<내부조인>

select [속성] from [테이블1, 테이블2, ...] where [조인조건] and [검색조건]

 

select [속성] from [테이블1] inner join [테이블2] on [조인조건] where [검색조건]

 

<외부조인>

select 속성 from 테이블1 [left | right | full [outer] join 테이블2 on [조인조건] where [검색조건]

 

참고 하시기 편하시게 조인조건은 파란색으로 표시를 하도록 하겠습니다. 

 

select * from customer, orders where customer.custid=orders.custid;

-> 고객테이블과 주문테이블에 있는 모든 행을 검색, 출력

-> 조건은 고객테이블과 주문테이블에 있는 custid가 동일한 행만 검색한다.

 

 

select * from customer, orders where customer.custid=orders.custid order by customer.custid;

-> customer테이블과 orders 테이블에서 custid가 동일한 모든 행을 검색, custid를 기준으로 정렬하여 출력

 

select name, saleprice from customer, orders where customer.custid=orders.custid;

-> 이름과 판매가격을 customer테이블과 order 테이블에서 가져올 때 custid가 같은 행만 검색 및 출력

 

 

 

select name, sum(saleprice) from customer, orders where customer.custid=orders.custid group by customer.name order by customer.name;

-> 이름과 saleprice의 합을 출력하는데 custid가 동일한 행을 이름으로 묶어서 이름 순으로 검색 및 출력

 

 

select customer.name, book.bookname from customer, orders, book

where customer.custid=orders.custid and orders.bookid=book.bookid;

-> 3개의 테이블에서 고객이름, 책이름을 가져오는데 custid와 bookid가 동일한 행만 검색 및 출력

 

 

select customer.name, book.bookname from customer, orders, book

where customer.custid=orders.custid and orders.bookid=book.bookid and book.price=20000;

-> 위쪽 질의문에 가격조건만 추가한 경우, 위에 나온 행 중에서 책값이 20000원인 행만 검색, 출력

 

 

select customer.name, saleprice from customer left outer join orders on customer.custid=orders.custid;

-> 왼쪽(left) 테이블에 질의하는 외부조인 문법

-> customer와 orders에서 custid가 같은 행을 왼쪽 테이블(customer) 기준으로 검색 및 출력

 

 

 

8) 부속질의

select bookname from book where price=(select max(price) from book);

-> 가장 비싼 책의 가격 + 가장 비싼 책의 이름 검색 및 출력

-> book테이블로 가장 비싼 책의 가격을 조건으로 book테이블에서 bookname을 검색 및 출력

( 실습 중 테이블 수정을 했기에 출력 결과값이 다를 수 있습니다. 정확한 결과값은 교재를 참고해주세요)

 

 

 

select name from customer where custid in (select custid from orders);

-> order 테이블에 있는 custid를 통해 customer 테이블에서 이름을 찾아서 출력

 

 

select name from customer where custid in(select custid from orders where bookid in(select bookid from book where publisher='대한미디어'));

-> 대한미디어 출판사의 bookid를 book테이블에서 찾은 다음 bookid로 orders테이블에서 custid를 찾아서 해당 custid를 가진 고객의 이름을 검색, 출력

-> 대한미디어 bookid + 대한미디어 책 구매고객의 custid + 대한미디어 책을 구매한 고객의 이름

 

select b1.bookname from book b1 where b1.price>(select avg(b2.price) from book b2 where b2.publisher=b1.publisher);

-> 출판사 별 평균도서가격보다 비싼 도서 구하기

-> book테이블을 b1, b2라고 별칭을 정해줘서 상위 부속질의와 하위부속질의에 사용되는 book테이블을 구별한다.

-> 평균보다 높은 책이름을 찾는 것이 상위부속질의, 평균 가격을 구하는 것이 하위부속질의이다.

 

 

 

select name from customer where custid in (select custid from orders);

-> orders테이블에 있는 custid를 customer테이블과 매칭시켜서 도서를 구매한 고객의 이름 검색 및 출력

 

select name from customer minus select name from customer where custid in (select custid from orders);

-> minus를 통해 모든고객 - 구매고객 = 미구매고객 을 찾는다. 

 

select name, address from customer cs where exists (select * from orders od where cs.custid=od.custid);

-> 주문 내역이 있는 고객들의 이름과 주소를 검색

-> customer cs 에서 cs는 customer를 cs로 별칭을 지어준것. customer as cs 와 동일. as가 생략된 것.

 

 

     

휴... 드디어 DML 정리가 끝났습니다. 

이것 하나로 절.대. 공부가 끝나지 않습니다. 많은 예제와 문제를 풀이해보시면서 각 명령어들을 완벽히 익히시길 바라겠습니다. 

 

다들 고생하셨어요~ 

반응형

댓글