국비학원/공부

11일차 oracle(4)

mikan- 2023. 5. 4. 23:40

Q 79.
inner join=>한개이상의 테이블=>2개가지고 조인연습

SQL>select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS(보너스)                          TABLE
DEPT                           TABLE
EMP                            TABLE
SALGRADE                       TABLE
ZIPCODE                        TABLE

*** 공식 ********************************************************************************************
1.각 테이블의 pk확인->없을 수도 있지만
2.업무에 따른 서로 조인하고자하는 테이블의 연관성있는 필드를 확인(pk,fk)

******************************************************************************************************


emp       dept       bonus

empno   deptno       X

======================================
 테이블의 조인수-1=>where 조건식 갯수 =>3-1=2개(where조건식)
                                                       4-1=3(where조건식)
-----------------------------------------------------
emp          dept
                  deptno(pk) =>where e.deptno=d.deptno
deptno(fk)
----------------------------------------------------
dept     bonus
         X     
deptno   ename
dname   job
loc         sal
            comm
-----------------------------------------------------
emp    bonus b

ename  ename =>where e.ename=b.ename  =>대표
job       job       =>where e.job=b.job
sal       sal
comm  comm
 =>이론적으로 4개가 다 가능하다.
--------------------------------------------------

**emp테이블에서 사번,이름,업무,입사일,급여,보너스를 출력
dept->부서명,위치 순서대로 출력
emp->업무가 SALESMAN인 사원의 정보출력
(단 bonus테이블과 연결해서 3개의 테이블을 이용=->조인)

형식) select 세개의 테이블의 필드나열
       from 테이블명1,테이블명2,테이블명3
       where 조건식 and 조건식2 //,,and  조건식3  and 조건식4

sql>select e.empno,e.ename,e.job,e.hiredate,e.sal,e.comm,
                d.dname,d.loc
      from emp e,dept d,bonus b
      where e.deptno=d.deptno and e.ename=b.ename;

     EMPNO ENAME      JOB       HIREDATE        SAL       COMM DNAME
---------- ---------- --------- -------- ---------- ---------- --------------
LOC
-------------
      7369 SMITH      CLERK     80/12/17        800            RESEARCH
DALLAS

      7521 WARD       SALESMAN  81/02/22       1250        500 SALES
CHICAGO

      7499 ALLEN      SALESMAN  81/02/20       1600        300 SALES
CHICAGO


Q 80.
조인하고자하는 테이블의 일치하는 필드(=연관이 있는 필드)=>검색
inner join=>일치 O =>일치X =>조건식의 다른 연산자를 고려해서 작성
                                              = (X) -> 문제에 따라서 연산자 결정

SQL>desc salgrade =>각 직원의 급여등급,최소급여,최대급여(정보)

SQL> desc salgrade
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 GRADE                                              NUMBER
 LOSAL                                              NUMBER
 HISAL                                              NUMBER


SQL> select * from salgrade;
     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999 -> king

emp,salgrade=>직접 연관된 필드가 없다.(이름이 동일한 필드)
emp e,salgrade s=>사번,이름,업무,급여,등급,최소,최대급여순으로 출력

범위연산자를 이용=>between A and B ,>=,<=
10 부서별로 급여가 많이 받는 사원순으로 정렬하라.

SQL>
  1  select e.empno, e.ename, e.job, e.sal, s.grade, s.losal, s.hisal
  2  from emp e, salgrade s
  3  where e.sal between s.losal and s.hisal and e.deptno =&deptno
  4* order by s.grade desc
SQL> /
deptno의 값을 입력하십시오: 10
구   3: where e.sal between s.losal and s.hisal and e.deptno =&deptno
신   3: where e.sal between s.losal and s.hisal and e.deptno =10

     EMPNO ENAME      JOB              SAL      GRADE      LOSAL      HISAL
---------- ---------- --------- ---------- ---------- ---------- ----------
      7839 KING       PRESIDENT       5000          5       3001       9999
      7782 CLARK      MANAGER         2450          4       2001       3000
      7934 MILLER     CLERK           1300          2       1201       1400

********************************************************************************
inner join(일치하는 필드만 검색)=equi join(동등조인)=> =연산자
                                      Non-equi join(일치하는 필드가 없는경우)
                                       업무에 따른 다른 조건식의 연산자 필요
*******************************************************************************


Q 81.
emp,dept테이블을 조인하되, dept테이블의 40번부서까지 다 출력이 될수
있도록 조인?(outer join 사용)

outer join->두 테이블의 검색=>두테이블의 레코드양이 차이가 많이
                                               날때 사용

                    left outer join(대,소) ,right outer join(소,대)
************************************************************************************
 오라클에서만 사용하는 조인->inner,outer join
 전세계 표준 DB언어(SQL중에서도 join)=>Ansi Join(오라클 제외 다른DB)
************************************************************************************

SQL>select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON=>근무하는 직원X

SQL>select e.ename,e.job,d.deptno,d.dname
       from emp e,dept d
       where d.deptno=e.deptno(+); //일치하는 행이 없는 쪽테이블에 (+)을 부여=>outer join
,,,,
ADAMS      CLERK             20 RESEARCH

ENAME      JOB           DEPTNO DNAME
---------- --------- ---------- --------------
JAMES      CLERK             30 SALES
FORD       ANALYST           20 RESEARCH
MILLER     CLERK             10 ACCOUNTING
******************************************************************************
                                     40 OPERATIONS
******************************************************************************
15 개의 행이 선택되었습니다.

 left outer join <->right outer join은 구분하지 않고 사용
******************************************************************************
 outer join의 주의할점=>(+)은 한쪽에서만 사용이 가능
  일치하지 않은쪽 테이블에 빈행추가(+)
******************************************************************************


Q 82.
위의 문3에서 outer join한 문제에서 사원의 이름이 A자 들어간
사원의 정보(사번,이름,업무,부번,부서명순으로 출력?)(outer join)

SQL> select e.empno, e.ename, e.job, d.deptno, d.dname from emp e, dept d where d.deptno = e.deptno(+) and e.ename like '%A%';

     EMPNO ENAME      JOB           DEPTNO DNAME
---------- ---------- --------- ---------- --------------
      7499 ALLEN      SALESMAN          30 SALES
      7521 WARD       SALESMAN          30 SALES
      7654 MARTIN     SALESMAN          30 SALES
      7698 BLAKE      MANAGER           30 SALES
      7782 CLARK      MANAGER           10 ACCOUNTING
      7876 ADAMS      CLERK             20 RESEARCH
      7900 JAMES      CLERK             30 SALES

***********************************주의*****************************************
SQL> select e.empno, e.ename, e.job, d.deptno, d.dname from emp e, dept d where d.deptno = e.deptno(+) or e.ename like '%A%';
select e.empno, e.ename, e.job, d.deptno, d.dname from emp e, dept d where d.deptno = e.deptno(+) or e.ename like '%A%'
                                                                                    *
1행에 오류:
ORA-01719: 포괄 조인 운영 (+)는 OR 또는 IN의 연산수를 허용하지 않습니다

***********************************************************************************
inner join=>and, or 둘다 사용이 가능(조건식에)
outer join=>and만 사용이 가능=>(+) in,or을 같이 사용X
*************************************************************************************


Q 83.
emp테이블에서 empno(사번)에 대한 직속상관 사원번호(mgr) 검색?
 
FORD의 직속상관은 JONES입니다.=>  출력

self join=>조인할(=연결할) 상대방의 테이블이 보통은 존재해야한다.
                        상대방의 테이블이 없을경우 가상의 테이블을 만들어서
                       조인하는 방법(=mirror join)
emp(mgr)  ==>   emp(empno)
    w                         m

SQL> select w.ename || '의 직속 상관은' || m.ename || '입니다.'
  2  from emp w, emp m
  3  where w.mgr = m.empno;

W.ENAME||'의직속상관은'||M.ENAME||'입니다
-----------------------------------------
FORD의 직속 상관은JONES입니다.
SCOTT의 직속 상관은JONES입니다.
JAMES의 직속 상관은BLAKE입니다.
TURNER의 직속 상관은BLAKE입니다.
MARTIN의 직속 상관은BLAKE입니다.
WARD의 직속 상관은BLAKE입니다.
ALLEN의 직속 상관은BLAKE입니다.
MILLER의 직속 상관은CLARK입니다.
ADAMS의 직속 상관은SCOTT입니다.
CLARK의 직속 상관은KING입니다.
BLAKE의 직속 상관은KING입니다.

W.ENAME||'의직속상관은'||M.ENAME||'입니다
-----------------------------------------
JONES의 직속 상관은KING입니다.
SMITH의 직속 상관은FORD입니다.


Q 84.
inner join=>오라클=>ANSI 방법

오라클 
         select 필드명1,,,테이블명1.공통필드명,,,
         from 테이블1,테이블명2,,,
         where 조건식(emp.deptno=dept.deptno)
         ====
Ansi
 형식) select 필드명1,필드명2,,,from 테이블명1 (inner) join  테이블명2
                                                            =======
        on 테이블명1.필드명=테이블명2.필드명
       ===

SQL>  
  1  select e.ename,e.job,d.deptno,d.dname
  2         from emp e inner join dept d
  3*        on d.deptno=e.deptno(+)

...
ENAME      JOB           DEPTNO DNAME
---------- --------- ---------- --------------
JAMES      CLERK             30 SALES
FORD       ANALYST           20 RESEARCH
MILLER     CLERK             10 ACCOUNTING
                             40 OPERATIONS

15 개의 행이 선택되었습니다.


Q 85.
Anis 조인=>using 절

     select e.ename,e.job,d.deptno,d.dname
          from emp e inner join dept d
                           =======
         on e.deptno=d.deptno //공통의 필드명이 동일한 경우
        ===============>using(두 테이블의 공통필드명)
                                                  필드이름이 같아야 된다.

SQL>
  1  select e.ename, e.job, d.dname //테이블명.공통필드명(X)(d.deptno)
  2         from emp e join dept d
  3*        using(deptno)
SQL> /

....
ENAME      JOB       DNAME
---------- --------- --------------
JAMES      CLERK     SALES
FORD       ANALYST   RESEARCH
MILLER     CLERK     ACCOUNTING

14 개의 행이 선택되었습니다.


Q 86.
오라클에서 outer join=>(+)=>Ansi Outr join으로 변경하시오
   =>40번부서를 dept에서 설정?

형식) select 필드명1,필드명2,,,from 테이블명1 별칭1 (left | right) outer join
        테이블명2 별칭2
      on 절
=======================================

SQL>select e.ename,e.job,d.deptno,d.dname
      from emp e,dept d
      where d.deptno=e.deptno(+);
->
SQL>select e.ename,e.job,d.deptno,d.dname
  2   from dept d left outer join emp e
                   ===========(부서테이블이 왼쪽에 배치)->40부서까지 다나옴
  3*  on d.deptno=e.deptno  //on e.deptno=d.deptno  순서는 의미X

ENAME      JOB           DEPTNO DNAME
---------- --------- ---------- --------------
SMITH      CLERK             20 RESEARCH
ALLEN      SALESMAN          30 SALES
WARD       SALESMAN          30 SALES
JONES      MANAGER           20 RESEARCH
MARTIN     SALESMAN          30 SALES
BLAKE      MANAGER           30 SALES
CLARK      MANAGER           10 ACCOUNTING
SCOTT      ANALYST           20 RESEARCH
KING       PRESIDENT         10 ACCOUNTING
TURNER     SALESMAN          30 SALES
ADAMS      CLERK             20 RESEARCH

ENAME      JOB           DEPTNO DNAME
---------- --------- ---------- --------------
JAMES      CLERK             30 SALES
FORD       ANALYST           20 RESEARCH
MILLER     CLERK             10 ACCOUNTING
                             40 OPERATIONS -> 오른쪽이 dept 테이블이기에 다 나오게 설정


SQL>select e.ename,e.job,d.deptno,d.dname
  2   from dept d right outer join emp e
                              ===>오른쪽테이블 (emp)의 데이터는 모두 나오고 왼쪽에는 dept테이블에서는 40번부서는 일치하지
                                       않기때문에 안나온다.
                              right outer join dept d
  3*  on d.deptno=e.deptno

ENAME      JOB           DEPTNO DNAME
---------- --------- ---------- --------------
MILLER     CLERK             10 ACCOUNTING
KING       PRESIDENT         10 ACCOUNTING
CLARK      MANAGER           10 ACCOUNTING
FORD       ANALYST           20 RESEARCH
ADAMS      CLERK             20 RESEARCH
SCOTT      ANALYST           20 RESEARCH
JONES      MANAGER           20 RESEARCH
SMITH      CLERK             20 RESEARCH
JAMES      CLERK             30 SALES
TURNER     SALESMAN          30 SALES
BLAKE      MANAGER           30 SALES

ENAME      JOB           DEPTNO DNAME
---------- --------- ---------- --------------
MARTIN     SALESMAN          30 SALES
WARD       SALESMAN          30 SALES
ALLEN      SALESMAN          30 SALES


Q 87.
emp테이블에서 SCOTT사원이 받는 급여보다 많이 받는 사원을 구해서
                            ----------------------?(3000)
그 사원의 사번,이름,업무,급여순으로 출력하시오.
==================================================================================
서브쿼리의 개요 및 서브쿼리의 종류를 기술하시오.(서술형) 이론시험

서브쿼리(subQuery=>SQL문 내부에 또 다른 SQL구문이 존재하는 구문)
           형식) 중첩함수와 모양이 비슷

          mainQuery=>주쿼리
==================================================================================

1) SCOTT사원이 받는 급여? =>서브쿼리

SQL>select sal 
from emp
where ename='SCOTT';

       SAL
----------
      3000

2) select empno,ename,job,sal
    from emp
   where sal > 3000;

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7839 KING       PRESIDENT       5000

1)+2)

select empno,ename,job,sal
    from emp
   where sal > (select sal from emp
                      where ename='SCOTT');

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7839 KING       PRESIDENT       5000


Q 88.
emp테이블에서 가장 입사일이 오래된 사원의 정보를 출력?
                     -입사일이 가장 적은 사원
                        min(hiredate) <-->max(hiredate)->가장 최근에 입사
(이름,입사날짜순으로 출력하시오.)

SQL> select ename, hiredate
  2  from emp
  3  where hiredate = (
  4  select min(hiredate)
  5  from emp
  6  );

ENAME      HIREDATE
---------- --------
SMITH      80/12/17


Q 89.
emp테이블에서 급여의 평균보다 적은 사원을 찾아서 그 사원의 이름, 업무, 급여순으로 출력하시오.
                             ----------> ** 서브쿼리에 그룹함수를 사용할 수가 있다.**

======================================================
        서브쿼리의 종류
              
=>실행결과가 행이 한개이면 =>단일행 서브쿼리
     실행결과가 행이 한개이상 =>다중행 서브쿼리

=====서브쿼리의 개요과 종류==================================
 서브쿼리의 다양한 패턴(=>오라클 페이징 처리기법)

SQL> select ename, job, sal
  2  from emp
  3  where sal < (
  4  select avg(sal)
  5  from emp);

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            800
ALLEN      SALESMAN        1600
WARD       SALESMAN        1250
MARTIN     SALESMAN        1250
TURNER     SALESMAN        1500
ADAMS      CLERK           1100
JAMES      CLERK            950
MILLER     CLERK           1300


Q 90.
emp테이블에서 사원의 급여가 20번 부서의 최소급여보다
                                             -------------------? 800
        많이 받는 부서를 부서별로 출력하되
                             group by deptno
        (부서번호,최소급여순으로 출력하시오.)  =>서브쿼리에 having조건식도 사용가능

     모든 부서의 최소급여 보다 많이 받는 부서X => 20번 부서의 최소급여보다 
                                                         그룹의 조건식

SQL>select deptno, min(sal) as "부서별 최소 급여"
from emp
group by deptno
having min(sal) > (
select min(sal)
from emp
where deptno = 20)

    DEPTNO   부서별 최소 급여
---------- ----------
        30        950
        10       1300


Q 91.
부서별로 최소급여를 받는 사원의 이름,업무,급여,부서순으로 출력?

서브쿼리의 종류 ->다중행 서브쿼리 문제
**************************************************************************
서브쿼리의 종류  1)단일행 서브쿼리 ->실행결과 행이 한개
                                  연산자-> >,=,<,<=

                      2)다중행 서브쿼리->실행결과(행이 한개이상)
                                연산자->in,any,all~
                                           ====
***************************************************************************

SQL> select ename, job, sal, deptno
  2  from emp
  3  where sal = (
  4  select min(sal)
  5  from emp
  6* group by deptno)
SQL> /
select min(sal)
*
4행에 오류:
ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다.

**************************************************************************
                다중행 연산자를 사용해야 되는데 단일행 연산자를
                사용했기때문에 발생되는 에레메세지
**************************************************************************

SQL> select ename, job, sal, deptno
  2  from emp
  3  where sal in (
  4  select min(sal)
  5  from emp
  6* group by deptno)
SQL> /

ENAME      JOB              SAL     DEPTNO
---------- --------- ---------- ----------
SMITH      CLERK            800         20
JAMES      CLERK            950         30
MILLER     CLERK           1300         10

**************************************************************************
다중행 서브쿼리=>최종 메인쿼리의 결과 행이 나오는 수와는 상관없다.
**************************************************************************


*************************************************************************************************************************
Q 92.
emp테이블에서 30번부서의 최소급여를 받는 사원보다 많은 급여를 받는 사원을 구해서 그 사원의 이름,업무,급여,부서번호를 출력하시오.
                                -------------------
(단 30번부서는 제외한다.)->적용대상이 10,20번 부서
*************************************************************************************************************************

SQL>select ename, job, sal, deptno
  2  from emp
  3  where deptno != 30 and sal > (
  4  select min(sal)
  5  from emp
  6* where deptno = 30)

ENAME      JOB              SAL     DEPTNO
---------- --------- ---------- ----------
JONES      MANAGER         2975         20
CLARK      MANAGER         2450         10
SCOTT      ANALYST         3000         20
KING       PRESIDENT       5000         10
ADAMS      CLERK           1100         20
FORD       ANALYST         3000         20
MILLER     CLERK           1300         10

in = 물리적인 다중행을 처리할 때 사용하는 연산자
any = 논리적인 다중행을 처리할 때 사용하는 연산자
문제자체는 단일행->다중행에서 사용하는 연산자 (any)로 변경이 가능하다.
 ex) ~ > (서브쿼리(그룹함수))=>~ > any(서브쿼리)로 변경이 가능하다.

SQL>select ename, job, sal, deptno
  2  from emp
  3  where deptno != 30 and sal > any (
  4  select sal
  5  from emp
  6* where deptno = 30)

ENAME      JOB              SAL     DEPTNO
---------- --------- ---------- ----------
KING       PRESIDENT       5000         10
SCOTT      ANALYST         3000         20
FORD       ANALYST         3000         20
JONES      MANAGER         2975         20
CLARK      MANAGER         2450         10
MILLER     CLERK           1300         10
ADAMS      CLERK           1100         20

    > (select min(sal) from emp
                  where deptno=30);
*********************************************
    > any(select sal from emp   =>그룹함수를 생략
             where deptno=30)
   < any (조건식) => 최대값을 구해서 그 값보다 적은값을 일일이 비교해서 적은값 -> 큰값 순으로 오름차순
   > any (조건식) => 최소값 = 조건식에 해당하는 가장 적은값을 구한뒤(950)
                                      기존에 조건에 만족하는 값을 하나씩 비교해서 큰값순으로
                                      내림차순으로 정렬해주는 기능


Q 93.
30번 부서의 최대급여를 받는 사원보다 적은 급여를 받는 사원의 정보를 구하시오.(30번부서는 배제)

SQL>select ename, job, sal, deptno
  2  from emp
  3  where deptno != 30 and sal < any (
  4  select sal
  5  from emp
  6* where deptno = 30)

ENAME      JOB              SAL     DEPTNO
---------- --------- ---------- ----------
SMITH      CLERK            800         20
ADAMS      CLERK           1100         20
MILLER     CLERK           1300         10
CLARK      MANAGER         2450         10


Q 94.
업무가 MANAGER인 사원의 이름,업무,부서명,근무지를 출력하시오.=>조인
                                   emp e    dept d  (inner join)
******************************************************************************************************************************************
조인의 단점=> 테이블의 필드갯수가 많고, 데이터가 많이 들어가 있는경우 =>튜닝(서브쿼리 이용) -> 검색 속도가 느려진다.
******************************************************************************************************************************************

SQL> select e.ename, e.job, d.dname, d.loc
  2  from emp e, dept d //from 테이블->필드 모두를 메모리에 올림 -> 나중에 조건에 만족하는 필드를 검색 : 속도가 느려진다.
  3  where e.deptno = d.deptno and e.job = 'MANAGER';

ENAME      JOB       DNAME          LOC
---------- --------- -------------- -------------
JONES      MANAGER   RESEARCH       DALLAS
BLAKE      MANAGER   SALES          CHICAGO
CLARK      MANAGER   ACCOUNTING     NEW YORK

SQL>select e.ename, e.job, d.dname, d.loc
  2  from (
  3     select ename, job, deptno
  4     from emp
  5     where job = 'MANAGER'
  6  ) e, dept d
  7* where e.deptno = d.deptno and e.job = 'MANAGER';

ENAME      JOB       DNAME          LOC
---------- --------- -------------- -------------
JONES      MANAGER   RESEARCH       DALLAS
BLAKE      MANAGER   SALES          CHICAGO
CLARK      MANAGER   ACCOUNTING     NEW YORK


Q 95.
 emp테이블에서 부서별로 부서번호,인원수,평균급여,급여합계,최소급여,최대급여를
 구한 결과를 emp_deptno 백업테이블로 저장하는 SQL구문을 작성하시오.

  =>통계처리한 결과를 테이블로 저장하고 싶을때 사용
  =>save =>sql구문이 저장(문자열이 저장)

서브쿼리에서의 사용시 주의할점=>테이블을 생성할 수 있다.

 1.create table~
 2.백업 테이블 생성=>create table 백업t명 as SQL구문 =>** 형식) 수학의 공식
                                                           select * from 원본테이블
                                                           select * from 원본테이블 where 조건식 (조건식)
                                                           =>필드명=>그대로 복사,데이터도 복사돼서 저장
  **주의할점**
   제약조건은 복사X=>백업테이블에서 다시 제약조건을 설정 O (재설정)
   pk,check,fk,,,=>수동으로 부여
SQL> create table emp_deptno as select deptno, count(*), avg(sal), sum(sal), min(sal), max(sal)
  2  from emp
  3  group by deptno;
create table emp_deptno as select deptno, count(*), avg(sal), sum(sal), min(sal), max(sal)
                                          *
1행에 오류:
ORA-00998: 이 식은 열의 별명과 함께 지정해야 합니다 = 존재하는 필드가 아니기에 필드명을 따로 별칭으로 만들어서 넣어야됨

SQL>create table emp_deptno as select deptno, count(*) as e_count, avg(sal) as e_avg, sum(sal) as e_sum, min(sal) as e_min, max(sal) as min_max
  2  from emp
  3* group by deptno
테이블이 생성되었습니다.

SQL> desc emp_deptno
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 DEPTNO                                             NUMBER(2)
 E_COUNT                                            NUMBER
 E_AVG                                              NUMBER
 E_SUM                                              NUMBER
 E_MIN                                              NUMBER
 E_MAX                                              NUMBER

SQL> select * from emp_deptno;
    DEPTNO    E_COUNT      E_AVG      E_SUM      E_MIN      E_MAX
---------- ---------- ---------- ---------- ---------- ----------
        30          6 1566.66667       9400        950       2850
        20          5       2175      10875        800       3000
        10          3 2916.66667       8750       1300       5000

****************************************************************************************************
백업테이블=>구조만 복사하고 싶다.(내용X)=>빈폴더,빈파일

 sql> create table b_emp2 as select empno,ename from emp
        where 1=0; //조건이 거짓 ->
         //데이터가 없기때문에 ->테이블의 구조(=schema)만 복사(필드만 복사)
         //내용은 복사가 안되는 이유는 조건식이 거짓이기에 

테이블이 생성되었습니다.
****************************************************************************************************


Q 96.
부서번호 40부서에 근무할 직원을 입력?
서브쿼리=>DML을 이용해서 서브쿼리 사용가능하다.
             (insert)

형식) insert into 테이블명 values(값1,값2,,,,);
                       -------(서브쿼리)

SQL> insert into (select empno, ename, sal, hiredate, job, deptno from b_emp3 where deptno = 40)
  2  values(7777,'JANG',4000,to_date('19-07-01','rr-mm-dd'),'MANAGER',40);

1 개의 행이 만들어졌습니다.

SQL> select empno, ename, sal, hiredate, job, deptno from b_emp3 where deptno = 40;
     EMPNO ENAME             SAL HIREDATE JOB           DEPTNO
---------- ---------- ---------- -------- --------- ----------
      7777 JANG             4000 19/07/01 MANAGER           40

********************************************************************************************************************************
Q 97.
b_emp3테이블에서 SCOTT의 업무와 급여가 일치하도록 JONES의 업무와
 급여를 수정하는 SQL구문을 작성하시오.
********************************************************************************************************************************
update+subQuery 적용
   SCOTT
                                     <-    JONES     MANAGER, 2975
  ANALYST 3000                     분석가로 이직

형식) update 수정할 테이블명
                   set 변경할필드명=값 ,변경할필드명2=값,,,,
                  ========================
                  set (필드명1,필드명2,,)=(서브쿼리를 이용)
       where 조건식

SQL> update b_emp3 set (job, sal) = (
  2  select job, sal
  3  from emp
  4  where ename = 'SCOTT')
  5  where ename = 'JONES';

1 행이 갱신되었습니다.

SQL> select ename, job, sal from b_emp3 where ename = 'JONES';

ENAME      JOB              SAL
---------- --------- ----------
JONES      ANALYST         3000

서브쿼리를 쓴 이유 : 수정할 값을 모르기 때문에 서브쿼리를 통해서 수정할 값을 찾아서 빌드별로 대입해서 넣어준다.


Q 98.
delete 구문+subQuery를 사용이 가능?
b_emp3의 자료중에서 부서명이 'SALES'인 사원의 정보를 삭제하시오.
      emp테이블=>부서명X deptno

 형식)  delete from 테이블명; //모든 데이터 삭제->rollback 하면 복구된다.
       =>delete * from emp;//(X)
         delete from 테이블명 where 조건식=(서브쿼리)

SQL>delete from b_emp3
  2  where deptno = (
  3  select deptno
  4  from dept
  5* where dname = 'SALES');

6 행이 삭제되었습니다.

SQL> rollback;

롤백이 완료되었습니다.


Q 99.
  오라클의 페이징 처리 기법

 테이블에 데이터가 많은 상태=>화면구현 (페이지당 10개 default)=>20,30
                                                 www.jspstudy.co.kr
                                                       (jsp 문의 게시판)
 1.rownum =>내부적으로 번호를 매기면서 화면에 출력시켜주는 오라클의
                     내부적인 고유번호(=일련번호)

SQL>select rownum,empno,ename from emp
....
    ROWNUM      EMPNO ENAME
---------- ---------- ----------
        12       7900 JAMES
        13       7902 FORD
        14       7934 MILLER

14 개의 행이 선택되었습니다.

SQL>select rownum empno,ename from emp
                          =>empno을 rownum의 별칭형태로 사용
.....
     EMPNO ENAME
---------- ----------
        12 JAMES
        13 FORD
        14 MILLER

14 개의 행이 선택되었습니다.


Q 100.
emp테이블에서 가장 최근에 입사한 5명의 사원의 이름과 입사일을 출력하시오.

공식)
 select rownum "별칭명",필드명,,,테이블 별칭.*
 from  (
         select 필드명,,,
         from 테이블명
         order by top-N 필드명(정렬이 되는 필드명) desc (가장 최근)
) 별칭명
where 조건식(rownum <=top-N)에 맞는값을 부여

sql>select rownum "num",ename,hiredate
      from (
                select ename,hiredate
                from emp
                order by hiredate desc
      )
where rownum <=&num;

SQL>select rownum as "num", ename, hiredate  3) 앞에 번호를 매기면서 사원번호, 입사일 출력
  2  from ( 1) 입사일이 가장 최근순으로 이름, 입사일 순으로 출력
  3  select ename, hiredate
  4  from emp
  5  order by hiredate desc)
  6* where rownum <= &num 2) rownum = num num순위 만큼 번호를 매김

num의 값을 입력하십시오: 5
구   6: where rownum <= &num
신   6: where rownum <= 5

       num ENAME      HIREDATE
---------- ---------- --------
         1 ADAMS      87/05/23
         2 SCOTT      87/04/19
         3 MILLER     82/01/23
         4 JAMES      81/12/03
         5 FORD       81/12/03

<<예습>> 트랜잭션

트랜잭션은 데이터베이스(DB)에서 데이터를 처리(insert, update, delete)하는
여러개의 SQL 명령어를 하나의 논리적인 작업 단위로 설정

논리적인 작업 단위 : 어디서 부터 시작 언제 끝나는지?
          ex) 09:0 ~ 18:00

A(신한) B(국민)
          -10,000  -> +10,000
            delete       insert
조건
All : 실행이 되면 끝까지 실행
or
Nothing : 처음부터 실행이 되지 말아야 됨(중간에 오류나서 안되는 경우)


COMMIT - Memory에 저장된 상태 -> 실질적으로 테이블에 저장으로 시켜줌
모든 작업들을 정상적으로 처리(ex - 구매 확정)
데이터베이스(DB)에 모두 반영 -> 실제 테이블에 반영
변경된 내용을 모두 영구 저장 -> 데이터 삭제 전까지
ROLLBACK 이 불가능함
DDL,DCL 만 복구됨

ROLLBACK
처리 과정에서 발생한 변경 사항을 취소(ex - 반품(구매 확정버튼 누르기 전)
이전의 상태로 되돌린다.


Q 101.
commit 의 개념

SQL> create table b_dept2
  2  as select * from dept;
테이블이 생성되었습니다.

'국비학원 > 공부' 카테고리의 다른 글

13일차 oracle(6)  (1) 2023.05.09
12일차 oracle(5)  (1) 2023.05.08
10일차 oracle(3)  (1) 2023.05.04
9일차 oracle(2)  (0) 2023.05.04
8일차 oracle(1)  (0) 2023.05.04