[Day 18] 국비 0420 - 내용 정리

11212 단어 국비dbdb

🌞조인(join)

  • 관계형 데이터베이스에서 검색하고자 하는 컬럼이 두 개 이상의 테이블에 있을 때 조인을 사용한다.
  • 조인을 할 때에는 두 개의 테이블에 공통으로 들어가는 칼럼으로 조건식을 표현한다.

예시) '박지성' 고객이 주문한 모든 도서명과, 도서의 가격, 구매가격, 주문일을 출력

select bookname, price, saleprice, orderdate
from book, customer, orders
where name = '박지성' and 
customer.custid = orders.custid and // customer 테이블에 있는 custid와 orders 테이블에 있는 custid와 동일해야함.
orders.bookid = book.bookid;

예시) 축구 관련 도서중에 가격이 8000원 이상인 도서를 구매한 고객의 이름, 도서명, 출판사명, 구매일을 출력하세요. 단, 최근의 구매일 순으로 출력하고 동일할 때에는 고객이름 순으로 출력

select name, bookname, publicsher, orderdate
from customer, book, orders
where bookname like '%축구%' and price >= 8000 and
customer.custid = orders.custid and
orders.bookid = book.bookid
order by orderdate desc, name;
select name, bookname, publicsher, orderdate
from customer c, book b, orders o				 //짧게 사용하기 위하여 알파벳을 지정해준다.
where bookname like '%축구%' and price >= 8000 and
c.custid = o.custid and
o.bookid = b.bookid
order by orderdate desc, name;

예시) 출판사명이 '미디어'로 끝나는 출판사의 도서를 구매한 고객 이름별로 총 주문건수, 총 주문금액을 출력하세요. 단, 총 주문금액이 10000원 이상인 것만 출력. 또, 총 주문금액이 높은순으로 출력하고 동일할 때에는 이름순으로 출력

select name, count(*), sum(saleprice) 
from book b, orders o, customer c
where publicsher like '%미디어' and
b.bookid = o.bookid and
c.custid = o.custid
group by name having sum(saleprice) >= 10000
order by sum(saleprice) desc, name;

예시) 2022년 4월 3일에 구매한 고객번호와 이름과 주소를 출력

select custid, name, address 
from customer c, orders o
where orderdate = '2022/04/03' and
c.custid = o.custid;

<결과>

SQL> select custid, name, address
  2  from customer c, orders o
  3  where orderdate = '2022/04/03' and
  4  c.custid = o.custid;
	select custid, name, address   <==== name, address는 customer 테이블에만 있다. 
	       *
	1행에 오류:
	ORA-00918: 열의 정의가 애매합니다 

그런데, custid는 customer 테이블에도 있고, orders 테이블에도 있기 때문에
어디에 있는 custid를 출력해야할지 모르겠다!
==> 둘 중에 아무거나 테이블이름을 명시해준다. (c.custid)

select c.custid, name, address 
from customer c, orders o
where orderdate = '2022/04/03' and
c.custid = o.custid;

=> 조인을 할 때 양쪽 테이블에 모두 있는 컬럼을 select절에 표현할 때에는 테이블 이름을 명시해야 한다.


🌞부서테이블, 사원테이블

🌈부서 테이블

create table dept(
	dno number primary key,
	dname varchar2(20),
	dloc varchar2(20)
);

🌈사원 테이블

create table emp (
	eno number primary key,
	ename varchar2(20),
	dno number references dept(dno),
	salary number,
	comm number,
	hiredate date,
	phone varchar2(20),
	addr varchar2(50),
	mgr number, //관리자
	job varchar2(30)
);

예시) 판교에 근무하는 직원의 이름, 부서번호, 부서명, 급여, 수당, 실수령액을 출력하세요. 단, 실수령액이 높은순으로 출력하고 동일할 때에는 이름순으로 출력

select ename, d.dno, dname, salary, comm, (salary + comm) as 실수령액
from emp e, dept d
where dloc = '판교' and
e.dno = d.dno
order by 실수령액 desc, ename;

예시) 개발팀에 근무하는 사원들의 급여를 10% 인상하려고 한다. 해당 직원들의 사원번호, 부서번호, 부서명, 부서위치, 급여, 증가된 급여분, 10% 인상된 급여를 출력, 사원번호 순으로 출력하세요.

select eno, d.dno, dname, dloc, salary, (salary * 0.1) as 인상액, (salary * 1.1) as 인상액급여
from emp e, dept d
where dname like '개발%' and
e.dno = d.dno
order by ename;

예시) 모든 직원의 '최대급여'와 '최소급여'의 차이를 출력하세요.

select (max(salary) - min(salary)) as 차이 from emp;

좋은 웹페이지 즐겨찾기