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 <=#
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 |