본문 바로가기

Developer/KH학원

subquery 수업정리_2021-02-05

---------------------------------------------------------
--create
---------------------------------------------------------
--subquery를 이용한 create는 not null제약조건을 제외한 모즘 제약조건, 기본값등을 제거한다

create table emp_bck
as
select * from employee;

select * from emp_bck;

select constraint_name,
        uc.table_name,
        ucc.column_name,
        uc.constraint_type,
        uc.search_condition
from user_constraints uc
    join user_cons_columns ucc
        using(constraint_name)
where uc.table_name ='emp_bck';

--기본값 확인
select * 
from user_tab_cols
where table_name = 'EMPLOYEE';

---------------------------------------------------------
--ALTER
---------------------------------------------------------
--table관련 alter문은 컬럼, 제약조건에 대해 수정이 가능
/*
서브명령어 
-add 컬럼, 제약조건 추가
-modify 컬럼 (자료형,기본값) 변경(제약조건 변경불가) 
-rename 컬럼명, 제약조건명 변경
-drop 컬럼 제약조건, 삭제

*/

create table tb_alter (
    no number
);

--add컬럼
--맨 마지막 컬럼으로 추가 
alter table tb_alter add name varchar2(100) not null;

describe tb_alter;

--add 제약조건
--not null제약조건은 추가가 아닌 수정(modify)으로 처리 
alter table tb_alter
add constraints pk_tb_alter_no primary key(no);


select constraint_name,
        uc.table_name,
        ucc.column_name,
        uc.constraint_type,
        uc.search_condition
from user_constraints uc
    join user_cons_columns ucc
        using(constraint_name)
where uc.table_name ='tb_alter';

--modify컬럼
--자료형, 기본값, null여부 변경가능
--문자열에서 호환가능타입으로 변경가능(char ---varchar2)

alter table tb_alter
modify name varchar2(500) default '홍길동' null;

desc tb_alter;

--행이 있다면, 변경하는데 제한이 있다.
--존재하는 값보다는 작은 크기로 변경불가.
--null값이 있는 컬럼을 not null로 변경불가.

--modify 제약조건은 불가능
--제약조건은 이름변경외에 변경불가 

--rename 컬럼
alter table tb_alter
rename column no to num;

desc tb_alter;

alter table tb_alter
rename consttaint PK_TB_ALTER_NO to pk_tb_alter_num;

--drop 컬럼
desc tb_alter_new;

alter table tb_alter
drop column name;

--drop 제약조건
alter table tb_alter
drop constraint pk_tb_alter_num;

--테이블 이름변경
alter table tb_alter
rename to tb_alter_new

rename tb_alter_new to tb_alter2;

select * from tb_alter2

---------------------------------------------------------
--DROP
---------------------------------------------------------
--데이터베이스 객체(table, user, view등 )삭제
drop table tb_alter2;

---------------------------------------------------------
--DCL
---------------------------------------------------------
--Date Control Language
--권한 부여/회수 관련 명령어 : grant /revoke
--TCL Transaction Control Language를 포함한다. -commit/ rollback / savepoint

--****관리자계정 시작 

--qwerty계정 생성 --system 관리자 계정으로 진행 
create user qwerty
identified by qwerty
default tablespace users;

--접속 권한 부여
--create session권한 또는 connect롤을 부여 
grant connect to qwerty;
grant create session to qwerty;

--객체 생성권한 부여
--create table, create index...권한을 일일이 부여
grant resource to qwerty;

--****관리자계정 끝

--권한, 롤을 조회
select *
from user_sys_privs; --권한

select*
from user_role_privs; --롤

select*
from role_sys_privs; --부여받은 롤에 포함된 권한

--커피테이블 생성 
create table tb_coffee(
    cname varchar2(100),
    price number,
    brand varchar2(100),
    constraint pk_tb_coffee_cname primary key(cname)
);

insert into tb_coffee
values('maxim', 2000, '동서식품');

insert into tb_coffee
values('kanu', 3000, '동서식품');

insert into tb_coffee
values('nescafe', 2500, '네슬레');

select * from tb_coffee;
commit;

--qwerty 계정에게 열람 권한 부여
grant select on tb_coffee to qwerty;

--수정권한 부여 
grant insert, update, delete on tb_coffee to qwerty;

--수정권한 회수 
revoke insert, update, delete on tb_coffee from qwerty;
revoke select on tb_coffee from qwerty;

--SQL 정리 
--DML : insert, update,delete select (자동커밋 안됌)
--DDL : create, alter, drop, truncate
--DCL : grant, revoke  --TCL : commit, rollback 


---------------------------------------------------------
--DATABASE OBJECT1
---------------------------------------------------------
--DB의 효율적으로 관리하고, 작동하게 하는 단위 
select distinct object_type
from all_objects;

---------------------------------------------------------
--DATA DICTIONARY
---------------------------------------------------------
--일반사용자 관리자로부터 열람권한을 얻어 사용하는 정보조회테이블
--읽기전용
--객체 관련 작업을 하면 자동으로 그 내용이 반영

--1.user_xxx : 사용자가 소유한 객체에 대한 정보
--2.all_xxx : user_xxx를 포함. 다른사용자로부터 사용권한을 부여받은 객체에 대한정보
--3.dba_xxx : 관리자전용. 모든 사용자의 모든 객체에 대한 정보

--이용가능한 모든 dd조회
select*from dict; --dictionary

---------------------------------------------------------
--user_xxx
---------------------------------------------------------
---xxx는 객체이름 복수형을 사용한다.

--user_tables

select*from user_tables;
select*from tabs;

--user_sys_privs:권한
--user_role_privs:롤(권한묶음)
--roll_sys_privs: 사용자가 가진 롤에 포함된 모든 권한 

select*from user_sys_privs;
select*from user_role_privs;
select*from role_sys_privs;

--user_sequences
select * from user_sequences;
--user_views
select*from user_views;
--user_indexes
select*from user_indexes;
--user_constraints
select*from user_constraints;

---------------------------------------------------------
--all_xxx
---------------------------------------------------------
--현재계정이 소유하거나 사용권한을 보여받은 객체 조회
--all_tables
select*from all_tables;

--all_indexes
select*from all_indexes;

---------------------------------------------------------
--dba_xxx
---------------------------------------------------------
select*from dba_tables;--ORA-00942: table or view does not exist일반사용자 금지

--특정사용자의 테이블 조회 
select*
from dba_tables
where owner in ('KH','QWERTY');

--특정사용자의 권한 조회
select *
from dba_sys_privs
where grantee = 'KH';

select *
from dba_role_privs
where grantee = 'KH';

--테이블 관련 권한 확인
select*
from dba_tab_privs
where owner = 'KH';

--관리자가 kh.tb_coffee 읽기 권한을 qwerty에게 부여
grant select, insert, update, delete on kh.tb_coffee to qwerty;

---------------------------------------------------------
--STORED VIEW
---------------------------------------------------------
--저장뷰.
--inlineview는 일회성이었지만, 이를 객체로 저장해서 재사용이 가능.
--가상테이블처럼 사용하지만, 실제로 데이터를 가지고 있는 것은 아니다.
--실제 테이블과 링크개념.

--뷰객체를 이용해서 제한적인 데이터만 다른 사용자에게 제공하는것이 가능하다.

create view view_emp
as
select emp_id,
        emp_name,
        substr(emp_no, 1, 8) || '******' emp_no,
        email,
        phone
from employee;

--테이블처럼 사용
select * from view_emp;

select*
from (
    select emp_id,
        emp_name,
        substr(emp_no, 1, 8) || '******' emp_no,
        email,
        phone
    from employee
);

---dd에서 조회
select * from user_views

--타사용자에게 선별적인 데이터를 제공
grant select on kh.view_emp to qwerty;

--view특징
--1.실제 컬럼뿐 아니라 가공된 컬럼 사용가능
--2. join을 사용하는 view가능
--3. or replae 옵션 사용가능
--4. with readonly 옵션 

create or replace view view_emp
as
select emp_id,
        emp_name,
        substr(emp_no, 1, 8) || '******' emp_no,
        email,
        phone,
        nvl(dept_title,'인턴') dept_title
from employee E
    left join department D
        on E.dep_code = D.dept_id
with read only;

--성별, 나이등 복잡한 연산이 필요한 컬럼을 미리 view지정해두면 편리하다.
create or replace view view_employee_all
as
select E.*,
        decode(substr(emp_no,, 8,1), '1','남','3','남','여')gender
from employee E;

select*
from view_employee_all
where gender='여';

--===============================
--sequence 
--===============================
--정수값을 순차적으로 자동생성하는 객체, 채번기 
/*
create sequence 시퀀스명

start with 시작값-------------------기본값1
increment by 증가값-----------------기본값1
maxvalue최대값 | nomaxvalue---------기본값은nomaxvalue. 최대값에 도달하면, 다시 시작값(cycle)혹은 에러유발(nocycle) 
                                    최대값에 도달하면, 다시 시작값(cycle) 혹은 에러유발 (nocycle)
minvalue최소값 | nominvalue---------기본값은nomaxvalue
                                    최소값에 도달하면, 시작값(cycle) 혹은 에러유발 (nocycle)
cycle | nocycle--------------------순환여부, 기본값 nocycle
chche 캐싱개수 | nocache------------기본값 cache20. 시퀀스객체로 부터 20개씩 가져와서 메모리에 채번.
                                    오류가 발생하여, 숫자를 건너뛸수 있다.

*/

create table tb_names (
    no number,
    name varchar2(100) not null,
    constraints pk_tb_names_no primary key(no)
);

create sequence seq_tb_names_no
start with 1000
increment by 1
nomaxvalue
nominvalue
nocycle
cache 20;

insert into tb_names
values(seq_tb_names_no.nextval,'홍길동');

select * from tb_names;

select seq_tb_names_no.nextval
from dual;

--DD에서 조회
select*from user_sequences;

--복합문자열에 시퀀스 사용하기
--주문번호 kh-20210205-1001

create table tb_order(
    order_id varchar2(50),
    cnt number,
    constraints pk_tb_order_id primary key(order_id)
);

create sequence seq_order_id;


insert into tb_order
values('kh-' || to_char(sysdate, 'yyyymmdd')||'-'||to_char(seq_order_id.nextval,'FM0000'),100);

select * from tb_order;

--alter문을 통해 시작값 start with값은 절대 변경할 수 없다. 
--그때 시퀀스객체 삭제후 재생성할 것.

alter sequence seq_order_id increment by 10;

--===============================
--INDEX
--===============================
--색인 
--SQL문 처리속도 향상을 위해 컬럼에 대해 생성하는 객체
--key:컬럼값, value:레코드 논리적 주소값 rowid
--저장하는 데이터에 대한 별도의 공간이 필요.

--장점 : 
--검색속도가 빨라지고, 시스템 부하를 줄여서 성능향상 

--단점 :
--인덱스를 위한 추가저장공간이 필요
--인덱스를 생성/수정하는데 별도의 시간이 소요됨 

--단순조회 업무보다 변경작업(insert/update/delete)가 많다면 index생성을 주의해야한다 

--인덱스로 사용하면 좋은 컬럼
--1.선택도 selectivity가 좋은 컬럼. 중복데이터가 적은컬럼 
--id | 주민번호 | email | 전화번호 > 이름 > 부서코드 >>>>>>> 성별 
--pk | uq제약조건이 사용된 컬럼은 자동으로 인덱스를 생성함 
--삭제하려면 제약조건을 삭제해야함.

--2.where절에 자주 사용되어지는 경우, join 기준컬럼인 경우 
--3.입력된 데이터의 변경이 적은컬럼.

select *
from user_indexes;

--job_code 인덱스가 없는 컬럼
select*
from employee
where job_code = 'J5'; --table full scan 

--emp_id 인덱스가 있는 컬럼
select * 
from employee
where emp_id='201';

--emp_name 조회
select *
from employee
where emp_name ='송종기';

--emp_name컬럼으로 인덱스 생성
create index idx_employee_emp_name
on employee(emp_name);

'Developer > KH학원' 카테고리의 다른 글

Final team Project 진행과정 (05/20)  (0) 2021.05.20
Final team Project 진행과정 (05/18)  (0) 2021.05.18
constraint 수업정리_2021-02-04  (0) 2021.02.04
sub-query수업정리_2021-02-02  (0) 2021.02.02
union 수업정리_2021-02-01  (0) 2021.02.01