Quiet Time

identified
 
 
11 . 기타 스키마 객체
    • 목차
 
    • VIEW
    • INDEX
    • SEQUENCE
    • SYNONYM
 
11.1 VIEW
 
"테이블을 바라보는 쿼리문의 결과"
 
    • VIEW  필요한 이유
 
    • 데이터의 보안을 위해서
    • 복잡한 쿼리를 단순하게 조회하기 위해서
 
 
 
create view emp990
as
select empno , ename, job, comm, job, deptno
  from emp;
 
select * from emp990;
 
 
 
뷰를 수정하면 테이블도 수정됨 !!
 
 
update emp990
set comm= 9000
where ename = 'MARTIN';
 
 
 
문제331. 부서번호, 부서번호별 평균월급을 출력하시오
 
SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO;
 
문제332. 이름, 월급, 부서번호,부서번호별 평균월급
 
SELECT ENAME, SAL, DEPTNO, SUM(SAL)
  FROM EMP;
GROUP BY DEPTNO
------------------------ 만들어서 쓰기-------------------------------
 
CREATE VIEW D_AVG
AS SELECT DEPTNO , AVG(SAL) 평균월급
FROM EMP
    GROUP BY DEPTNO;
   
    SELECT ENAME, SAL, E.DEPTNO, ROUND(D.평균월급,2)
  FROM EMP E, D_AVG D
  WHERE E.DEPTNO = D.DEPTNO;
 
------------------------------- 라인 --------------------------------------
 
SELECT ENAME, SAL, E.DEPTNO, ROUND(D.평균월급,2)
  FROM EMP E, (SELECT DEPTNO , AVG(SAL) 평균월급
FROM EMP
    GROUP BY DEPTNO) D
  WHERE E.DEPTNO = D.DEPTNO;
 
문제333.위의 결과를 다시 출력하는데 자기의 월급이 자기가 속한 부서번호의
평균월급보다   사원만 출력하시오
 
 
SELECT ENAME, SAL, E.DEPTNO, ROUND(D.평균월급,2)
  FROM EMP E, (SELECT DEPTNO , AVG(SAL) 평균월급
FROM EMP
    GROUP BY DEPTNO) D
  WHERE E.DEPTNO = D.DEPTNO AND E.SAL > 평균월급;
 
 
문제334.(오늘의 마지막 문제)
     통신사 ,이름, 나이, 순위를 출력하는데
순위가  통신사별로 각각 나이가 높은 순서대로 순위를 부여하는 결과를
출력할 때에 순위가 1,2,3등만 출력되게 하시오
 
 
    SELECT *
      FROM
           (SELECT TELECOM,
                  ENAME,
                  AGE,
                  DENSE_RANK() OVER (PARTITION BY TELECOM ORDER BY AGE DESC) RNK
             FROM EMP2
           )
     WHERE RNK <=3 ;
 
 
 
 
    • 제약(constraint) " 데이터의 품질을 높이기 위해서"
      1. primary key
      2. unique
      3. not null
      4. check
      5. foreign key
    • Database object 5가지
      1. table                              -->행과 열로 이루어진 데이터를 저장하는 기본 저장단위
 
    • view                               --> 테이블을 바라보는 쿼리문의 결과
in line view 비교
 
    • index
 
    • sequence
 
    • synonym
 
 
 
view 장점 :?      1. 데이터 엑세스 제한
(보안상 감춰야  컬럼들을 감추기 위해서)
    •  복잡한 쿼리를 단순화
 
 
문제335. 이름,월급, 등급을 출력하는 ntile 분석함수를 이용해서 등급을 4등급으로 나눠서 출력하세요
(월급이 높은 순서대로 등급을 나누시오!)
 
 
select ename, sal,
(4) over (order by sal desc) 등급
from emp;
 
 
 
문제336.위의 쿼리의 결과를view 생성하시오 !
(view 이름 : emp336)
 
create view emp336
as
select ename, sal, ntile(4) over (order by sal desc) 등급
from emp;
 
 
문제337. emp336 view에서 등급이 4등급인 사원들만 출려하시오
 
-view
 
 SELECT *
      FROM emp336
      where 등급 = 4;
 
-in line view
 
 SELECT *
      FROM (SELECT ename,
           sal,
           ntile(4) over (ORDER BY sal desc) 등급
      FROM emp)
      where 등급 = 4;
 
 
설명 :  select 문에서 서브쿼리를  수있는 절
 
    SELECT                       --- subquery (명칭: 스칼라 서브쿼리)
      FROM                      --- subquery ( 명칭: 라인 )
     WHERE                     --- subquery
     GROUP BY                 
    HAVING                     --- subquery
  ORDER BY                    ---subquery
 
 
문제338.  이름, 월급, 사원 테이블 전체의 평균 월급을 출력하시오
 
select ename, sal, (select avg(sal) from emp)
from emp;
 
 
    • view 종류 2가지 (p11-7)
           단순 view                                        복합 view
테이블의 갯수                     1                                               1 초과
 
group 함수나                       불 포함                                              포함
group by 
 
DML 여부                             가능                                              불가능할 수도 있다.
 
문제339. 이름, 월급과 부서 위치를 출력하는 VIEW 생성하시오
(view 이름 : emP339)
CREATE VIEW EMP339
AS
SELECT ENAME,SAL,LOC
FROM EMP , DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO
 
 
 
문제340. EMP339 VIEW 수정하는데 이름이 KING 사원의 부서위치를
SEOUL 변경하시오
 
UPDATE EMP339
SET LOC='SEOUL'
WHERE ENAME='KING';
 
 
복합 뷰이기 때문에 에러가 난다.
뷰는 데이터를 갖고 있지 않다
저렇게 하면 실제 테이블로 가서 업데이트를 한다
 
그러면 다른 사람들의 LOC 바뀐다
 
그러므로 복합뷰는 갱신   없다.
 
 
 
문제341. 부서번호, 부서번호별 평균월급을 출력하는 VIEW 생성하시오
(VIEW 이름: EMP341)
 
CREATE VIEW EMP341
AS
SELECT DEPTNO, AVG(SAL) AVG
      FROM EMP E
      GROUP BY DEPTNO;
 
문제342. 부서번호가 10번인 사원들의 평균월급을 2000으로 변경해보시오!
( VIEW 이름: EMP343)
UPDATE EMP341
SET AVG= 2000
WHERE DEPTNO=10
 
문제343. 부서번호가 20번인 사원들의 사원번호, 이름, 월급, 부서번호를 출력하는 VIEW 생성하시오
 
 
CREATE VIEW EMP343
AS
SELECT DEPTNO, ENAME, DEPTNO
FROM EMP
WHERE DETPNO = 20;
 
 
문제344. VIEW 수정을 하는데
 
EMP343뷰를 수정하는데 JONES 부서번호를 30번으로 변경하시오
UPDATE EMP343
SET DEPTNO = 30
WHERE ENAME = 'JONES';
 
 
 VIEW 생성시 옵션
    • WITH CHECK OPTION : VIEW  WHERE 절에서 기술한 조건에 위배되게끔 DATA 갱신하지 못하게 하는 옵션
   2.    WITH READ ONLY : VIEW 전체를  수정, 삭제하지 못하게 하고 오로지 읽기만   잇게 하는 옵션
 
 
 
DROP VIEW EMP343;
 
CREATE VIEW EMP343
 
AS
 
SELECT EMPNO, ENAME, SAL DEPTNO
FROM EMP
WHERE DEPTNO = 30
WITH CHECK OPTION;
 
 
 
 
 
문제345. 사원 테이블의 이름과 월급을 출력하는 VIEW 생성하는데
 월급을 9600으로는 수정못하게 하는 VIEW 생성핫이오
(VIEW 이름:EMP345)
CREATE VIEW EMP345
 
AS
 
SELECT ENAME, SAL
FROM EMP
WHERE sal between 0 and 9600
WITH CHECK OPTION;
 
문제346. with check옵션을 걷어내시오
 
CREATE or replace VIEW EMP345
 
AS
 
SELECT ENAME, SAL
FROM EMP
WHERE sal between 0 and 9600
 
※설명: emp345 view  존재하면  수정하고 없으면 새롭게 만들어라
 
 삭제 drop view emp346
 
 
 
문제347. (점심시간 문제) 페이스북에서 키워드 '입장권'으로 스크롤링한
csv 파일을 오라클에 table에 입력하시오
(테이블명 : facebook_ticket)
select * from facebook_ticket;
 
 
 
문제348. 데이터 입력한 페이스북 티켓 테이블의 데이터중 시간정보 끝에 ,  잘라내는 쿼릴 완성하고
 
CTAS 이용해서 FACEBOOK_TICKET2 라는 테이블을 생성하시오
 
 
 
 
create table FACEBOOK_TICKET2 as 
 
select rtrim(use_time,',') use_time ,to_lob(use_word) use_word from FACEBOOK_TICKET;
 
select * from FACEBOOK_TICKET2;
 
 
 
 
문제349. 아래와 같이 결과를 출력하시오!
년도// : 시간 , 건수
 
select substr(use_time,1,13) a, count(*)
from FACEBOOK_TICKET
group by substr(use_time,1,13)
order by a asc nulls last;
 
문제350. 아래와 같이 입장권에 대한 글이 facebook 가장 많이 올라온 날짜부터 출력
 
select substr(use_time,1,10) a, count(*)
from FACEBOOK_TICKET
group by substr(use_time,1,10)
order by count(*) desc nulls last;
 
 
 
11.2 index ----> data 검색속도를 높이는 db object
    • data 엑세스 하는 방법
    • full table scan : 테이블을 처음부터 끝까지 전부 스캔해서 원하는 data 검색하는 방법
    • index range scan : 인덱스(  : 책의 목차)  통해서 테이블의 data 검색하는 방법
 
 
문제351. 이름이 SCOTT 사원의 이름과 월급을 조회하시오
 
SELECT ENAME, SAL
FROM EMP
WHERE ENAME = 'SCOTT';
  
 
    • 인덱스 생성 구문
CREATE INDEX EMP_ENAME   <----------인덱스 이름
ON EMP(ENAME)
                     
 테이블명   컬럼명
 
 
 
 
 
    • 인덱스의 구조
    • 컬럼값 + rowid (해당 로우의 주소)
                               : 페이지 번호
 
    • 컬럼값이 ascending 하게 정렬되어있다 ( 영무능 abcd 순서대로 정렬되어있다.)
 
select ename, rowid
  from emp
where ename > '         ';
 
 
 
 
* 아래의 쿼리의 실행계획을 각각 보시오
1. table 에서 데이터를 읽은 경우
 
select ename, rowid
from EMP;
 
실행계획 확인 방법 : F7
 
2. index 에서 데이터를 읽은 경우
select ename, rowid
from emp
where ename > '           ';
----------------------------------------------------------------------------------------
|Operation                                 | Object Name | Rows | Bytes | Cost | Object Node | In/Out | PStart | PStop | Access Predicates | Filter Predicates |
----------------------------------------------------------------------------------------------------------------------------------------------------------------
| SELECT STATEMENT Optimizer Mode=ALL_ROWS |             |   14 |   266 |    2 |             |        |        |       |                   |                   |
|  TABLE ACCESS FULL                       |SCOTT.EMP    |   14 |   266 |    2 |             |        |        |       |                   |                   |
 
 
 
 
 
select ename, rowid
  from emp
WHERE ENAME > ' ';
 
 
 
 
 
 
문제352. EMP 테이블에 월글에 INDEX 거시오
 
 
CREATE INDEX EMP_SAL   <----------인덱스 이름
ON EMP(SAL)
 
 
 
문제353. EMP_SAL 인덱스의 구조를 확인하시오
 
컬럼값 + ROWID
 
    SELECT SAL ,
           rowid
      FROM emp
     WHERE SAL > 0;
 
문제354. 월급이 1600 사원의 이름과 월급을 출력하시오!
아래의 SQL 인덱스를 통해서 데이터를 조회했는지
아니면 테이블을 Full table scan  해서 조회햇는지
알아내려면 어떻게 해야 하는가?
 
 
SELECT ENAME, SAL
FROM EMP
WHERE SAL = 1600;



문제355. 입사일에 인덱스를 걸어보세요
create index emp_hiredate
on emp(hiredate);



문제.356. 입사일에 걸린 인덱스의 구조를 확인하시오!
 
컬럼값 , rowid
 
 
select hiredate, rowid
from emp
where hiredate < to_date('9999/12/31','RRRR/MM/DD');
 
    • 인덱스의 구조를 확인하기 위해서 where 절에 조건을 주는 조건
      1. 문자 > '     '
      2. 숫자 > 0
      3. 날짜 < to_date('9999/12/31','RRRR/MM/DD')
 
문제357. 아래의 SQL 결과를 ORDER BY  쓰지 말고 데이터가 정렬   있도록
다시 재작성하시오! ( 튜닝하시오)
 
튜닝전 :
SELECT ENAME, SAL
FROM EMP
ORDER BY SAL ASC;
 
튜닝후 :
SELECT ENAME, SAL
FROM EMP
WHERE SAL > 0;
 
SELECT /*+ INDEX_ASC(EMP EMP_SAL) */ENAME,
           SAL
      FROM EMP
     WHERE SAL > 0;
 
설명 :  /*+ 힌트 */   힌트? 실행계획을 제어하는 명령어
 
INDEX_ASC ----> 인덱스를 ASCE NDING 하게 읽어라
 
INDEX_ASC(EMP            EMP_SAL)
                                              
테이블명        인덱스 이름
 
문제358. 아래의 SQL ORDER BY 절을 이용하지 말고 인덱스를 통해서 정렬된 결과를 보시오
 
SELET ENAME, SAL
FROM EMP
WHERE JOB = 'SALESMAN'
ORDER BY SAL ASC;
 
 
문제359. 아래의 SQL ORDER BY  없이 수행되게끔 SQL 고치시오
 
튜닝전 : SELECT ENAME, HIREDATE
FROM EMP
ORDER BY HIREDATE DESC;
 
튜닝후  :
SELECT ENAME, HIREDATE
FROM EMP
WHERE  HIREDATE < TO_DATE('9999/12/31','RRRR/MM/DD');
 
 
 
머신러닝의 가장 기본이 되는 핵심 알고리즘중에
경사 감소법이 있는데  경사 감소법을 이해하려면 수렴과 발산을 알아야 한다
 
수열 : 수의 나열
1, 3, 5, 7, 9
 
퍼셉트론 네모와 세모를 구분해 내요!
 
ㅁㅣ분이 필요해요!
 
미리 공부해 놓아요
 
 
 
 
 
    • sql이란
    • sql 배워야하는거이유
    • select 6가지값
    • 단일행 함수 : 문자,숫자,날짜,변환,일반
복수행 함수 : max, min, avg, sum, count
 
    • 조인 - 1. 1999 ansi 조인 문법
 2. 오라클 조인
    1. 서브쿼리 1. single row subqeury
        2. multiple row subquery
        3. multiple column subquery
    1. 집합연산자 4가지 : uninon all , union, minus , intersect
    2. 레포팅 
      • rollup
      • grouping sets
      • grouping
      • cube
    1. DML 문장
      • INSERT
      • UPDATE
      • DELETE
      • MERGE
    1. DDL 문장 : CREATE, ALTER, DROP, TRUNCATE, RENAME
    2. 제약 : PRIMARY KEY, UNIQUE, CHECK , NOT NULL, FOREIGN KEY
    3. DB OBJECT 5가지
      • TABLE
      • VIEW
      • INDEX          --------------> 데이터 검색 속도를 높이는 DB오브젝트
      • SEQUENCE
      • SYNONYM
 
 
 
 인덱스 (INDEX) 구조
    1. 컬럼값 + ROWID (ROW 구조)
    2. 컬럼값이 ASCENDING 하게 정렬이 되어있다.
    1. ROWID( ROW 주소)
FILE번호 + BLOCK번호 + ROW번호
 
SELECT ROWID, EMPNO, ENAME, SAL
FROM EMP;
 
 
SELECT * FROM EMP;
 
감춰져 있는 컬럼
 
 
 
 
문제360. 사원테이블에 월급에 인덱스가 있는지 조회하시오!
 
SELECT INDEX_NAME
FROM USER_INDEXES
WHERE TABLE_NAME='EMP';
 
    1. 어느 컬럼에 인덱스가 있는지 확인 하고자 한다면
SELET TABLE_NAME, INDEX_NAME, COLUMN_NAME
FROM USER_IND_COLUMNS
WHERE TABLE_NAME='EMP';
 
문제361. emp_sal 인덱스의 구조를 출력하시오!
 
컬럼값 + rowid
 
select u.column_name , e.rowid
from user_ind_columns u, emp e
where u.rowid = e.rowid;
 
select sal, rowid
from emp
where sal >= 0;
 
       emp_sal 인덱스                                                                                 emp 테이블
 
 
문제362. 월급이 1600 사원의 이름과 월급을 출력하시오
( 어떻게 인덱스를 통해서 테이블의 데이터를 찾는지 그림으로 설명하시오 )
select ename , sal
  from emp
where sal = 1600;
 
 
 
 
문제363. 그럼 아래의 SQL 실행계획이 FULL TABLE SCAN 했는지 INDEX RAGE SCAN
 
SELECT /*+ INDEX(EMP EMP_SAL) */ENAME, SAL
FROM EMP
WHERE SAL =1600;
 
 
 
 
 
 
 
 
문제364. 81/02/23  입사한 사원의 이름과 입사일을 출력하는데
실행계획이 어떻게 되는지 확인하고 인덱스 스캔이   있도록
조치하시오 !
 
SELECT ENAME, HIREDATE
  FROM EMP
WHERE HIREDATE = TO_DATE('1981/02/23','RRRR/MM/DD');
 
문제365. 연봉이 36000 사원의 이름과 연봉(SAL * 12)  출력하시오!
==> 힌트써도  테이블 스캔함(  TABLE ACCESS FULL )
 
 
튜닝전:
 
SELECT /*+ INDEX(SAL, EMP_SAL) */ ENAME, SAL* 12
 FROM EMP
 WHERE SAL * 12 = 36000;
              
            좌변
 
좌변(인덱스 컬럼)  가공 하면 인덱스 엑세스가  된다.
 
 
튜닝후 :
 
SELECT /*+ INDEX(EMP, EMP_SAL) */ ENAME, SAL * 12
 FROM EMP
 WHERE SAL = 36000 / 12;
 
 
 
설명: 인덱스 컬럼을 가공하게 되면 인덱스 엑세스가 안된다!
검색 속도를 높이려면 인덱스 컬럼을 가공하는 SQL 작성하면 안된다.!!
 
 
문제366. 아래의 SQL 튜닝하시오
 
CREATE INDEX EMP_JOB
ON EMP(JOB)
 
튜닝전 :
SELECT ENAME, JOB
  FROM EMP
 WHERE SUBSTR(JOB,1,5) = 'SALES';
 
 
튜닝후 :
SELECT /*+ INDEX(EMP, EMP_JOB) */ ENAME, JOB
  FROM EMP
 WHERE JOB LIKE  'SALES%';
 
 
설명: substr 을 걷어내고 like 연산자를 사용하는데
와일드 카드(%)  뒤쪽에 작성해야 한다.
 
문제367. 아래의 SQL 튜닝하시오!
 
튜닝전 :
 select ename hiredate
from emp
where to_char(hiredate, 'RR/MM/DD') = '81/02/23';
 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|Operation                                 | Object Name | Rows | Bytes | Cost | Object Node | In/Out | PStart | PStop | Access Predicates |                       Filter Predicates                      |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SELECT STATEMENT Optimizer Mode=ALL_ROWS |             |    1 |    14 |    2 |             |        |        |       |                   |                                                              |
|  TABLE ACCESS FULL                       |SCOTT.EMP    |    1 |    14 |    2 |             |        |        |       |                   | TO_CHAR(INTERNAL_FUNCTION("HIREDATE"),'RR/MM/DD')='81/02/23' |
 
 
 
 
튜닝후 :
 select ename hiredate
from emp
where hiredate = to_date('81/02/23','RR/MM/DD');
 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|Operation                                 |     Object Name    | Rows | Bytes | Cost | Object Node | In/Out | PStart | PStop |             Access Predicates             | Filter Predicates |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SELECT STATEMENT Optimizer Mode=ALL_ROWS |                    |    1 |    14 |    2 |             |        |        |       |                                           |                   |
|  TABLE ACCESS BY INDEX ROWID             |SCOTT.EMP           |    1 |    14 |    2 |             |        |        |       |                                           |                   |
|   INDEX RANGE SCAN                       |SCOTT.EMP_HIREDATE  |    1 |       |    1 |             |        |        |       | "HIREDATE"=TO_DATE('81/02/23','RR/MM/DD') |                   |
 
 
 
 
 
문제368. 아래의 데이터를 입력하고 어제 입사한 사원의 이름과 입사일을 출력하시오
 
insert into emp ( empno , ename, sal , hiredate)
values (1256, 'JACK', 3500, sysdate-1);
 
 
튜닝전:
select ename, hiredate
from emp
where to_char(hiredate,'RR/MM/DD') = '17/03/12';
 
 
튜닝후
select ename, hiredate
from emp
where hiredate =  to_date('17/03/12','RR/MM/DD');
 
 
 
select ename, hiredate
from emp
where hiredate between  to_date('17/03/12 00:00:00','RR/MM/DD HH24:MI:SS') and
to_date('17/03/12 23:59:59','RR/MM/DD HH24:MI:SS');
 
 
select ename, hiredate
from emp
where hiredate between  to_date('17/03/12 00:00:00','RR/MM/DD HH24:MI:SS') and
   to_date('17/03/12 23:59:59','RR/MM/DD HH24:MI:SS');
 
select ename, hiredate
from emp
where hiredate >=  to_date('17/03/12','RR/MM/DD') and
hiredate < to_date('17/03/12','RR/MM/DD') + 1
;                                                
 
문제369. (점심시간문제)
아래의SQL order by  쓰지말고 인덱스를 통해서
데이터가 정려로디도록 다시 재작성하시오
 
튜닝전 :
 select ename, sal, job
from emp
where job = 'SALESMAN'
ORDER BY SAL DESC;
 
 
튜닝후
 select ename, sal, job
from emp
where SAL > 0 AND   job = 'SALESMAN'
 
 
 
 인덱스 삭제
drop index emp_sal;
 
select index_name
from user_indexes
where table_name = 'EMP';
 
 
문제370. emp 테이블에 걸린 모든 인덱스를 전부 삭제하시오!
 
 
select ' drop index ' || index_name ||';'
from user_indexes
where table_name='EMP';
 drop index EMP_JOB; drop index EMP_HIREDATE; 
 
문제371.EMP, EMP2, SALGRADE, DEPT 테이블을 제외한 다른 테이블들을 전부 드랍하시오
 
 SELECT 'DROP TABLE '||TABLE_NAME || ';'
 FROM USER_TABLES
 WHERE TABLE_NAME NOT IN ('EMP','EMP2','SALGRADE','DEPT');
 
 
    1. 11 목차
    1. VIEW
    2. INDEX
    3. SEQUENCE
    4. SYNONYM
 SEQUENCE ~> 번호를 생성하는 데이터 베이스 오브젝트
 
    1. 시퀀스 (SEQUENCE)   필요한가?
 " 특정 테이블에 번호를 순서대로 입력하기 위해서 필요하다"
 : 특정과목에 수강신청을 하는데 30 정원인 경우
       테이블에 30명만 입력되게 하고 번호가 순서대로
수강신청번호가 생성되게 입력하고 싶을때 필요해
 
    1. 시퀀스 생성
CREATE SEQUECE SEQ1
START WITH 1                    ----시작숫자
INCREMENT BY 1               ----증가치
MAXVALUE 100                  ----최대숫자
MINVALUE -100                 ----최소숫자 (순환시 사이클이 끝까지 가면 다시 -100)
NOCYCLE                             ---- 순환여부
CACHE 20 ;                         --- 시퀀스의 번호를 빨리 사용하기 위해 번호 20개를 미리 생성해서 메모리에 올려놓음
 
 
 
 
    1. 시퀀스를 사용하는 방법
SELECT SEQ1.NEXTVAL
FROM DUAL;
 
 
 
    1. 시퀀스를 삭제하는 방법
DROP SEQUENCE SEQ1;
 
문제372. 아래의 테이블을 생성하고 아래의 테이블에 번호를 100개를 입력하시오
(1 ~ 100)
 
CREATE TABLE EMP506
(EMPNO NUMBER(10));
 
 
INSERT INTO EMP506 VALUES (SEQ1.NEXTVAL);          -----------------       100 반복
 
문제373. 아래와 같이 시퀀스를 생성하면 시퀀스의  파라미터들에 대해서
default 어떻게 되는지 확인 하시오
 
create sequence seq373;
 
select *
from user_sequences;
 
 
 시퀀스 수정하는 방법
select *
from user_sequences;
create sequence seq5
start with 1
inCrement by 1
maxvalue 200
nocyCle;
 
 
 
 
select *
  from user_sequences
where sequence_name= 'SEQ5';
 
    1. 시퀀스 seq5 maxvalue 1000으로 변경하겠다.
 
 
alter sequence seq5
maxvalue 1000;
 
 
문제374. 시퀀스 seq5 increment by 2 변경하고
cache 200으로 변경하고 순환여부를 cycle 바꾸시오
 
alter sequence seq5
increment by 2
cache 200
cycle;
 
 
  start with 옵션은 alter sequence 명령어로 변경 못한다.(p11-32)
 
 
문제375. 지금까지 만들었던 시퀀스를 모두 삭제하시오 !
 
select sequene_name from user_sequences;
 
    1. 데이터 사전
    1. 내가 만들었던 테이블들을 확인하는 방법:           user_tables
    2. 내가 만들었던 view들을 확인 하는 방법:               user_views
    3. 내가 만들었던 index들을 확인하는 방법 :              user_indexes
    4. 내가 만들었던 sequene들을 확인하는 방법 :        user_sequences
 
 
 
    1. 11 목차
      • VIEW
      • INDEX
      • SEQUENCE
      • SYNONYM   ----------->   동의어
 
    1. 유저생성과 권한 부여
create user king
identified by tiger;
 
grant connect to king;
 
 
설명 : 패스워드를 tiger 하는 king 유저를 생성하고 king 유저에게
접속할  있는 권한을 부여 
 
 
문제376. scott유저에서 ctas를 이용해서 emp 테이블을 모두 쿼리한
결과를 테이블로 생성하시오 ( 테이블명 : emp500 )
 
 
 
 
    create user king
identified by tiger;
 
grant connect to king;
   
   
create table emp500
as select * from EMP;
 
select * from emp500;
 
grant select on emp500 to king;
 
commit;
 
select * from emp500;
 
 
king 유저에서 emp500 select 해보시오~~
 
 
select * from scott.EMP500;
 
 
SCOTT.EMP500 대한 SYNONYM 생성하시오 !
 
 
    CREATE PUBLIC SYNONYM EMP
    FOR SCOTT.EMP500;
 
 
문제377. SCOTT  DEPT 테이블을 SELECT   있는 권한을 KING에게 부여하고 KING 유저가 아래와 같이
DEPT 테이블을 SELECT   있도록 하시오
 
 
grant select on DEPT to king;
CREATE PUBLIC SYNONYM DEPT
FOR SCOTT.DEPT;
commit;
 
   
   
문제 378. SCOTT 만들었던 모든 SYNONYM  삭제하시오
 
 
 
    DROP PUBLIC SYNONYM DEPTOP-    DROP PUBLIC SYNONYM EMP500    ;
 
select synonym_name
  from user_synonyms;
 
drop public synonym
 
    1. NCS 시험 제출
      • 쪽지시험 ( 오픈 , 실습, 시간제한 )
      • SQL 포트폴리오
 
 
 1. 유저 엑세스 제어
 
    1. 1 목차
    1. 유저생성
    2. 패스워드 변경하는 방법
    3. 시스템 권한
    4. 객체 권한
    5.  사용법
 
 
 
 
SQL> alter user scott
  2  account unlock;
 
사용자가 변경되었습니다.
 
SQL> alter user scott
  2  identified by tiger;
 
사용자가 변경되었습니다.
 
SQL>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

'SQL 기본' 카테고리의 다른 글

엔터티란(Entity)  (0) 2022.10.06
10장 DDL문을 사용해서 테이블을 생성 및 관리  (0) 2017.09.07
9장 데이터 조작 언어 (DML문)  (0) 2017.09.07
8장 집합 연산자 사용  (0) 2017.09.07
7장 Subquery 사용  (0) 2017.09.07


 10. DDL문을 사용해서 테이블을 생성  관리
    • 10 목차
    • 데이터 베이스 오브젝트 5가지
    • 테이블 생성 방법
    • 데이터 타입
    • 제약조건
    • 서브쿼리를 사용해서 테이블 생성하는 방법
    • 테이블 삭제
 
 
10.1 데이터베이스 오브젝트 5가지
    • TABLE                        ----->  데이터를 저장하는 기본 저장 단위이고 행과 열로 구성
    • VIEW                          -----> 테이블을 바라보는 쿼리가 뷰이다
    • SEQUENCE                ------> 일련번호 생성기 ( 번호를 생성하는 DB 오브젝트)
    • SYNONYM                 ------> 테이블의  다른 이름
    • INDEX                        ------> 검색 속도를 향상시키기 위한 DB 오브젝트
 
 
10.2 테이블 생성 방법
CREATE TABLE EMP500
(         EMPNO NUMBER(10),
ENAME VARCHR2(10),
SAL          NUMBER(10),
HIREDATE DATE        );
 
 
 
 
문제292. emp500 테이브렝 데이터를 2 정도 입력하시오!
 
 
INSERT INTO EMP500 (EMPNO, ENAME, SAL, HIREDATE)
VALUES (2934,'임은총',4864,TO_DATE(SYSDATE,'RRRR-MM-DD'));
 
INSERT INTO EMP500 (EMPNO, ENAME, SAL, HIREDATE)
VALUES (2234,'김범수',4864,TO_DATE('1999-12-13','RRRR-MM-DD'));
 
INSERT INTO EMP500 (EMPNO, ENAME, SAL, HIREDATE)
VALUES (2921,'김서희',4800,TO_DATE('1989-11-21','RRRR-MM-DD'));
 
 
문제293. 여러분들의 데이터를 입력할  있도록 테이블을 생성하시오.
 
테이블명 : emp293
 
CREATE TABLE EMP293
(
EMPNO NUMBER(10),
ENAME VARCHAR2(10),
SAL  NUMBER(10),
birth date,
major varchar2(10),
address varchar2(30)
);
사원번호
사원이름
월급
생일
전공
주소
    • 테이블명이나 컬럼명을 지을  주의할 사항(p10-5)
    • 문자로 시작해야한다.
    • 30 이내여야 한다.
    • 알파벳 대문자, 소문자 , 숫자 ,특수문자(_, #, $)    있다.
    • 기존에 존재하는 똑같은 이름의 테이블명을   없다.
    • 오라클 예약어를 사용할  없다.
 
 : create table select ( empno...
 
 
 
    • 테이블 생성시 default 사용하는 방법 (p 10-9)
 
create table emp506
( ename varchar2(20),
sal number(10) default 2500 );
 
 
insert into emp506(ename)
values('jack');
 
문제294. 아래의 테이브릉ㄹ 생성하고 default 지정하시오!
 
테이블명 : emp294
 
컬럼 :            empno
ename
sal
hiredate              ------------------------> default  : 오늘날짜
job                        ------------------------> default  : SALESMAN
 
 
ALTER SESSION SET NLS_DATE_FORMAT='RR/MM/DD';
 
CREATE TABLE emp295
(
EMPNO NUMBER(10),
ENAME VARCHAR2(20),
SAL NUMBER(10),
HIREDATE DATE DEFAULT TO_CHAR(SYSDATE,'RR/MM/DD'),
JOB VARCHAR2(10) DEFAULT 'SALESMAN'
);
 
 
 
 
CREATE TABLE emp295
(
EMPNO NUMBER(10),
ENAME VARCHAR2(20),
SAL NUMBER(10),
HIREDATE DATE DEFAULT TRUNC(SYSDATE), --------------> 시분초 짤림!
JOB VARCHAR2(10) DEFAULT 'SALESMAN'
);
 
 
 
    • 내가 만든 테이블 리스트를 확인하는 방법.
SELECT * FROM USER_TABLES;
    • 테이블 생성 일자
SELECT object_name, created, last_ddl_time
from user_objects;
 
 
문제295. created last_ddl_time 서로 다른 테이블이 무엇인지 조회하시오!
 
SELECT object_name, created, last_ddl_time
from user_objects
where created != Last_ddl_time;
 
 
 
문제296. tic-tae-toe 학습데이터를 입력하기 위한 데이블을 생성하시오
 
create table ttt
(
t1 number(1),
t2 number(1),
t3 number(1),
 
t4 number(1),
t5 number(1),
t6 number(1),
 
t7 number(1),
t8 number(1),
t9 number(1),
result varchar(10)
);
 
문제297. 승리기보에서 2 나온 횟수  칸별로
select sum(decode(t1,1,1,0)) t1,
sum(decode(t2,1,1,0)) t2,
sum(decode(t3,1,1,0)) t3,
sum(decode(t4,1,1,0)) t4,
sum(decode(t5,1,1,0)) t5,
sum(decode(t6,1,1,0)) t6,
sum(decode(t7,1,1,0)) t7,
sum(decode(t8,1,1,0)) t8,
sum(decode(t9,1,1,0)) t9
from ttt
where result ='positive'
 
 
    • 데이터 타입 (유형)
       
 
문제298. 영국 옥스포드에서 영여의 거의 모든문장을 컴퓨터에 집어
 넣고 통계를 내보았더니 대략 100단어 정도가 영어 문장의 거의
 50% 차지하는 것을 확인햇다고 합니다.
내가 아는 단어들을 지금 대충 세어보다도 100개는 충분히 넘는데
왜나는 영어문장을 50% 이해 못하나 라고 질문을 하실 수도 있는데
여기에  다른 비밀이 숨어있습니다.
  100단어는 대부분 전치사 입니다. (: 애로우 잉글리쉬)
 
 
 
10.3 데이터 타입 (유형) (p 10-12)
    1. 문자형 : char, varchar2, long, clob, blob
     (2000) (4000)     (2G)    (4G) (4G)
    1. 숫자형 : number
    2. 날짜형 : date
 
내가 만듬 테이블
select table_name
  from user_tables
   where table_name like 'WINTER%';
 
 
 
문제299. 아래의 데이터를 입력하게끔 테이블을 생성하고 데이터를 입력하시오
create table tab
(
lyric varchar2(4000)
);
 
 
 
 
 char  varchar2 차이점
 
 
char                                  vs                                     varchar2
고정형                                                                 가변형
char(10)                                                                varchar(10)
M I R A C L E                                                        M I R A C L E                                
■■■■■■□□□                                      ■■■■■■(□□□) --> 남은 공간 회수
남은 공간 공백을 그대로 유지                    저장공간을 절약한다.
MIRACLE123이라고 업데이트하면             MIRACLE123이라고 업데이트하면
블락안에서 이동하지 않지만                      블락이 이동해요 -> 성능이 느려짐
 
 
 
CREATE TABLE EMP700
 
(ENAME VARCHAR2(10),
DEPTNO VARCHAR2(10) );
 
CREATE TABEL DEPT700
( DEPTNO CHAR(10),
LOC            CHAR(10)  );
 
INSERT INTO EMP700 VALUES('SCOTT','10');
INSERT INTO EMP700 VALUES('SMITH','20');
 
INSERT INTO DEPT700 VALUES('10','DALLAS');
INSERT INTO DEPT700 VALUES('20','CHICAGO');
COMMIT;
 
 
 
 
 
 
문제300. 아래와 같이 조인을 하면 결과가 출력될 것인가???
SELECT E.ENAME, D.LOC
FROM EMP700 E, DEPT700 D
WHERE E.DEPTNO = D.DEPTNO;
               VARCHAR2(2)     CHAR(10)
 
결과가  나온다 우리 VARCHAR 쓰자!!!!!!!!!!!!!!!
 
 
문제301.(오늘의 마지막 문제) 겨울왕국에서 가장 많이 나오는
단어와  건수를 출력하는 SQL 분석하고
내가 임의로 영화 스크립트를 구글에서 내려 받아서
테이블에 입력하고  중에 가장 많이 나오는 단어가
무엇인지
 
 
select aaa1,count(*) a
from (
select regexp_substr(lower(w_text), '[^ ]+',1,1) aaa1 from  winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,2) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,3) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,4) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,5) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,6) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,7) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,8) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,9) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,10) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,11) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,12) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,13) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,14) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,15) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,16) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,17) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,18) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,19) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,20) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,21) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,22) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,23) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,24) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,25) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,26) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,27) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,28) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,29) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,30) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,31) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,32) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,33) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,34) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,35) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,36) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,37) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,38) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,39) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,40) aaa1 from winter7
 
 
 )
 where aaa1 is not null
 group by aaa1
 order by a desc;
 
 
 
 
 
테이블을 따로 만들려면
 
 
create table winter
as
(
 
select regexp_substr(lower(w_text), '[^ ]+',1,1) aaa1 from  winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,2) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,3) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,4) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,5) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,6) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,7) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,8) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,9) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,10) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,11) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,12) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,13) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,14) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,15) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,16) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,17) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,18) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,19) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,20) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,21) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,22) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,23) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,24) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,25) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,26) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,27) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,28) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,29) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,30) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,31) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,32) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,33) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,34) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,35) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,36) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,37) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,38) aaa1 from winter7
   union all
 select regexp_substr(lower(w_text), '[^ ]+',1,39) aaa1 from winter7
    union all
 select regexp_substr(lower(w_text), '[^ ]+',1,40) aaa1 from winter7
)
 
 어제 배운 내용 복습
 
    1. DML 문장 ---> MERGE 
 
       DML   ---> INSERT,UPDATE,DELETE,MERGE,SELECT
         
              MERGE  ----> INSERT, UPDATE, DELETE  한번에 수행하는 명령어

 
    1. DDL 문장 ----> CREATE, ALTER, DROP, TRUNCATE, RENAME
        
테이블 생성 명령어
 
앞으로의 목표 파이썬을 이용한 머신러닝 프로그램 개발(틱테토)
SQL, Python, 하둡
     
Hive SQL
 
 
 
 10. DDL문을 사용해서 테이블을 생성  관리
    • 10 목차
    • 데이터 베이스 오브젝트 5가지
    • 테이블 생성 방법
    • 데이터 타입
    • 제약조건
    • 서브쿼리를 사용해서 테이블 생성하는 방법
    • 테이블 삭제
 
        
10.4. 제약조건
 
    • 제약( constraints) 이란?
" 데이터 품질을 높이기 위한 데이터베이스 오브젝트 "
 
데이터 정재 작업
 
중복돼서 데이터가 입력된다거나 필수항목에 null 입력한다거나
이메일을 입력할  @ 반드시 넣어야하는데 아무렇게나 입력했거나 하는 데이터들을
애초부터 입력되지 않게 해야한다.
 
    • 제약(constraints)  종류 ?
      1. primary key                      ---------> 중복된 data null 값을 입력 못하게
      2. unique                               ---------> 중복된 data 입력 못하게
      3. not null                              ---------> null 값이 입력되지 않게
      4. check                                  ---------> 지정된 data 외에는 다른 data 입력 되지 않게
      5. foreign key                        ----------> 참조하는 컬럼에 거는 제약
 
 
    • primary ket 제약을 이용해서 테이블 생성
 
create table emp40
( empno number(10) primary key,
 ename varchar2(10) );
 
insert into emp40 values( 1111, 'aaa');
insert into emp40 values( 1111, 'bbb');
 
insert into emp40 values(null, 'ddd');
 
 
문제305. 아래의 테이블을 생성하는데 ename  중복된 데이터가
입력되지 않도록 제약을 걸어서 생성하시오
(중복된 데이터만 입력 안되고 null 입력되게 하시오)
테이블명: emp305
 
컬럼명:       empno
ename
sal
create table emp305
( empno number(10),
ename varchar(10) unique,
sal number(10) );
 
    • 제약을 삭제하는 명령어
alter table emp305
drop constraint SYS_C007037;
                                   (
제약이름)
 
제약 삭제 하니  들어감
 
    • 제약 이름 확인하는 방법
select table_name,
constraint_name,
constraint_type
  from user_constraints                                        <---------------- 데이터 사전
 where table_name='EMP40';
                                             
        반드시 대문자로 입력해야한다.
 
 
 
문제306. emp40 테이블에 걸린 primary 제약을 삭제하시오.
alter table emp40
drop constraint SYS_C007036;
 
 
 
    • 제약이름을 주면서 제약을 거는 방법
create table emp45
( empno number(10) constraint emp45_empno_pk primary key,
ename varchar2(10) );                              
제약이름
 
테이블명_컬럼명_제약타입
 
select table_name, constraint_name
  from user_onstraints
where table_name= 'EMP45';
 
문제307. emp45 테이블에 empno 걸린 primary key 삭제하시오 !
 
 
select table_name, constraint_name
  from user_constraints
where table_name= 'EMP45';
   
   
    alter table emp45
    drop constraints emp45_empno_pk;
 
 
문제308. 아래의 테이블을 unique 제약과 함께 생성하시오
 
create table emp308
( empno number(10),
ename varchar(10) emp308_ename_unique unique,
sal number(10) );
 
문제309. 위에 308 테이블에 ename에 null은 중복입력이 될까?
 
된다
 
    • check 제약 ---> 지정된 data 외에는 다른 데이터는 입력 안되게 거는 제약
 
CREATE TABLE DEPT400
( DEPTNO NUMBER(10),
LOC VARCHAR2(20) CONSTRAINT DEPT400_LOC_CK
CHECK(LOC IN ('DALLAS','CHICAGO','BOSTON') ) );
 
문제310. 아래의 테이블을 생성하는데 CHECK제약을 걸어서 생성하시오
 
테이블명 : emp311
 
컬럼명 :      EMPNO
ENAME
SAL <------- 월급을 0 ~ 9000 사이의 값만 입력되게
 
 
 
 CREATE TABLE EMP311
( EMPNO NUMBER(10),
ENAME VARCHAR2(10),
SAL NUMBER(10) CONSTRAINT EMP311_SAL_CK
CHECK(SAL BETWEEN 0 AND 9000) );
 
 
문제311. 아래의 테이블을 생성하는데 이름에 성이 김씨, 이씨 최씨만
입력되게끔 CHECK제약을 걸어서 생성하시오
 
 
 CREATE TABLE EMP311
(
EMPNO NUMBER(10),
ENAME VARCHAR2(10)
 CONSTRAINTS EMP312_ENAME_CK
CHECK(ENAME LIKE IN ('%', '%', '%') );
 
문제312. 이름, 월급, 이메일 컬럼을 담는 테이블을 생성하는데
이메일에 @  반드시 포함되어야 이메일이 입력이   잇또록 CHECK 제약조건을 생성하시오
 
테이블명 : EMP313
컬럼명 : ENAME
SAL
EMAIL
 
 
 CREATE TABLE EMP313
(
ENAME VARCHAR2(10),
SAL NUMBER(10),
EMAIL VARCHAR2(20)  CONSTRAINTS EMP312_ENAME_CK
CHECK(EMAIL LIKE '%@%'));
 
 
문제313. 위의 문제를 다시 수행하는데 이번에는 이메일에 @ .  포함되어야지만 이메일이 입력   있도록
테이블을 생성하시오
 
 CREATE TABLE EMP313
(
ENAME VARCHAR2(10),
SAL NUMBER(10),
EMAIL VARCHAR2(20)  CONSTRAINTS EMP312_ENAME_CK CHECK(EMAIL LIKE '%@%.%'));
 
문제314.(점심시간문제) 아래의 테이블을 생성하는데
   전공이 컴퓨터 , 통계 학과는 입력되지 못하게 하시오!
 
 
 
테이블명 : EMP315
컬럼명 : ENAME
     MAJOR <-------- 컴퓨터, 통계 학과외에 다른 학과만 입력되게 하시오
 
 CREATE TABLE EMP315
(
ENAME VARCHAR2(10),
MAJOR  VARCHAR2(20)  CONSTRAINTS EMP315_MAJOR_CK
CHECK(EMAIL NOT LIKE '컴퓨터%' or EMAIL NOT LIKE '통계%'));
 
 
 
    • 제약(constraints)  종류 ?
      1. primary key                      ---------> 중복된 data null 값을 입력 못하게
      2. unique                               ---------> 중복된 data 입력 못하게
      3. not null                              ---------> null 값이 입력되지 않게
      4. check                                  ---------> 지정된 data 외에는 다른 data 입력 되지 않게
      5. foreign key                        ----------> 참조하는 컬럼에 거는 제약
 
 
 
 
 
    • foreign key 제약
 
 
 
    • dept 테이블에 deptno primary key 제약을 거는 방법
(이미 만들어진 테이블에 제약을 거는 방법)
 
alter table dept
add
constraint dept_deptno_pl primary key(deptno);
 
 
    • emp 테이블에deptno 에 foreign key 제약을 걸면서
dept 테이블에 deptno를 참조해라~
 
alter table emp
 ADD CONSTRAINT EMP_DEPTNO_FK FOREIGN KEY(DEPTNO)
 REFERENCES DEPT(DEPTNO);
 
 
 
EMP(자식) ------------------------------------------------------dept(부모)
 
 
 
insert into emp(empno, ename, sal, deptno)
values (1232,'scott',3400,30);
 
 
 
insert into emp(empno, ename, sal, deptno)
values (1235,'jones',3500,70);
 
 
 
    • 위와 같이 부모-자식관계를 설정하면
    • emp 테이블에 70번과 같은 부서테이블에 속하지 않은 부서번호를 입력하지 못하게 된다.
    • dept 테이블에 10,20,30,번을 삭제할   없게 된다.
결론적으로 데이터의 품질이 좋아지고
outer join 남발하지 않아도 된다.
 
select e.ename, d.loc
  from emp e, dept d
where e.deptno = d.deptno (+) ;
======================> 이렇게 조인하러가여!
크은 테이블 > 작은 테이블 조인하면 느려져여
 
부모자식관계를 걸어서 데이터 깨끗하게 !
 
문제315. dept테이블에서 10 번을 삭제해보세요
 
delete from emp
where deptno = 10;
안데여!
 
문제316. dept 테이블에서 40번을 삭제하면 삭제되겠는가?
 
 
delete from emp
where deptno = 40;
 
돼여 ! 자식이 없어여!
 
emp 테이블에 deptno 40번인 사원이 없어서 삭제가 된다.
 
문제317. 자식 테이블(emp) 걸린 foreign key 제약을 삭제 하세요
 
 
alter table emp
 drop CONSTRAINT EMP_DEPTNO_FK;
 
문제318. 부모 테이블(dept) 에 걸린 primary key 제약을 삭제하시오
 
alter table dept
drop constraint dept_deptno_pk;
 
 
  이미 생성된 테이브레 제약을 거는 방법
문제319. dept 테이블에 deptno  primary key 제약을 거시오 !
 
alter table dept
add constraint dept_deptno_pk primary key(deptno);
 
 
문제320. 우리반 테이블에 empno primary key 제약을 거세요
 
 alter table emp2
add constraint emp2_empno_pk primary key(empno);
 
문제321. 우리반 테이블에 ename unique 제약을 거세요
 
 alter table emp2
add constraint emp2_ename_un unique(empno);
 
문제322. emp 테이블에 월급에 check 제약을 거는데
월급이 0 ~ 9500 사이의 데이터만 입력 또는 수정되게 제약을 거시오
 
alter table emp
  add constraint emp_sal_ck   check(sal between 0 and 9500);
 
 문제323. 사원 테이블의 KING 월급을 9600으로 변경하시오
 
UPDATE EMP
SET SAL = 9600
WHERE ENAME = 'KING';
 
 
ORA-02290: check constraint (SCOTT.EMP_SAL_CK) violated
----------------------------------------------------
UPDATE EMP
SET SAL = 9600
WHERE ENAME = 'KING'
 
    • 제약을 중지시키는 방법
 ALTER TABLE EMP
DISABLE CONSTRAINT EMP_SAL_CK;
 
 
문제324. 기존에 들어잇던 데이터 중에 제약에 위반된 데이터가
있다 하더라도 무시하고 EMP_SAL_CK제약을 다시 활성화 시키시오
 
 
 ALTER TABLE EMP
ENABLE NOVALIDATE CONSTRAINT EMP_SAL_CK;
 
-> 기존에 들어있떤 데이터들에 대해서는 제약검사 안하고
앞으로 들어올 데이터들에 대해서만 제약검사 하겠다.
 
 
    • 제약을 활성화 시키는 방법
 ALTER TABLE EMP
ENABLE CONSTRAINT EMP_SAL_CK;
 
 
문제325. 우리반 테이블에 EMAIL 컬럼에 CHECK 제약을 거는데
@  .  들어가야 데이터가 입력   있도록 CHECK제약을 거시오
 
 
ALTER TABEL EMP2
ADD CONSTRAINT EMP2_EMAIL_EMP2  CHECK ( EMAIL LIKE '%@%.%');
 
 
 
 
 
10.5 서브쿼리를 사용해서 테이블 생성하는 방법
 
 
 
CREATE TABLE EMP_BACKUP
AS
SELECT *
FROM EMP;
 
SELECT * FROM EMP_BACKUP;
 
 
문제326. 부서번호, 부서번호별 토탈월급을 출력하는 쿼리의 결과를 테이블로 생성하시오 !
(테이블명 : emp326)
CREATE TABLE EMP326
AS
SELECT DEPTNO, SUM(SAL)
  FROM EMP
GROUP BY DEPTNO ;
 
 
문제327. 부서번호, 이름, 월급, 순위를 출력하는데
    순위가 부서번호 별로 각각 월급이 높은 순서대로 순위를 부여하시오.
 
 
SELECT DEPTNO, ENAME, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) RNK
FROM EMP;
 
 
 
문제328. 위의 결과에서 순위가 1등만 나오게 하시오
 
SELECT *
FROM (SELECT DEPTNO, ENAME, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) RNK
FROM EMP)
    WHERE RNK =1;
 
 
 
문제329. 아래의 쿼리의 결과를 테이블로 생성하시오 !
(테이블명 : emp 329)
 
CTAS :Create Table As Subquery 줄임!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
create table emp329
as
SELECT DEPTNO, ENAME, SAL, RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) RNK
FROM EMP
;
 
 
 
 
 
    • 오라클에 데이터를 삭제하는 명령어가 3가지가 있어요
 
 
 
DELETE
TRUNCATE
DROP
DATA
삭제
삭제
삭제
저장영역
유지
삭제
삭제
저장구조
유지
유지
삭제
ROLLBACK
가능
불가능
불가능
 
 
TRUNCATE DROP 순식간에 ~
 
INSERT INTO EMP
SELECT * FROM EMP_BACKUP;
 
 테이블을 읽기만 가능하도록 만드는 방법
 
 
ALTER TABLE EMP READ ONLY;
 
 
문제330. 다시 EMP 테이블을 읽기 쓰기가 가능하도록 변경하시오 !
 
ALTER TABLE EMP READ WRITE;
 
 

'SQL 기본' 카테고리의 다른 글

엔터티란(Entity)  (0) 2022.10.06
11장 . 기타 스키마 객체  (0) 2017.09.07
9장 데이터 조작 언어 (DML문)  (0) 2017.09.07
8장 집합 연산자 사용  (0) 2017.09.07
7장 Subquery 사용  (0) 2017.09.07

 
9. 데이터 조작 언어 (DML)
 
SQL 문의 종류
 
    1. QUERY    -> SELECT 문의 6가지 , 조인, 서브쿼리, 함수
    2. DML (Data Manipulation Language)   
 
  insert, update, delete, merge
 
    1. DDL (Data Definition Language)
 
 create, alter , drop , truncate, rename
 
    1. TCL (Transaction Control Language)
 
 commit, rollback, savepoint
 
    1. DLC (Data Control Language)
grant, revoke
 
 
    • 9 목차
    • insert
    • update
    • delete
    • merge
    • commit rollback
    • 읽기 일관성과 lock
    • select .. for update
 
 
 
9.1 insert
insert into emp( empno, ename, sal)
values (2914,'JACK',4000);
 
문제260. 아래의 DATA 입력하시오 !
 
사원번호 3282
사원이름 JANE
월급          4500
입사일      오늘날짜
부서번호 20
 
SELECT ENAME, HIREDATE
FROM EMP
WHERE HIREDATE = SYSDATE;
 
설명: 위에서 입력한 시분초와 현재의 시분초가 틀려서 데이터가 검색이 안되는것이다.
 
문제262. 위의 DATA ROLLBACK 하고 오늘 날짜를 다시 입력하는데
 시분초는 입력안되고 오늘 날짜만 입력되게 하시오!
 
 
 
insert into emp(empno, ename, sal, hiredate, deptno)
values (3282, 'JANE', 4500, TO_DATE('2017/03/07','RRRR/MM/DD'), 20);
 
 
문제263. 오늘 입사한 사원의 이름과 입사일을 출력하시오
 
select * from EMP
wheRE HIREDATE= to_DATE('2017/03/07', 'RRRR/MM/DD');
 
 
    • NULL 입력하는 방법
    • 명시적으로 입력하는 방법
      1. NULL
      2. ''
    • 암시적으로 입력하는 방법
INSERT INTO EMP(EMPNO, ENAME, SAL)
VALUES (2911, NULL, 3400);
 
 
 
INSERT INTO EMP(EMPNO, ENAME, SAL)
VALUES (2945, '', 3500);
 
 
 
INSERT INTO EMP(EMPNO, ENAME, SAL)
VALUES (3924, '     ', 3500);
 
 
 
문제264. 이름이 NULL 아닌 사원들의 이름과 월급을 출력하는데 공백문자도 안나오게 하시오
 
SELECT * FROM EMP
WHERE TRIM(ENAME) IS NOT NULL;
 
 
6.2  UPDATE
 
UPDATE EMP
SET SAL = 8000
WHERE ENAME = 'SCOTT';
 
문제265. 직업이 SALESMAN 사원들의 커미션을 5000으로 변경하시오
 
UPDATE EMP
SET COMM = 5000
WHERE JOB = 'SALESMAN';
 
 
문제266. 월급이 3000이상인 사원들의 부서번호를 30번으로 변경하시오
 
UPDATE EMP
SET DEPTNO = 30
WHERE SAL >= 3000;
 
 
 
9.3 delete 명령어
 
delete from emp
where ename='SCOTT';
 
문제267. 커미션이 null 사원들을 삭제 하시오
 
 
 delete from emp
where comm is null;
 
 
commit
    • 명시적 commit :
 commit 명령어를 직접 수행
 
    • 암시적 commit :
      1. 정상 종료
      2. DDL 명령어 수행 (CREATE TABLE)
      3. DCL 명령어 수행
but 비정상 종료 == rollback
 
 
서브쿼리를 사용한 DML
 
    • DELETE
 
 
 
문제268. SCOTT보다 많은 월급을 받는 사원들을 지우시오
 
DELETE FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE ENAME= 'SCOTT');
 
 
 
문제269. ALLEN보다 늦게 입사한 사원들을 삭제 하시오!
 
DELETE FROM EMP
WHERE HIREDATE > (SELECT HIREDATE
FROM EMP
WHERE ENAME = 'ALLEN');
 
 
 
 
문제270. JONES 보다 많은 월급을 받는 사원들의 직업을 SALESMAN으로 변경하시오
 
UPDATE  EMP
SET JOB='SALESMAN'
WHERE SAL > (SELECT SAL
FROM EMP
                WHERE ENAME='JONES');
 
문제271. JONES 보다 많은 월급을 받는 사원들의 직업을 KING 직업으로 변경하시오
 
UPDATE  EMP
SET JOB= (SELECT JOB
FROM EMP
                WHERE ENAME='KING');
WHERE SAL > (SELECT SAL
FROM EMP
                WHERE ENAME='JONES');
 
 
    • INSERT
CREATE TABLE EMP20
AS
SELECT *
FROM EMP2
WHERE 1=2;
====> 조건이 FALSE 이기때문에 DATA 가지고 오고 구조만 가져온다.
 
 
 
 
 
 
문제272. EMP2 테이블의 DATA를 EMP20테이블에 입력하시오
 
INSERT INTO EMP20
SELECT *
 FROM EMP2;
 
문제273. 아까 만들었던 DBLINK 이용해서 짝꿍의 EMP TABLE을 DB EMP7으로 생성하시오
create public database link dblink7
connect to scott
identified by tiger
using '192.168.19.26:1521/xe';
 
 
CREATE TABLE EMP7
AS SELECT * FROM EMP WHERE 1=2;
 
 
INSERT INTO EMP7
SELECT *
 FROM EMP@DBLINK7;
 
 
 
(오늘의 마지막 문제2)  아래의 결과를 출력하시오
 

select deptno ,decode(grouping(job)+grouping(deptno),1,'부서토탈:',2,'전체토탈:',job) job,sum(sal)                   
  from emp
group by rollup(deptno,job);
 
 
 
 
 
 
■어제 배웠던 내용
    • 집합 연산자
    • union all, union , intersect, minus
    • 레포팅 함수
ROLLUP , GROUPING SETS , GROUPING , CUBE
    • DML 문장
 INSERT,UPDATE,DELETE, MERGE
 
    • SUBQUERY 사용한 DML
 DELETE,UPDATE, INSERT
 
 
문제274. 부서번호가 30번인 사원들의 커미션을
WARD 커미션으로 변경하시오
 
UPDATE EMP
 SET COMM = (SELECT COMM
         FROM EMP
                WHERE ENAME = 'WARD')
 WHERE DEPTNO = 30;
 
문제275. EMP테이블에 SAL2라는 컬럼을 추가하시오.
 
ALTER TABLE EMP
ADD SAL2 NUMBER(10);
 
 
문제276. emp 테이블의 월급으로 SAL2 값을 갱신하시오
UPDATE EMP
SET SAL2 = SAL;
 
문제277. EMP테이블에 LOC컬럼을 추가하시오.
ALTER TABLE EMP
ADD LOC VARCHAR2(10);
 
문제278. EMP 테이블에 추가한 LOC컬럼의 데이터를 해당사원의
부서위치로 값을 갱신하시오 (MERGE문을 사용해야한다.)
    • MERGE : INSERT, UPDATE, DELETE 한번에 해버리겠다!
 
MERGE INTO EMP E
USING DEPT D
ON (D.DEPTNO = D.DEPTNO)
WHEN MATCHED THEN
UPDATE SET E.LOC = D.LOC;
속도가 아주 빨라요.
 
 
 
UPDATE EMP E
SET LOC = (SELECT LOC
FROM DETP D
WHERE E.DEPTNO = D.DEPTNO);
 
 
문제279. 이름과 부서위치와 부서번호를 출력하시오.
SELECT E.ENAME, D.DEPTNO, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
 
 
문제280. 사원테이블에 DNAME 컬럼을 추가하고 DEPT 테이블에 DNAME 컬럼 데이터로
값을 갱신하시오 (MERGE사용)
 
ALTER TABLE EMP
ADD DNAME VARCHAR2(10);
 
 
MERGE INTO EMP E
USING DEPT D
ON (D.DEPTNO = E.DEPTNO)
WHEN MATCHED THEN
UPDATE SET E.DNAME = D.DNAME;
 
ALTER TABLE EMP
DROP COLUMN LOC;
 
 
ALTER TABLE EMP
DROP COLUMN DNAME;
 
 
 
ALTER TABLE EMP
ADD GRADE NUMBER(10);
 
문제282. 사원이름, 월급, 급여등급(GRADE) 출력하시오 .
 
SELECT E.ENAME,E.SAL,S.GRADE
FROM EMP E, SALGRADE S
WHRER E.SAL BETWEEN S.LOSAL AND S.HISAL;
 
문제283. 방금 EMP 테이블에 추가한 GRADE 컬럼의 데이터를 해당 사원의 등급으로 값을 갱신하시오.
 
MERGE INTO EMP  E
USING SALGRADE S
ON ( E.SAL BETWEEN LOSAL AND HISAL)
WHEN MATCHED THEN
UPDATE SET E.GRADE = S.GRADE;
 
문제284. 다시EMP 테이블에 GRADE컬럼을 DROP 하시오
 
ALTER TABLE EMP
DROP COLUMN GRADE;
문제285. 부서번호, 부서번호별 토탈 월급을 출력하시오
 
SELECT DEPTNO , SUM(SAL)
FROM EMP
GROUP BY DEPTNO
 
문제286. 부서테이블에 SUMSAL이라는 컬럼을 추가하시오
 
ALTER TABLE DEPT
ADD SUMSAL NUMBER(10);
 
문제287. 지금 추가한 SUMSAL 컬럼에 값을 갱신하는데 해당 부서번호의 토탈 월급으로 값을
갱신하시오
 
 
MERGE INTO DEPT D
USING (SELECT DEPTNO , SUM(SAL) E
FROM EMP
GROUP BY DEPTNO) E
ON ( E.DEPTNO = D.DEPTNO)
WHEN MATCHED THEN
UPDATE SET D.SUMSAL = E.E;
 
GROUP 함수는 컬럼 별칭을 써야한다.
 
 
설명:  1.  USING 절에 테이블 명을 쓰지 않고 서브 쿼리를 사용한다.
            2.  SUM(SAL) 같은 그룹 함수를 USING 안에 사용했으면 컬럼 별칭을 사용해야한다.
 
 
 
문제288. 아래의 테이블을 생성하고 AVGAGE 컬럼의 값을 해당 통신사의
평균나이로 값을 생신하시오
 
CREATE TABLE TELECOM_AVG
(  TELECOM VARCHAR2(10),
AVGAGE NUMBER(10) ) ;
 
INSERT INTO TELECOM_AVG(TELECOM)
SELECT DISTINCT TELECOM
FROM EMP2;
 
 
MERGE INTO TELECOM_AVG A
USING (SELECT TELECOM, AVG(AGE) 평균나이
FROM EMP2
        GROUP BY TELECOM) T
ON ( T.TELECOM = A.TELECOM)
WHEN MATCHED THEN
UPDATE SET A.AVGAGE= T.평균나이;
 

    • 9 목차
    • insert
    • update
    • delete
    • merge
    • commit rollback
    • 읽기 일관성과 lock
    • select .. for update
 
9.6 읽기 일관성과 lock
 
    • 읽기 일관성이란?
 : 내가 접속한 세션에서 내가 변경한 데이터는 나만이 있고
다른 세션에서는 없다. 내가 커밋을 해야 다른 세션에서도
내가 변경한 데이터를 있다.
 
 
커밋해줘야 다른 세션에서도 변경된 게 보이지!
 
 
 
    • LOCK?
: 내가 변경한 데이터를 누군가가 변경하려고 하면 누군가는
LOCK 걸린다 (LOCK waiting 하는 상황이 발생한다)
 
 

01s P?-0042 OL> �̡� P?-0042 SQL> unknown un 0��n command command "CIS" "cl�� ��est �� lil estof lil SAL 0 ommit complete. 01_> UPDATE EMP 2 SET SAL = 7000 3 WHERE ENAME = vCOTT| , 7�� '/>
 
 
LOCK ROW() 단위로 걸린다.
 
 
 
문제289. 직업이 SALESMAN 사원들의 커미션을8000으로 수정하시오
 
UPDATE EMP
SET COMM = 8000
WHERE JOB = 'SALESMAN';
 
 
문제290. 위와 같은 상태에서 다른 DOS창에서 이름이 TURNER 사원의  월급을 8000으로 수정하면
수정이 되겠는가? 앙데여!
 
문제291.(점심시간문제)
개발 () , 운영(짝꿍) 상태에서
                                                                                                짝꿍
 
UPDATE EMP@DBLINK7
SET SAL = 0
WHERE ENAME='JONES';                              UPDATE EMP
SET SAL = 8000
WHERE ENAME='JONES';
 
 
 
9.7. SELECT .. FOR UPDATE
"LOCK SELECT 때는 LOCK 걸지 않는다 SELECT LOCK 거는 문장이 SELECT FOR UPDATE
 
 
 

==> 5 동안 LOCK 건다.
 
 
 
문제291. 9-46쪽을 보고 직업이 SALESMAN 사원들의 이름과 월급을 조회하는 쿼리문을 작성하는데
10 동안 조회하는 행에 락을 걸게 쿼리를 작성하시오
 
SELECT ENAME, SAL
  FROM EMP
WHERE JOB = 'SALESMAN'
FOR UPDATE 10;
 
 
 
 
 
 

'SQL 기본' 카테고리의 다른 글

11장 . 기타 스키마 객체  (0) 2017.09.07
10장 DDL문을 사용해서 테이블을 생성 및 관리  (0) 2017.09.07
8장 집합 연산자 사용  (0) 2017.09.07
7장 Subquery 사용  (0) 2017.09.07
6장 조인 문법  (0) 2017.09.07