본문 바로가기

IT&코딩/국비지원

SQL - 6 (View & Sequence & Index)

728x90
반응형

■ view를 시작하기 이전에

 

□ 테이블 삭제

 

DELETE FROM -- 자료를 삭제, recover가 가능

TRUNCATE TABLE tel77; -- 내용이 지워짐(구조는 남는다)
DESC tel77;
SELECT * FROM tel77; -- 아무것도 없음을 확인

DROP TABLE tel77;

 

SELECT * FROM TAB; -- BIN$...확인

FLASHBACK TABLE tel77 TO BEFORE DROP;
-- 휴지통에 있는 테이블을 살린 것

SELECT * FROM TAB;

-- 완전히 지우는 방법은?

DROP TABLE tel77 PURGE; -- 완전삭제
DROP TABLE tel77 CASCADE CONSTRAINTS;

 

□ Dictionary

 

SELECT * FROM DICTIONARY;

 

USER_ : 소유권이 사용자인 정보
ALL_ : 소유권자가 SYSTEM, 단 사용자가 접근은 가능함.
DBA_ : DBA 권한자만이 접근 
V$ : DBA, 현재 DB 상태정보

 

-- Q) employees 찾기

 

SELECT * FROM DICTIONARY
WHERE TABLE_NAME LIKE 'USER_%';

-- 너무 많은 데이터가 나온다.

 

DESC USER_OBJECTS;

 

-- 사용자가 OWNER인 TABLE 다 나와.

SELECT OBJECT_NAME FROM USER_OBJECTS 
WHERE OBJECT_TYPE = 'TABLE';

 

-- Q) employees 테이블의 제약조건을 조회 출력하시오.

 

DESC USER_CONSTRAINTS;
SELECT OWNER FROM USER_CONSTRAINTS
WHERE table_name = 'EMPLOYEES';

 

SELECT * FROM USER_CONSTRAINTS
WHERE table_name = 'EMPLOYEES';
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION, R_CONSTRAINT_NAME
FROM USER_CONSTRAINTS
WHERE table_name = 'EMPLOYEES';

 

 

-- P : PK / U : UNIQUE / C : CHECK / R : FK가 참조하는 제약조건 이름

 

-- 컬럼의 제약조건을 조회출력 (USER_CONS_COLUMNS)

 

SELECT * FROM USER_CONS_COLUMNS
WHERE TABLE_NAME = 'EMPLOYEES';

 

 

 

SELECT * 
FROM user_cons_columns
WHERE table_name = 'MEMTABLE2';

 

-- 컬럼 변경하기

 

CREATE TABLE modi_col(
id NUMBER(5),
name VARCHAR22(20),
ipsail DATE DEFAULT sysdate
);

 

 

-- 부서 칼럼을 추가
-- buseo varchar2(20)
-- 부서는 insa, jajae 부서만 입력

-- hint alter table 테이블명

-- add (컬럼을 추가, 추가하는 김에 제약조건도)

 

ALTER TABLE modi_col
ADD(buseo VARCHAR2(20)
CONSTRAINT modi_col_buseo_ck CHECK(buseo IN('insa','jajae')));
DESC modi_col;

 

-- name 컬럼을 irum으로 변경하시오

 

ALTER TABLE modi_col
RENAME COLUMN name TO irum;

 

-- irum 컬럼 삭제

 

ALTER TABLE modi_col
DROP COLUMN irum;

 

-- id컬럼을 7칸으로 늘리시오

 

ALTER TABLE modi_col
MODIFY(id NUMBER(7));

 

-- 제약조건을 추가/삭제하기

 

-- 컬럼의 제약조건을 조회출력 (user_cons_columns)

 

SELECT * FROM user_cons_columns
WHERE table_name = 'MODI_COL';
DESC modi_col;

 

-- 제약조건을 추가

 

ALTER TABLE modi_col
ADD CONSTRAINT modi_col_id_uk UNIQUE(id);

 

-- 제약조건을 삭제

 

ALTER TABLE modi_col
DROP CONSTRAINT modi_col_id_uk;

 

--  pk 삭제하는 데 관련된 fk 제약조건까지 삭제하고 싶을 때

 

ALTER TABLE modi_col
DROP PRIMARY KEY CASCADE;

 

-- NOT NULL 제약조건 추가하기

 

(참고) not null의 특징 : 테이블 레벨 방식 사용 x

 

ALTER TABLE modi_col
ADD CONSTRAINT modi_col_buseo_nn NOT NULL(buseo);
    
ALTER TABLE modi_col
MODIFY( buseo VARCHAR2(20)
CONSTRAINT modi_col_buseo_nn NOT NULL);

 

■ VIEW

 

□ RDB Object 종류

 

table, index, view, sequence

 

1) 테이블의 일부 추출개념
2) 테이블 내용 x, 문장 o
3) 보안효과

 

-- Q) 비상연락망을 위해 부서아이디가 100번인 사원의 이름과 전화번호만이 들어가는 table을 만드시오.

-- create subquery

 

ALTER TABLE CONSTRAINT DROP PRIMARY KEY CASCADE MODIFY
CREATE SELECT FROM WHERE
    
CREATE TABLE dept_100_table
AS SELECT first_name, phone_number
FROM employees
WHERE department_id = 100;
 
SELECT * FROM dept_100_table;
 
CREATE view dept_100_view
AS SELECT first_name, phone_number
FROM employees
WHERE department_id = 100;
    
SELECT * FROM dept_100_view;
    
SELECT * FROM DICTIONARY
WHERE TABLE_NAME LIKE 'U%'
ORDER BY 1;
    
DESC user_views;
    
SELECT view_name, TEXT
FROM user_views;

 

 

dept_100_view를 확인하고 그 옆의 text를 보니
"SELECT first_name, phone_number
FROM employees
WHERE department_id = 100"

 

-- Q) 100부서 아이디가 아닌 80번 부서 아이디로 내용변경을 원할 때

 

CREATE VIEW dept_100_view
AS SELECT first_name, phone_number
FROM employees
whWHEREere department_id = 80;

 

오류 보고 -
ORA-00955: 기존의 객체가 이름을 사용하고 있습니다.
00955. 00000 -  "name is already used by an existing object"

 

만일 수정도 하고 싶으면 처음부터 수정할수 있도록 만들어야 함

 

CREATE OR REPLACE VIEW dept_80_view
AS SELECT first_name, phone_number
FROM employees
WHERE department_id = 80;

 

-- Q) dept_80_view의 내용을 부서아이디 50으로 변경하고 싶을 때

 

CREATE or REPLACE VIEW dept_80_view
AS SELECT first_name, phone_number
FROM employees
WHERE department_id = 50;

 

 select * from dept_80_view;

-- 이름은 80번이지만 내용은 50번 부서가 들어감

 

-- WITH CHECK option

-- 조건문에 있는 칼럼은 view로 변경을 못하도록 하자

 

-- Q) manager_id가 121인 사원을 모두 출력하는 view를 작성하시오

 

SELECT *
FROM employees
WHERE manager_id = 121;
    
CREATE or replace view mana_121_view
AS SELECT *
FROM employees
where manager_id = 121;
    
SELECT * FROM mana_121_view;
UPDATE mana_121_view
SET manager_id = 150
WHERE manager_id = 130;

 

-- 이런 문제점을 아예 해결하려면

 

CREATE OR REPLACE VIEW mana2_121_view
AS SELECT *
FROM employees
WHERE manager_id = 121
WITH CHECK OPTION;
UPDATE mana2_121_view
SET manager_id = 150
WHERE manager_id = 130;

 

-- view를 수정하지 못하도록

 

CREATE or REPLACE VIEW mana2_122_view
AS SELECT *
FROM employees
WHERE manager_id = 122
WITH READ ONLY;
SELECT * FROM mana2_122_view;
UPDATE mana2_122_view
SET manager_id = 121
WHERE manager_id = 130;

 

■ SEQUENCE

 

- 일련번호

- 초기치, 목적치, 증가치

 

SELECT * FROM modi_col;
CREATE SEQUENCE sequence_이름;
CREATE SEQUENCE modi_col_seq;
SELECT modi_col_seq.NEXTVAL from dual;
SELECT modi_col_seq.CURRVAL from dual;
CREATE TABLE table211(
bun NUMBER(7),
sabun NUMBER(5)
);
CREATE SEQUENCE t211_seq;
   
INSERT INTO table211
VALUES(t211_seq.NEXTVAL, 12345);
-- values(1, 12345);
   
INSERT INTO table211
VALUES(t211_seq.NEXTVAL, 12347);
SELECT * FROM table211;

 

 

-- 10 11
CREATE SEQUENCE bunho
INCREMENT BY 5 -- 증가치
START WITH 10 -- 초기치
MAXVALUE 30000 -- 목적치
NOCYCLE
NOCACHE -- default 20

 

-- 게시판에서 일련번호, sql

 

NUM
3
2
1
SELECT MAXNUMnum)+1 FROM;

 

■ INDEX

 

-- 책의 목차와 비슷
-- 속도 유리 BUT 무조건 속도가 빠르진 않음

 

SELECT e.first_name 이름, e.salary 급여, d.department_name 부서명
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.salary > 2000;
   
CREATE INDEX idx_emp_sal ON employees(salary);
   
SELECT e.first_name 이름, e.salary 급여, d.department_name 부서명
FROM employees e , departments d
WHERE e.department_id = d.department_id
AND e.salary > 2000;
   
ALTER INDEX idx_emp_sal REBUILD;
728x90
반응형

'IT&코딩 > 국비지원' 카테고리의 다른 글

CSS - 1  (0) 2023.05.11
HTML - 3  (0) 2023.05.11
SQL - 5 (서브쿼리, 제약조건)  (0) 2023.05.07
HTML - 2  (0) 2023.05.03
HTML - 1 (웹이론)  (0) 2023.05.03