[Day 18]公費0420—内容整理


🌞結合(join)

  • リレーショナル・データベースで検索するカラムが2つ以上のテーブルにある場合は、結合を使用します.
  • 結合を行う場合、条件式は2つのテーブルで共通のコラムを使用して表されます.
  • 例)「朴智星」顧客が注文したすべての図書名、図書の価格、購入価格、注文日の出力
    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;
    例)注文総数、合計金額は、「メディア」で終わる出版社図書を購入した顧客名で印刷してください.しかし、総注文金額が10,000ウォン以上の製品だけが輸出される.また、受注総額が高い順に出力し、同じ場合は名称で出力する
    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を印刷するか分からない!
    =>>この2つのテーブルに1つのテーブル名を任意に指定します.(c.custid)
    select c.custid, name, address 
    from customer c, orders o
    where orderdate = '2022/04/03' and
    c.custid = o.custid;
    =>結合の場合、selectセクションで2つのテーブルのすべてのカラムを表す場合は、テーブル名を指定する必要があります.

    🌞部署表、従業員表


    🌈部門テーブル

    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;