본문 바로가기

배운 책들 정리/오라클로 배우는 데이터베이스 입문

0207 오라클 DB 입문 - 데이터 정의어, 객체 종류, 제약 조건

1. 데이터 정의어

1) ALTER

--테이블 변경
--사원정보 테이블 복사
CREATE TABLE EMP_ALTER
AS SELECT * FROM EMP;
SELECT * FROM EMP_ALTER;
--테이블 열 추가 
ALTER TABLE EMP_ALTER
ADD HP VARCHAR2(20);
SELECT * FROM EMP_ALTER;
--테이블 열 이름 변경
ALTER TABLE EMP_ALTER
RENAME COLUMN HP TO TEL;
SELECT * FROM EMP_ALTER;
--테이블 열의 데이터 타입 변경
ALTER TABLE EMP_ALTER
MODIFY EMPNO NUMBER(5);
DESC EMP_ALTER;

 

일반적인 결과 값
HP라는 열을 ALTER를 통해 추가한 결과 값
RENAME COLUMN HP TO TEL;를 통해 이름이 변경된 모습
DATA TYPE이 변경된 모습 N(4)에서 N(5)로
TEL이 삭제된 모습

2) RENAME _ 이름 변경

--테이블 이름 변경
RENAME EMP_ALTER TO EMP_RENAME;
DESC EMP_ALTER;
SELECT * FROM EMP_ALTER;
DESC EMP_RENAME;
SELECT * FROM EMP_RENAME;

RENAME으로 바뀌었기 때문에 찾을 수 없는 테이블

3) 테이블 비우기

--테이블 비우기(행 = 데이터 삭제) (DDL임 - 자동 커밋이 되는)
TRUNCATE TABLE EMP_RENAME;
SELECT * FROM EMP_RENAME;
--이 결과는 DELETE 문으로 가능하지만, 자동 COMMIT 이 되지 않음 (DML임 - 커밋을 해줘야 하는)
--테이블 삭제
SELECT * FROM EMP_RENAME;
DROP TABLE EMP_RENAME;
DESC EMP_RENAME;
SELECT * FROM EMP_RENAME;

테이블이 비워진 모습

2. 객체 종류 - 데이터 사전

0) 정의

- 데이터 사전

* 사용자 테이블 : 사용자가 데이터를 저장하기 위해 만든 테이블 (여태 봤던건 다 사용자 테이블)

* 시스템 테이블 : 테이블, 인덱스 및 저장 프로시저에 대한 정보와 같은 데이터베이스에 대한 메타데이터를 저장하기 위해 데이터베이스 관리 시스템(DBMS)에서 만들고 유지 관리하는 테이블

1) 사전 탐색 기능

--객체 종류
--데이터 사전
--현재 계정에서 사용 가능한 데이터 사전 보기(결과는 둘다 같음)
SELECT * FROM DICT;
SELECT * FROM DICTIONARY;

사전을 사용한 결과 창

2) 현재 소유자의 테이블 보기

--현재 계정 사용자가 소유한 객체(테이블)보기 // scott이 소유하고 있는 테이블 (실습한 테이블)
SELECT TABLE_NAME FROM USER_TABLES;

유저 테이블을 볼 수 있는 실행창

3) 모든 사용자의 테이블 보기

--모든 사용자가 소유한 객체(테이블) 보기
SELECT OWNER, TABLE_NAME FROM ALL_TABLES;

사용자가 소유한 객체 테이블 (사용자 명도 적혀 있는)

4) 시스템 사용자의 테이블 보기

--데이터 베이스 관리 권한을 가진 사용자만 볼 수 있음 
SELECT * FROM DBA_TABLES;
--이를 해결하기 위해 시스템 계정으로 들어가야 함

connect를 클릭해서 system / oracle로 입력해서 들어오기
system@oracle로 계정이 변경된 모습
시스템 계정(관리자)에서 테이블이 열린 모습

5) SCOTT 계정 사용자 정보 보기

--SCOTT 계정 사용자 정보 보기
SELECT * FROM DBA_USERS
WHERE USERNAME = 'SCOTT';

--존재하는데 존재하지 않는다고 뜨는 이유 
--보안 문제 때문, 있는지 없는지 자체를 모르게 해야 안전함
--존재하지만 권한이 없다고 뜨면 존재한다는 추가적 정보를 주게 됨
--로그인 아이디, 비밀번호가 대표적 케이스

보안성 때문에 보이지 않는다. (해커한테 정보를 더 주는 개념이기 때문에)

2-1. 객체 종류 - INDEX

1) INDEX 정보 보기

--인덱스
--SCOTT 계정으로 보기
--인덱스 정보 보기
SELECT * FROM USER_INDEXES;

인덱스 정보 보기

--인덱스 열 정보 보기
SELECT * FROM USER_IND_COLUMNS;

인덱스 열 정보 보기

2) INDEX 생성후 정보 보기

--인덱스 생성
CREATE INDEX IDX_EMP_SAL
ON EMP(SAL);
--생성된 인덱스 보기
SELECT * FROM USER_IND_COLUMNS;
--

IDX_EMP_SAL이라고 추가된 모습

3) INDEX 삭제

--인덱스 삭제
DROP INDEX IDX_EMP_SAL;
SELECT * FROM USER_IND_COLUMNS;

USER_IND_COLUMNS가 삭제된 모습

2-2. 객체 종류 - 뷰

0) 정의

* 뷰의 뜻 : SELECT 조회한 결과를 저장한 객체 (테이블처럼 데이터를 물리적으로 저장하지 않음)

* 사용목적

- 편리성 : 뷰로 저장해놓으면 메인 쿼리에 집중 가능 (실무 SELECT문은 복잡하고 길어서)

- 보안성 : 뷰 열람 권한을 제공하는 것이 불필요한 데이터 노출을 막음

 

1) 뷰 생성 권한 부여

--뷰
--테이블처럼 사용하는 뷰
--뷰 사용 목적 : 편리성, 보안성
--SCOTT계정에게 뷰 생성 권한 부여 (SQLPLUS에서 SYSTEM계정으로)
GRANT CREATE VIEW TO SCOTT;

cmd -> sqlplus (system/oracle로 로그인) -> 권한 부여

2) TOAD에서 SCOTT 계정으로 뷰 생성

--토드에서 scott 계정으로 뷰 생성
CREATE VIEW VW_EMP20
AS (SELECT EMPNO,ENAME,JOB,DEPTNO
FROM EMP
WHERE DEPTNO = 20);
SELECT * FROM VW_EMP20;

뷰가 생성된 모습

3) 뷰 생성 확인

 

--뷰 생성 확인
SELECT * FROM USER_VIEWS;

구문 입력 후 TEXT 내용 부분을 더블 클릭

* SQL PLUS에서 확인

--뷰 생성 확인 (SQLPLUS에서 SCOTT계정으로)
sqlplus scott/tiger
SELECT VIEW_NAME, TEXT_LENGTH, TEXT FROM USER_VIEWS;

해당 구문을 각각 입력한 결과 (SQLPLUS에서는 SELECT문을 확인할 수 있음)

* TOAD에서 뷰 확인

--생성한 뷰 보기 
SELECT * FROM VW_EMP20;

4) 뷰 삭제

--뷰 삭제
DROP VIEW VW_EMP20;
--삭제된 뷰 확인
SELECT * FROM USER_VIEWS;
--삭제된 뷰 보기
SELECT * FROM VW_EMP20;

뷰가 삭제된 모습 (데이터 사전에서 사라짐)
삭제된 뷰 보기

5) ROWNUM - 최상위 보기

--뷰를 이용하여 최상위 보기
--데이터 순으로 보여짐
SELECT ROWNUM, E.*
FROM EMP E;
--급여 내림차순으로 보여짐
SELECT ROWNUM,E.*
FROM EMP E
ORDER BY SAL DESC;
--ROWNUM은 테이블에 있는 열이 아닌 가상의 열
--아직 ROWNUM은 랭킹을 매기는 시스템이 없음

데이터 순 조회
급여 순 조회

6) 인라인뷰

* 서브쿼리 이용

--급여 내림차순으로 정렬된 뷰
--인라인뷰(서브쿼리 이용)

SELECT ROWNUM, E.*
  FROM (  SELECT *
            FROM EMP E
        ORDER BY SAL DESC) E;

SAL에 비례헤 등수가 매겨진 결과 값.

* WITH절 이용

--인라인뷰(WITH절 이용)

WITH
    E
    AS
        (  SELECT *
             FROM EMP E
         ORDER BY SAL DESC)
SELECT ROWNUM, E.*
  FROM E;

결과 값은 같음

* 급여 1~3등 뽑기

--  1~3등
  SELECT ROWNUM, E.*
  FROM (  SELECT *
            FROM EMP E
            WHERE ROWNUM <= 3
        ORDER BY SAL DESC) E;

 

2-3. 객체 종류 - 시퀀스

 

 

1) 열만 복사한 테이블 만들기

--시퀀스 = 연속 숫자를 생성하는 객체
--부서 정보 테이블의 열만 복사한 테이블 만들기
CREATE TABLE DEPT_SEQUENCE
AS SELECT * FROM DEPT WHERE 1 !=1;
SELECT * FROM DEPT_SEQUENCE;

열만 복사된 상황

2) 시퀀스 생성 및 확인

--시퀀스 생성
CREATE SEQUENCE SEQ_DPET_SEQUENCE
INCREMENT BY 10
START WITH 10
MAXVALUE 90
MINVALUE 0
NOCYCLE 
CACHE 2
ORDER;
--시퀀스 확인
SELECT * FROM USER_SEQUENCES;

 

 

3) 시퀀스 생성 번호 사용해 데이터 추가

--시퀀스에서 생성한 번호 사용하여 데이터 추가
--SEQ_DEPT_SEQUENCE.NEXTVAL : 다음 번호 생성
INSERT INTO DEPT_SEQUENCE (DEPTNO,DNAME,LOC)
VALUES (SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE','SEOUL');
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;
--SEQ_DEPT_SEQUENCE.CURRVAL: 현재 번호 = 마지막으로 생성된 번호
SELECT SEQ_DEPT_SEQUENCE.CURRVAL
FROM DUAL;

현재 번호

4) 시퀀스 7번 실행하기

--실행만 7번
INSERT INTO DEPT_SEQUENCE (DEPTNO,DNAME,LOC)
VALUES (SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE','SEOUL');
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;
--1번 더 실행하면 에러, 이미 최대값 도달했기 때문

* while문 이용 시

--while문을 통한 실행 (AI)
DECLARE
   i INTEGER := 1;
BEGIN
   WHILE i <= 7 LOOP
      INSERT INTO DEPT_SEQUENCE (DEPTNO, DNAME, LOC)
      VALUES (SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE', 'SEOUL');
      i := i + 1;
   END LOOP;
END;
/
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;

7번 실행 시
7번 초과 실행 시

5) 시퀀스 수정하기

--시퀀스 수정
ALTER SEQUENCE SEQ_DEPT_SEQUENCE
INCREMENT BY 3
MAXVALUE 99
CYCLE;
--시퀀스 확인
SELECT * FROM USER_SEQUENCES;

시퀀스 수정 결과 값 확인

--수정한 시퀀스 이용하여 데이터 추가
INSERT INTO DEPT_SEQUENCE (DEPTNO,DNAME,LOC)
VALUES (SEQ_DEPT_SEQUENCE.NEXTVAL, 'DATABASE','SEOUL');
SELECT * FROM DEPT_SEQUENCE ORDER BY DEPTNO;
--3번만 반복 실행
--최대값 도달, 다시 2번만 반복 실행
--CYCLE로 설정하였기 떄문에 시작번호(최소값)으로 돌아감
--
--시퀀스 삭제
DROP SEQUENCE SEQ_DEPT_SEQUENCE;
--삭제한 시퀀스 확인
SELECT * FROM USER_SEQUENCES;

 

해당 결과 값이 나옴.

2-3. 객체 종류 - 동의어

0) 정의

 

1) 권한부여

--동의어 SYNONYM
--동의어 = 공식적 별칭 = 일회성이 아님
--SELECT 나 FROM 절에서 사용하는 열이나 테이블의 별칭과 다름 = 일회성
--SQLPLUS 에서 SYSTEM/ORACLE로 로그인
--SCOTT계정에게 동의어 생성 권한 부여 (PUBLIC도 포함)
GRANT CREATE SYNONYM TO SCOTT ;
GRANT CREATE PUBLIC SYNONYM TO SCOTT;

CMD에서 권한 부여

2) 동의어 생성 및 확인 그리고 삭제

--토드에서 SCOTT 계정으로 실행
CREATE SYNONYM E FOR EMP;
--동의어 사용
SELECT * FROM E;
--동의어 삭제
DROP SYNONYM E;
--삭제된 동의어 확인
SELECT * FROM E;
SELECT * FROM EMP;

생성

3. 제약 조건

0) 정의

* 무결성의 종류

- 영역 무결성 (열) : 값의 적절함

- 개체 무결성 (행) : 기본키

- 참조 무결성 : 외래키

* 제약조건

NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT

 

1) 제약조건

--제약조건
--빈값 허용하지 않음 = NOT NULL
CREATE TABLE TABLE_NOTNULL(
LOGIN_ID VARCHAR2(20) NOT NULL,
LOGIN_PWD VARCHAR2(20) NOT NULL,
TEL VARCHAR2(20)
);
SELECT * FROM TABLE_NOTNULL;
DESC TABLE_NOTNULL;

열 이름 추가
NULL값을 넣을 수 없는

2) NULL 값의 추가 

--빈 값 추가 안됨 (제약조건에 어긋남)
INSERT INTO TABLE_NOTNULL (LOGIN_ID, LOGIN_PWD, TEL)
VALUES ('TEST_ID_01',NULL,'010-1234-5678');
SELECT * FROM TABLE_NOTNULL;
--빈 값 추가 됨 (제약 조건이 없음)
INSERT INTO TABLE_NOTNULL (LOGIN_ID, LOGIN_PWD)
VALUES ('TEST_ID_01', '1234');
SELECT * FROM TABLE_NOTNULL;
--빈 값으로 변경 안됨(제약조건에 어긋남)
UPDATE TABLE_NOTNULL
SET LOGIN_PWD = NULL
WHERE LOGIN_ID = 'TEST_ID_01';

제약 조건 있는데는 안 들어감.
제약 조건이 없는데는 값이 들어감
비밀번호는 NOT NULL이라서 NULL 적용이 안됨.

3) 제약조건 확인

--제약조건 확인
--C: CHECK / NOT NULL, U: UNIQUE, P: PRIMARY, R: REFERENCE
SELECT * FROM USER_CONSTRAINTS;
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TALBE_NAME
FROM USER_CONSTRAINTS;

4) 제약조건 이름 지정

--제약조건 이름 지정
CREATE TABLE TABLE_NOTNULL2(
LOGIN_ID VARCHAR2(20) CONSTRAINT TBLNN2_LGNID_NN NOT NULL,
LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLNN2_LGNPW_NN NOT NULL,
TEL VARCHAR2(20));

--제약조건 확인
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;

TBLNN2으로 변경된 모습

5) 제약조건 추가 안 됨 (빈 값이 있음)

--제약조건 추가 안 됨 (빈 값이 있음)
ALTER TABLE TABLE_NOTNULL
MODIFY (TEL NOT NULL);
DESC TABLE_NOTNULL;
SELECT * FROM TABLE_NOTNULL;

설정 불가한 모습

6) 빈 값을 전화번호로 변경 // 전화번호도 NULL값 불가

--빈 값을 전화번호로 변경
UPDATE TABLE_NOTNULL
SET TEL = '010-1234-5678'
WHERE LOGIN_ID = 'TEST_ID_01';
SELECT * FROM TABLE_NOTNULL;
--
ALTER TABLE TABLE_NOTNULL
MODIFY (TEL NOT NULL);
DESC TABLE_NOTNULL;
SELECT * FROM TABLE_NOTNULL;

제약 조건이 풀린 모습

7) 제약조건 확인, 이름 지정, 확인 (정리)

--제약조건 확인
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;
--제약조건 이름 지정해서 추가
ALTER TABLE TABLE_NOTNULL2
MODIFY(TEL CONSTRAINT TBLNN_TEL_NN NOT NULL);
--제약조건 확인
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM USER_CONSTRAINTS;
DESC TABLE_NOTNULL2;

제약조건 확인 과정
변경된 모습
TEL 값이 NULL로 변경된 모습

 

 


1. DDL은 자동 커밋, DML은 자동 커밋이 안 됨.

2. 데이터 테이블은 복수형이라는게 공통점임. (데이터 뷰 조회시 마지막에 S를 입력해 복수형으로 조회)

3. 기본키 : NULL값이 존재할 수 없음, 중복이 될 수 없음.

4. INDEX를 만들 때는 ON을 사용해서 열 값을 입력해야 함

5. VIEW에서 AS문으로 사용

 

핵심

1. 객체 종류 : 데이터 사전 뷰, 인덱스, 뷰, 시퀀스,시노님

 

 

 

 

728x90
반응형
LIST