카테고리 없음

sql ddl,pk,fk

boangod 2025. 9. 23. 21:37

글자가 저장되는 데이터 타입 = varchar2()

날짜가 저장돼있는 데이터 타입 = date()

숫자가 저장되어 있는 데이터 타입 = number()

뒤에 괄호는 바이트수를 나타낸다.

 

 

ddl

create table로 만들면 alter table로 지운다.

 

• DDL(Data Definition Language)

‐ CREATE → create로 만든 거만 무조건 alter로 구조를 고칠 수 있다. 지우려면 drop으로 지운다.

‐ ALTER

‐ DROP

‐ RENAME → 오브젝트 이름을 바꿈.(사용할 일 없다.)

‐ TRUNCATE → 테이블 안을 비워라는 말임.

세그먼트가 아닌 애들은 존재 안 함.

 

공간을 할당받으면 안 써도 가지고 있는다. delete로 지워도 공간을 가지고 있는다.

truncate는 테이블 지웠다 새로 만들어라는 뜻. 그래서 테이블을 새로 만들었을 때랑 똑같다.

 

 

테이블 생성과 삭제

 

CREATE TABLE 테이블 (

컬럼 데이터_타입 [DEFAULT 값] [컬럼 레벨 제약조건],

......

[테이블 레벨 제약조건],

.....

);

 

DROP TABLE 테이블 [CASCADE CONSTRAINT];

ㄴ 테이블을 지우는 것 사실상 거의 불가능하다.(사용 중인 데이터베이스에서.)

 

PURGE RECYCLEBIN;

ㄴ 휴지통 비우기라고 생각하면 된다.(drop table 사용하면 여기로 온다.)

 

 

 

 

테이블생성규칙

• 문자로 시작한다.

• 30자 이내로 한다.

• 영문, 숫자, _, $, # 을 사용한다.

    ‐ 한글사용은 가능하지만 되도록 사용하지 않는 것이 좋다.

• 테이블의 이름은 동일한 유저(스키마) 안에서 유일해야 한다.

• 예약어는 사용이 불가능하다.

• 대소문자를 구별하지 않는다.

    ‐ 생성할 때사용한 문자와는 관계없이 모든 이름은 대문자로 정의된다.

    ‐ 테이블이름은 딕셔너리에 저장되는데, 모두 대문자로 저장된다.

 

 

데이터타입

 

VARCHAR2(n) 

    ‐ 가변길이문자타입(1 < n < 4000 byte)

CHAR(n)      

   ‐ 고정길이문자타입(1 < n < 2000 byte)

NUMBER(n,p)

    ‐ 숫자타입, n은 전체자릿수이고 p는 소수점이하자릿수이다.

    ‐ 전체자릿수를 초과할 경우 입력거부되지만 소수점이하자릿수가 초과되면반올림되어 입력된다.

DATE    

    ‐ 날짜타입 출력이 나입력 형식과 무관 하게 YYYY/MM/DD:HH24:MI:SS 형태 조저장된다. (기원전 4712년 1월 1일~ 서기 9999년 12월 31일

LONG 

    ‐ 2GB까지 저장가능한 가변길이문자타입, 조건검색할 수 없으며 테이블에는 하나의 LONG 컬럼만정의 할 수 있다.

CLOB

    ‐ LONG를 개선한 타입, 최대 4G까지 저장가능하고 한 테이블의 여러 컬럼에 정의할 수 있다.

BLOB

    ‐ 4G까지 저장가능한가 변길이이진타입

ROW(n)

    ‐ 가변길이이진타입

BFILE

    ‐ 4G 이내의외부파일저장을 위한 이진타입 → 동영상, 미디어 타입을 처리하는 건 좀 안 좋다.

ROWID

    ‐ ROWID를 저장하기 위한 데이터타입, 각문자는 64진 수로엔코딩되어있다

 

 

 

테이블생성 관련명령어 → 꼭 외우자.

SQL> SELECT * FROM tab; → tab은 가상 테이블 SQL> SELECT table_name FROM user_tables;

‐ 스키마에 테이블목록을 검색한다.

‐ 스키마는 유저와동일하게 쓰인다.

SQL> DESC 테이블;

SQL> SELECT table_name, column_name, data_type, data_length

2 FROM user_tab_columns

3 [WHERE table_name = '테이블'];

‐ 테이블의 컬럼구성을 확인한다.

 

정의 정보는 봐도 된다.

통계정보는 봐도 의미가 없다.

 

 

테이블생성과 확인

테이블명: board(게시판)

구성컬럼: no(게시물번호), name(작성자), sub(제목), content(내용), hdate(입력일시)

 

SQL> CREATE TABLE board (

2 no NUMBER,

3 name VARCHAR2(50),

4 sub VARCHAR2(100),

5 content VARCHAR2(4000),

6 hdate DATE DEFAULT SYSDATE

7 );

 

SQL> SELECT * FROM tab;

SQL> SELECT table_name FROM user_tables

2 WHERE table_name = 'BOARD';

 

• 생성된 테이블에 행을 입력하고 default 입력을 확인한다.

 

SQL> DESC board;

SQL> SELECT table_name, column_name, data_type, data_length

2 FROM user_tab_columns

3 WHERE table_name = 'BOARD';

SQL> INSERT INTO board (no) VALUES (1);

SQL> COMMIT;

SQL> SELECT * FROM board;

 

 

 

문자타입데이터

 

  • 문자와 숫자
    ‐ 주민번호, 군번, 숫자만으로 구성된 학번 : 문자
          . 개별자리가 의미가 있는 경우 항상 문자형 데이터
          . 연산가능성이 없다.
    ‐ 금액: 숫자
          . 연산가능성이 있으면 숫자
          . NULL에 주의한다.
  • VARCHAR, VARCHAR2
    ‐ 같은 데이터타입
    ‐ 앞으로 뭔가 변경될 것이다.???
  • CHAR, VARCHAR2
    ‐ CHAR의 장점은 없다.
    ‐ VARCHAR2를 쓴다.

 

 

CHAR, VARCHAR2의 비교

 

• 동일한 값이 입력된 두 컬럼이데이 터 타입에 따라 다르게 인식됨을 확인한다.

 

SQL> CREATE TABLE comp(

2 co1 CHAR(4),

3 co2 VARCHAR2(4)

4 );

 

SQL> INSERT INTO comp VALUES ('AA', 'AA');

SQL> SELECT LENGTHB(co1), LENGTHB(co2) FROM comp;

ㄴ co1은 4, co2는 2가 나온다.

 

SQL> SELECT * FROM comp WHERE co1='AA';

SQL> SELECT * FROM comp WHERE co2='AA';

ㄴ 둘 다 AA가 나온다.

 

SQL> SELECT * FROM comp WHERE co1=co2;

ㄴ no rows selected 나온다.

 

날짜타입 컬럼검색

 

날짜데이터입력 시에 sysdate 등의 자동으로 입력되는 기능을 이용할 때 주의사 항

 

SQL> CREATE TABLE hd (

2no NUMBER,

3 hdate DATE 4 );

 

SQL> INSERT INTO hd VALUES (1, sysdate); SQL> SELECT * FROM hd;

ㄴ 오늘 날짜가 나온다.

 

SQL> SELECT * FROM hd WHERE hdate = '2021/10/02';

ㄴ no rows selected

 

SQL> SELECT no, TO_CHAR(hdate,'YYYY/MM/DD:HH24:MI:SS') FROM hd;

ㄴ 1 2025/09/23:10:56:08

 

SQL> SELECT * FROM hd

2 WHERE hdate BETWEEN '2021/10/02' AND '2021/10/03';

ㄴ 1 2025/09/23

 

‐ 더 좋지 못한 조건문: WHERE hdatelike '2021/10/02%';

 

 

테이블삭제

• board, comp, hd 테이블을 정말 삭제한다.

SQL> SELECT * FROM tab;

SQL> DROP TABLE board;

SQL> DROP TABLE comp;

SQL> DROP TABLE hd;

SQL> SELECT * FROM tab;

SQL> PURGE RECYCLEBIN;

SQL> SELECT * FROM tab;

 

 

 

테이블관리

 

서브쿼리를 이용한 테이블생성

 

CREATE TABLE 테이블 [(

컬럼 [DEFAULT 값],

...

)]

AS (SELECT 문장 : Sub query문);

 

‐ 서브쿼리실행결과를 테이블로 생성한다.

‐ 컬럼목록이 생략되면 서브쿼리의 열이름이 생성될 테이블의 컬럼명이 된다.

‐ 컬럼에 DEFAULT항목을 지정할 수 있다.

‐ 테이블을 복사하거나 일부를 별도로저장하는 용도로 사용한다.

 

 

• 사번, 이름, 업무, 부서 정보만을 갖는 테이블을 생성한다.

SQL> CREATE TABLE emp2

2 AS

3 SELECT eno 사번, ename 이름, job 업무, d.dno 부서번호, dname 부서

4 FROM emp e, dept d

5 WHERE d.dno=e.dno;

 

SQL> DESC emp2;

 

SQL> SELECT * FROM emp2;

 

또는

 

SQL> CREATE TABLE emp2 (사번, 이름, 업무, 부서번호, 부서)

2 AS

3 SELECT eno, ename, job, d.dno, dname

4 FROM emp e, dept d

5 WHERE d.dno=e.dno;

 

하지만 이행종속이 발생해서 잘못 만들었습니다.

 

 

테이블관리(ALTER TABLE)

 

ALTER TABLE 테이블

ADD (컬럼 데이터_타입 [DEFAULT 값], ...);

 

ALTER TABLE 테이블

MODIFY (컬럼 데이터_타입 [DEFAULT 값], ...);

 

ALTER TABLE 테이블

DROP COLUMN 컬럼;

 

• ALTER TABLE 명령

‐ 컬럼 추가

‐ 컬럼 수정

‐ 컬럼 삭제

 

컬럼추가 → 컬럼을 추가하는 일은 애초에 없어야 한다.

 

• emp2 테이블에 입사일 컬럼을 추가한다.

SQL> ALTER TABLE emp2

2 ADD (hdate DATE);

 

SQL> DESC emp2;

 

SQL> SELECT * FROM emp2;

 

‐ 추가되는 열은 마지막에 위치한다.

‐ 열의위치를 지정할 수 없다.

‐ 추가된 열에는 NULL이 저장된다.

  • db의 행은 순서대로 안 들어간다.

 

컬럼변경,컬럼삭제

ㄴ 그런 작업을 할 필요가 없는 것이 정상이다.

 

 

테이블내용완전삭제

 

 

TRUNCATE TABLE 테이블;

 

‐ 테이블의 내용(행, 공간)을완전히삭제한다.

‐ DDL 작업으로 ROLLBACK 할 수 없다.

‐ 'DELETE FROM 테이블'과 비슷하지만 공간까지 해제하는 차이가 있다.

      . DELETE에 비해 속도가 빠르다.

 

• emp2 테이블의 내용과 구조를 완전히 삭제한다.

SQL> TRUNCATE TABLE emp2;

 

 

테이블이름변경

 

RENAME OLD_NAME TO NEW_NAME;

‐ 테이블, 뷰(VIEW), 시퀀스등다양한 대상의 이름을 변경할 수 있다.

 

• emp2 테이블의 이름을 eemp로 수정한다.

SQL> RENAME emp2 TO eemp;

SQL> SELECT * FROM tab;

 

 

PK, FK

 

 

제약 조건의 이해

• 제약 조건

‐ 테이블 단위에서 정의되고 적용된다.

‐ 종속성이 존재하는 경우 테이블의 삭제를 막아준다.

‐ 자료가 삽입, 갱신, 삭제될 때마다 규칙이 적용된다.

‐ 일시적으로 활성화하거나 비활성화하는 것이 가능하다.

‐ 제약조건은 개체처럼 관리되므로 반드시 이름이 필요하다.

 

• 오라클에서 제공되는 제약조건

‐ PRIMARY KEY

‐ FOREIGN KEY

‐ UNIQUE KEY

‐ NOT NULL

‐ CHEC

 

  • PK → 결정 인자. 이걸 알면 나머지를 찾거나 구별할 수 있다.
    ‐ Primary Key, 주 키, 주 식별자
    ‐ 테이블마다 한 개만 정의할 수 있다.
    ‐ 테이블 내에 모든 행을 유일하도록 식별해주는 컬럼
    ‐ 모든 컬럼은 PK 컬럼에 **함수적 종속관계(functional dependency)**를 갖는다.
           . 학번→ (이름, 학년, 학과,...)
    ‐ 중복될 수 없고 NULL을 허용하지 않는다.
    ‐ 고유 인덱스가 자동으로 생성된다.

 

  • FK → 참조하는 놈.(항상 자식테이블에 있다. 부모테이블에는 존재 불가능.)
    ‐ Foreign Key, 외부키, 외부식별자
    ‐ 테이블간관계(Relationship)를 의미한다.
    ‐ 항상 부모자식 관계이다.
    ‐ 자식 테이블의 참조 컬럼에 지정한다.
    ‐ 두 컬럼에 데이터타입이 일치해야 한다.
    ‐ PK나 UK만 참조 가능하다.
          ㄴ 일반적으로 pk만 참조한다.

 

PK, FK 설정

 

SQL> CREATE TABLE 테이블 (

2 .....

3 CONSTRAINT 제약_조건 PRIMARY KEY (컬럼));

ㄴ 주 키가 2개면 컬럼부분에 2개 넣으면 됩니다.

 

SQL> CREATE TABLE 테이블 (

2 .....

3 CONSTRAINT 제약_조건 FOREIGN KEY (컬럼)

4 REFERENCES 참조할_테이블 (참조할_컬럼) [ON DELETE CASCADE]);

 

 

 

제약조건검색

 

SQL> SELECT c.table_name, c.constraint_name, c.constraint_type,

2 c.status, s.column_name

3 FROM user_constraints c, user_cons_columns s

4 WHERE c.constraint_name = s.constraint_name

5 AND c.table_name in (검색_대상_테이블_목록)

6 ORDER BY c.table_name;

 

SQL> SELECT p.table_name 상위테이블, p.constraint_name 상위제약조건,

2 c.table_name 하위테이블, c.constraint_name 참조제약조건

3 FROM user_constraints p, user_constraints c

4 WHERE c.r_constraint_name=p.constraint_name

5 AND p.table_name in (검색_대상_테이블_목록)

6 ORDER BY p.table_name;

 

‐ ucon.sql, ref.sql 스크립트로 저장해서 사용

 

 

PK와 FK 설정테이블생성

dept부터 만들어준다.

 

SQL> CREATE TABLE dept (

2 dno VARCHAR2(2),

3 dname VARCHAR2(15),

4 loc VARCHAR2(9),

5 CONSTRAINT dept_dno_pk PRIMARY KEY(dno)

6 );

 

SQL> CREATE TABLE emp (

2 eno VARCHAR2(4),

3 ename VARCHAR2(15),

4 sex VARCHAR2(4),

5 job VARCHAR2(12),

6 mgr VARCHAR2(4),

7 hdate DATE,

8 sal NUMBER,

9 comm NUMBER,

10 dno VARCHAR2(2),

11 CONSTRAINT emp_eno_pk PRIMARY KEY (eno),

12 CONSTRAINT emp_mgr_fk FOREIGN KEY (mgr) REFERENCES emp (eno),

13 CONSTRAINT emp_dno_fk FOREIGN KEY (dno) REFERENCES dept (dno)

14 );

 

 

오류

SQL> INSERT INTO dept (dno, dname, loc) VALUES ('10', '총무', '부산');

SQL> DELETE FROM dept WHERE dno = '10';

ㄴ 10번 안에 사람이 있는데 지워버리면 없는 부서사람이 되기 때문.

 

SQL> INSERT INTO emp (eno,ename, dno) VALUES ('2001','손하늘','20');

ㄴ 20번 부서가 없기 때문에

 

SQL> UPDATE emp SET dno = '20' WHERE ename = '문시현';

ㄴ 20번 부서가 없는데 20번 부서를 바꾸려 해서

 

 

‐ 조건은 입력(수정, 삭제) 작업 시에 발생한다.

‐ 오라클에서 제약조건은 지연가능하다.

 

 

논리모델링부터 만들고 물리 모델링을 한다.