<테이블 컬럼(열)의 추가/수정/삭제>

 

  • 90번 부서의 직원들을 새테이블 E_EMP에 입력

1
2
3
4
5
CREATE TABLE E_EMP
AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id=90;
cs

 

 

 

 


 

  • 열의 이름을 지정해서 E_EMP2 테이블 생성

1
2
3
4
5
6
7
CREATE TABLE E_EMP2(emp_id, name, sal, dept_id)
AS
SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id=90;
 
SELECT * FROM E_EMP2;
cs

 

 

 

 


 

  • 열의 추가

1
2
3
4
ALTER TABLE E_EMP
ADD (GENDER VARCHAR2(1));
 
SELECT * FROM E_EMP;
cs

 

 


 

  • 디폴트 값을 0으로 하는 열 추가

1
2
3
4
ALTER TABLE E_EMP
ADD (커미션 NUMBER DEFAULT 0 NOT NULL);
 
SELECT * FROM E_EMP;
cs

 

 

 


 

  • 두 개의 열을 추가

1
2
3
4
5
ALTER TABLE E_EMP
ADD (날짜 DATE DEFAULT sysdate,
     제작자 VARCHAR2(100DEFAULT USER);
 
SELECT * FROM E_EMP;
cs

 

 

 

 


 

  • 열의 수정

1
2
3
ALTER TABLE E_EMP
MODIFY (제작자 VARCHAR2(200)); --원래 (100)=>(200) 사이즈로
DESC e_emp;
cs

 

 

 


 

 

1
2
3
ALTER TABLE E_EMP
MODIFY (제작자 VARCHAR2(50)); --원래 (200)=>(50) 사이즈로
DESC e_emp;
cs

 

 

 


 

 

1
2
ALTER TABLE E_EMP
MODIFY (제작자 VARCHAR2(1)); --원래 (50)=>(1) 사이즈로
cs

 

제작자 열은 2byte 크기의 데이터 타입이므로 1로 줄일 수 없다.

 

 

 

 


 

 

1
2
ALTER TABLE E_EMP
MODIFY (제작자 number);
cs

 

이미 문자형 데이터가 있기 때문에 숫자형으로 바꿀 수 없다.

 

 


 

 

1
2
ALTER TABLE E_EMP
MODIFY (GENDER number);
cs

 

NULL값인 경우에 입력된 값이 없기 때문에 데이터 형식을 바꿀 수 있다.

 


 

  • 제작자의 데이터 형식을 바꾸려 하면

1
2
UPDATE E_EMP
SET 제작자 = NULL;
cs

 


 

 

  • 열의 삭제

1
2
ALTER TABLE e_emp
DROP COLUMN 제작자; --제작자 열 삭제
cs

 

 

  • 여러개의 열 삭제

1
2
ALTER TABLE e_emp
DROP (GENDER, 커미션, 날짜); --여러개 열 삭제
cs

 

 

 

 


  • 열의 이름 수정

1
2
ALTER TABLE e_emp
RENAME COLUMN department_id TO 부서번호;
cs

 

 

 

1
2
3
4
5
6
ALTER TABLE e_emp
RENAME COLUMN salary TO 급여;
ALTER TABLE e_emp
RENAME COLUMN employee_id TO 직원번호;
ALTER TABLE e_emp
RENAME COLUMN last_name TO 이름;
cs

 

 

 

 


 

 

  • 테이블의 이름 수정

1
RENAME e_emp TO 직원테이블;
cs

 

 

 


 

 

<예제>

 

  • employees 테이블의 job_id가 'ST_MAN'인 직원들을 새 테이블 stmans를 만들어 입력. 단 테이블의 컬럼 이름은 id, job, sal (직원 테이블의 employee_id, job_id, salary)

1
2
3
4
5
6
7
CREATE TABLE stmans (id, job, sal)
AS
SELECT employee_id, job_id, salary
FROM employees
WHERE job_id='ST_MAN';
 
SELECT * FROM stmans;
cs

 

 

'Learning > SQL' 카테고리의 다른 글

인덱스  (0) 2020.06.22
  (0) 2020.06.22
제약조건의 삭제  (0) 2020.06.22
제약조건의 추가 및 수정  (0) 2020.06.22
제약조건 (constraints)  (0) 2020.06.19

<제약조건의 삭제>

 

  • 제약조건의 이름으로 삭제

1
2
ALTER TABLE class
DROP CONSTRAINT class_cno_pk;
cs

 

기본키를 참조하는 외래키가 있기 때문에 에러 발생

 

 

 


 

 

  • CASCADE 옵션시 참조하는 외래키도 삭제

1
2
ALTER TABLE class
DROP CONSTRAINT class_cno_pk CASCADE;
cs

 

 

 


 

  • 제약조건으로 삭제

1
2
3
4
5
6
ALTER TABLE class
DROP UNIQUE (cname); 
--클래스 테이블의 cname열의 유니크 제약조건 삭제
 
ALTER TABLE student
DROP PRIMARY KEY--기본키의 삭제
cs

 

 

 


 

  • 테이블의 삭제

1
2
DROP TABLE class;
DROP TABLE student;
cs

 

 

 

'Learning > SQL' 카테고리의 다른 글

  (0) 2020.06.22
테이블 컬럼(열)의 추가/수정/삭제  (0) 2020.06.22
제약조건의 추가 및 수정  (0) 2020.06.22
제약조건 (constraints)  (0) 2020.06.19
테이블 만들고 삭제하기  (0) 2020.06.19

<제약조건의 추가 및 수정>

 

  • 클래스 테이블 생성

1
2
3
4
CREATE TABLE class (
    cno VARCHAR2(2),
    cname VARCHAR2(50)
);
cs

 

  • 테이블에 새 행을 입력

1
2
3
INSERT INTO class VALUES ('01','데이터베이스');
INSERT INTO class VALUES ('02','자바');
SELECT * FROM class;
cs

 

 


 

  • 학생 테이블 생성

1
2
3
4
5
CREATE TABLE student(
    sno VARCHAR2(4),
    sname VARCHAR2(50),
    cno VARCHAR(2)
);
cs

 

  • 학생 테이블에 새 행을 입력

1
2
3
4
5
INSERT INTO student VALUES ('0414','홍길동','01');
INSERT INTO student VALUES ('0415','임꺽정','02');
INSERT INTO student VALUES ('0416','이순신','03');
commit; --영구 저장
SELECT * FROM student;
cs

 

 


 

 

  • 클래스 테이블에 기본키 추가

1
2
ALTER TABLE class
ADD CONSTRAINT class_cno_pk PRIMARY KEY(cno);
cs

 

 

 


 

  • 기본키는 널값이나 중복될 수 없음

1
INSERT INTO class VALUES (NULL,'데이터베이스');
cs

 

 

 

 


 

 

  • 클래스 테이블에 유니크 키를 추가

1
2
ALTER TABLE class
ADD CONSTRAINT class_cname_uk UNIQUE(cname);
cs

 

 

 


 

 

  • 유니크키는 중복안됨

1
INSERT INTO class VALUES ('03''데이터베이스');
cs

 

 

 


 

  • 제약 조건을 조회하는 명령문

1
2
3
SELECT *
FROM ALL_CONSTRAINTS --모든 제약조건
WHERE table_name = 'CLASS'--테이블명 입력시 대문자
cs

 

 

 


 

  • 학생 테이블에 기본키를 추가

1
2
ALTER TABLE student
ADD CONSTRAINT student_sno_pk PRIMARY KEY(sno);
cs

 

 

  • 학생 테이블의 sname에 NOT NULL 추가 (NOT NULL 일경우 MODIFY 사용)

1
2
ALTER TABLE student
MODIFY sname CONSTRAINT student_sname_nn NOT NULL;
cs

 

 

 

  • 학생 테이블에 외래키 추가

1
2
3
4
5
ALTER TABLE student
ADD CONSTRAINT student_cno_fk FOREIGN KEY(cno)
    REFERENCES class(cno); --클래스 테이블에 cno열을 참조
 
--03이 참조하는 데이터에 없기 때문에 에러발생
cs

 

 

 

+ 학생 테이블에 외래키 추가가 안되는 이유는? 03이 참조하는 데이터에 없기 때문.

(0416 이순신 03 행에서 03을 01로 바꾼다.)

 

1
2
3
4
--제약조건을 추가할 때 이미 만들어진 테이블에 각 행의 데이터가 
만족해야
제약조건이 추가된다.
UPDATE student SET cno = '01'
WHERE sno='0416';
cs

 

 

+ 그 다음 외래키를 추가하면 테이블 변경이 된다.

1
2
3
ALTER TABLE student
ADD CONSTRAINT student_cno_fk FOREIGN KEY(cno)
    REFERENCES class(cno);
cs

 

'Learning > SQL' 카테고리의 다른 글

테이블 컬럼(열)의 추가/수정/삭제  (0) 2020.06.22
제약조건의 삭제  (0) 2020.06.22
제약조건 (constraints)  (0) 2020.06.19
테이블 만들고 삭제하기  (0) 2020.06.19
오라클 SQL의 데이터타입  (0) 2020.06.19

<제약조건 (constraints)>

 

  • 제약조건: 테이블 단위에서 데이터의 무결성을 보장해주는 규칙. 테이블에 데이터가 입력, 수정, 삭제되거나 테이블이 삭제, 변경될 경우 잘못된 트랜잭션이 수행되지 않도록 결함을 유발할 가능성이 있는 작업을 방지하는 역할을 담당.

 

  • 무결성: 정보가 원 그대로 변형되지 않고 전달되는 성질. 원래의 정보 또는 신호가 전송/저장/변환 중에 또는 그 후에도 동일함을 유지하는 것

 

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

    • NOT NULL: 열이 NULL값을 포함할 수 없음

    • UNIQUE KEY (UK)-고유키: 테이블의 모든 행에서 고유한 값을 갖는 열 또는 열조합을 지정

    • PRIMARY KEY (PK)-기본키: 해당 열은 반드시 존재하고 유일해야 함. NOT NULL, UK제약 조건 결합한 형태

    • FOREIGN KEY (FK)-외래키: 한 열과 참조된 테이블 열 간의 외래 키 관계를 설정

    • CHECK: 해당 열에 저장 가능한 데이터 값의 범위나 조건 지정

 

  • 제약조건 문법

1
2
3
4
5
6
CREATE TABLE 테이블이름(
컬럼 데이터타입 [DEFAULT default값] [컬럼 레벨 제약조건], 
--위치가 열 옆
...
[테이블 레벨 제약조건], --혹은 위치가 아래쪽에
...
);
cs

 


 

  • 제약조건을 걸고 emp 테이블 만들기 (열 이름 옆에)

1
2
3
4
CREATE TABLE emp (
    eno     NUMBER(3CONSTRAINT emp_eno_pk PRIMARY KEY,
    emp_name VARCHAR2(20)
);
cs

 

 

 


1
DESC emp;
cs

 

emp 테이블 Describe하기: eno는 NOT NULL이므로 반드시 값을 입력해야함

 

 


emp 테이블에 데이터 입력하기

1
2
3
4
5
6
INSERT INTO emp
VALUES (1'김');
INSERT INTO emp
VALUES (2'박');
INSERT INTO emp
VALUES (2'양');
cs

 

eno는 기본키이기 때문에 중복값이 발생하면 안됨

 

 

emp 테이블의 모든 데이터 출력

1
SELECT * FROM emp;
cs

 

 


emp 테이블 삭제하기

1
DROP TABLE emp;
cs

 


 

 

  • 제약조건을 걸고 emp 테이블 만들기 (열의 데이터 타입을 정한 뒤)

1
2
3
4
5
6
CREATE TABLE emp (
    eno     NUMBER(3),
    emp_name VARCHAR2(20),
    CONSTRAINT emp_eno_pk PRIMARY KEY (eno)
--어떤 열의 제약조건인지 괄호 안에 적어줌
);
cs

 

 

 


 

  • 제약조건의 이름이 없는 경우

1
2
3
4
5
6
7
8
9
10
CREATE TABLE emp1 (
    eno     NUMBER(3) PRIMARY KEY,
    emp_name VARCHAR2(20)
);
 
INSERT INTO emp1
VALUES (1,'김');
INSERT INTO emp1
VALUES (1,'박');
--컴퓨터에서 자동으로 제약조건을 만들어줌
cs

 

제약조건의 이름이 없지만 PRIMARY KEY 명령어에 의해 eno 컬럼은 기본키가 되고, 중복값이 오거나 NULL 값이면 안되기 때문에 오류가 발생

 

 


  • NOT NULL / UK 유니크

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DROP TABLE emp1;
 
CREATE TABLE emp1 (
    eno         NUMBER(3),
    emp_name    VARCHAR2(20)
    CONSTRAINT emp1_ename_nn NOT NULL,
    email       VARCHAR2(30)
    CONSTRAINT empl_email_uk UNIQUE
);
 
INSERT INTO emp1
VALUES (1NULL'hong@naver.com');
--emp_name은 NOT NULL이기 때문에 NULL값을 넣을 수 없음
 
cs

 

 

 

 

  • UK 유니크는 동일한 값이 입력될 수 없음

1
2
3
4
INSERT INTO emp1
VALUES (1'홍길동''hong@naver.com');
INSERT INTO emp1
VALUES (2'김유신''hong@naver.com');
cs

 

 

 


 

  • CHECK 제약조건

1
2
3
4
5
6
7
8
9
10
CREATE TABLE emp2 (
    eno         NUMBER (3),
    emp_name    VARCHAR2(20)
    CONSTRAINT emp2_ename_nn NOT NULL,
    sal      VARCHAR2(10)
    CONSTRAINT emp2_sal_check CHECK (sal > 1000)
);
 
INSERT INTO emp2
VALUES(1'홍길동'999);
cs

 

 


 

  • emp 테이블 삭제 후 다시 emp 테이블을 만들고 제약조건을 걸기

1
2
3
4
5
6
7
8
9
10
11
12
DROP TABLE emp;
CREATE TABLE emp (
    eno NUMBER (4PRIMARY KEY
--제약조건 이름 생략
    ename VARCHAR2(20NOT NULL
--데이터가 NULL이면 안됨
    gno VARCHAR2(13UNIQUE CHECK (LENGTH(gno)>=8), 
--8자리 이상 되어야 함
    gender VARCHAR2(5) CHECK (gender IN ('woman''man')) 
--woman혹은 man중 하나의 값이어야함
);
 
cs

 

 

emp 테이블에 데이터 입력하기

1
2
3
INSERT INTO emp VALUES (1'김''12345678''man');
INSERT INTO emp VALUES (2'강''123456789''woman');
INSERT INTO emp VALUES (3'강''1234567''woman');
cs

 

UNIQUE CHECK(LENGTH(gno)>=8) 이란 제약조건에 의해 7자리 gno 데이터는 들어갈 수 없음

 

 

gender 값은 man혹은 woman 둘 중 하나여야 하기 때문에 오류 발생

1
INSERT INTO emp VALUES (4'양''123456789''human');
cs

 

 

 


 

<제약조건 예제>

 

  • members라는 새 테이블을 만들기 (제약조건 이름은 생략가능)

1
2
3
4
5
6
7
8
9
CREATE TABLE members (
    member_id    NUMBER (2)     PRIMARY KEY,
    first_name   VARCHAR2 (50)  NOT NULL,
    last_name    VARCHAR2 (50)  NOT NULL,
    gender       VARCHAR2 (5)   CHECK (gender IN('Man','Woman')),
    birth_day    DATE           DEFAULT sysdate,
    email        VARCHAR2 (200UNIQUE NOT NULL
);
DESC members;
cs

 

 

 


 

  • 외래키 (FK) 관련 제약조건

  • dept 부서테이블을 생성 (기본키만 가지고 있음)

1
2
3
4
5
6
CREATE TABLE dept (
    dno     NUMBER (4),
    dname   VARCHAR2 (20),
    CONSTRAINT dept_dno_pk PRIMARY KEY(dno) --기본키
);
DROP TABLE emp;
cs

 


 

  • dept 테이블을 참조하는 emp 테이블 생성하고 dept 테이블의 dno를 참조

1
2
3
4
5
6
7
8
9
CREATE TABLE emp (
    eno         NUMBER (4),
    emp_name    VARCHAR2 (20),
    sal         NUMBER (10),
    dno         NUMBER (4),
    CONSTRAINT emp_eno_pk PRIMARY KEY(eno),
    CONSTRAINT emp_dno_fk FOREIGN KEY(dno)
        REFERENCES dept(dno)
);
cs

 


 

 

  • dept 테이블에 데이터 입력

1
2
3
4
5
6
INSERT INTO dept VALUES (10'TEST1');
INSERT INTO dept VALUES (20'TEST2');
INSERT INTO dept VALUES (30'TEST3');
INSERT INTO dept VALUES (40'TEST4');
INSERT INTO dept VALUES (50'TEST5');
SELECT * FROM dept;
cs

 


 

 

  • emp 테이블에 데이터 입력

1
2
3
4
5
6
INSERT INTO emp VALUES (1010'Kim'20010);
INSERT INTO emp VALUES (1020'Lee'18020);
INSERT INTO emp VALUES (1030'Jung'22030);
INSERT INTO emp VALUES (1040'Oh'25040);
INSERT INTO emp VALUES (1050'King'30050);
SELECT * FROM emp;
cs

 

 

  • emp에서 참조하고 있는 dept 테이블의 dno은 현재 dno가 10, 20, 30, 40, 50. 60이 없기에 입력 불가능

1
2
--외래키는 참조열의 값 이외에는 입력불가
INSERT INTO emp VALUES (1060'Kang'50060);
cs

 

 

 

1
INSERT INTO emp VALUES (1060'Kang'500NULL);
cs

 

 

 

  • emp 테이블이 참조하고 있기 때문에 삭제시 에러발생

1
2
DELETE FROM dept
WHERE dno=20;
cs

 

 

 


 

  • ON DELETE CASCADE: 삭제 시 참조하는 열 값도 삭제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE emp; 
 
CREATE TABLE emp (
    eno         NUMBER (4),
    emp_name    VARCHAR2 (20),
    sal         NUMBER (10),
    dno         NUMBER (4),
    CONSTRAINT emp_eno_pk PRIMARY KEY(eno),
    CONSTRAINT emp_dno_fk FOREIGN KEY(dno)
        REFERENCES dept(dno) ON DELETE CASCADE
);
 
INSERT INTO emp VALUES (1010'Kim'20010);
INSERT INTO emp VALUES (1020'Lee'18020);
INSERT INTO emp VALUES (1030'Jung'22030);
INSERT INTO emp VALUES (1040'Oh'25040);
INSERT INTO emp VALUES (1050'King'30050);
 
DELETE FROM dept
WHERE dno=20;
cs

 

 

 

 


 

 

  • ON DELETE SET NULL: 참조행 삭제시 자동 널값

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE emp; 
 
CREATE TABLE emp (
    eno         NUMBER (4),
    emp_name    VARCHAR2 (20),
    sal         NUMBER (10),
    dno         NUMBER (4),
    CONSTRAINT emp_eno_pk PRIMARY KEY(eno),
    CONSTRAINT emp_dno_fk FOREIGN KEY(dno)
        REFERENCES dept(dno) ON DELETE SET NULL
);
 
INSERT INTO emp VALUES (1010'Kim'20010);
INSERT INTO emp VALUES (1020'Lee'18020);
INSERT INTO emp VALUES (1030'Jung'22030);
INSERT INTO emp VALUES (1040'Oh'25040);
INSERT INTO emp VALUES (1050'King'30050);
 
DELETE FROM dept
WHERE dno=30;
cs

 

 

 

'Learning > SQL' 카테고리의 다른 글

제약조건의 삭제  (0) 2020.06.22
제약조건의 추가 및 수정  (0) 2020.06.22
테이블 만들고 삭제하기  (0) 2020.06.19
오라클 SQL의 데이터타입  (0) 2020.06.19
데이터 조작어(DML) - DELETE (데이터의 삭제)  (0) 2020.06.19

<테이블 만들고 삭제하기>

 

  • CREATE: 테이블 만들기

1
2
3
4
CREATE TABLE ex_date( --테이블 이름
        ex_id          NUMBER(2), --열의 이름, 데이터 타입
        start_date  DATE DEFAULT sysdate);
--디폴트는 입력 안될시 디폴트 뒤의 값으로
cs

 

1
2
3
4
5
6
7
8
INSERT INTO ex_date(ex_id)
VALUES (1);
INSERT INTO ex_date(ex_id)
VALUES (2);
INSERT INTO ex_date(ex_id)
VALUES (3);
commit;
SELECT * FROM ex_date;
cs

 

 

 

 

1
DESC ex_date;
cs

 

 

널?은 제약조건을 말하는데 현재는 없는 상태라서 비워져 있음

 

 


 

  • DROP: 테이블 삭제하기. 테이블 전체를 삭제, 공간, 객체를 삭제. 삭제 후 절대 되돌릴 수 없음

1
2
DROP TABLE comp;
DROP TABLE copy_emp;
cs

 


 

 

<테이블 만들고 삭제하기 예제>

 

  •  product_id (number타입),  product_name (varchar2 타입, 20자리), menu_date (date 타입) 열이 있는  sample_product 이름의 테이블 생성

1
2
3
4
CREATE TABLE sample_product (
     product_id NUMBER (10),
     product_name VARCHAR2 (20),
     menu_date DATE DEFAULT sysdate);
cs

 

 

1
SELECT * FROM sample_product;
cs

 

 

 


 

  • 위에서 생성한 테이블을 삭제하고 DESC으로 삭제되었는지 확인

1
2
DROP TABLE sample_product;
DESC sample_product;
cs

 

 

 

 

 

 

 

<오라클 SQL의 데이터타입>

 

  • 문자형 char 와 varchar2: char는 고정 길이 데이터 타입. 다 채우지 않았을 경우 공백이 있고, varchar2는 가변 길이 데이터 타입. 다 채우지 않았을 경우 공백이 없음.

 

    • comp 테이블을  만들고 char_col 과 varchar_col 열 만들기. 데이터타입은 CHAR(4), VARCHAR2(4)

1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE comp (
    char_col CHAR(4),
    varchar_col VARCHAR2(4));
 
 
INSERT INTO comp VALUES ('AA''AA');
INSERT INTO comp VALUES ('AAA''AAA');
INSERT INTO comp VALUES ('AAAA''AAAA');
commit;
 
SELECT * FROM comp;
cs

 

 

 

 

1
2
SELECT * FROM comp
WHERE char_col = varchar_col;
cs

 

 

char의 길이는 항상 4. 반면에 varchar의 길이는 가변적. AAAA로 4자리를 다 채웠으니 varchar의 길이는 4가 되고 결과값이 AAAA로 출력됨.

 

 

 


 

  • 숫자형 데이터 타입 NUMBER (NUMBER(p,s): p는 유효자리수 1~38, s는 소수점 유효자리수)

    • NUMBER(3): 정수로 3자리까지 표현

 


 

  • 날짜형 데이터 타입: DATE(고정 길이 날짜), TIMESTAMP (밀리초 ms까지 표현)

 

    • DATE타입

1
2
SELECT hire_date, to_char(hire_date, 'YYYY-MM-DD'"날짜>문자변환"
FROM employees;
cs

 

 

 

 

 

 

 

<데이터 조작어(DML)-DELETE (데이터의 삭제)>

 

  • DELETE: 데이터의 삭제

 

  • 71번~75번 부서번호 삭제

1
2
3
DELETE FROM departments
WHERE department_id BETWEEN 71 AND 75;
commit;
cs

 

  • 직원 테이블 id 1,2 삭제

1
2
3
DELETE FROM employees
WHERE employee_id IN (1,2);
commit;
cs

 

  • 데이터 전체를 삭제: rollback 가능 (데이터만 삭제되고 테이블은 남아있음)

1
2
DELETE FROM copy_departments;
rollback;
cs

 


 

  • TRUNCATE TABLE: 전체 삭제인데 rollback이 안됨

1
2
TRUNCATE TABLE copy_departments;
rollback;
cs

 


 

  • DROP TABLE: 테이블 삭제

1
2
3
DROP TABLE copy_departments;
DROP TABLE copy_DEPT;
DROP TABLE XX_EMP;
cs

 


 

  • SAVEPOINT: 세이브 포인트

1
2
SELECT * FROM copy_emp
WHERE employee_id=108-- salary 12008
cs

 

 

1
2
3
UPDATE copy_emp
SET salary = salary + 10
WHERE employee_id = 108--salary 12018
cs

 

 

    • 세이브 포인트 A만들기

1
2
3
4
5
SAVEPOINT A;
 
UPDATE copy_emp
SET salary = salary + 20
WHERE employee_id = 108--salary 12038
cs

 

 

    • 세이브 포인트 A로 롤백

1
ROLLBACK TO SAVEPOINT A; --salary 12018
cs

 

 

    • 롤백: COMMIT을 안했기 때문에 최초상태로 돌아감

1
ROLLBACK;
cs

 

 

 

 

 

 

<데이터 조작어(DML)-UPDATE (데이터의 갱신)>

 

 

  • UPDATE: 테이블에 있는 행의 내용을 갱신하는 명령어

1
2
3
UPDATE 테이블
SET 컬럼=값 [, 컬럼=값,...]
[WHERE 조건];
cs

 


 

  • 업데이트 사용시 where 절에 항상 기본키를 활용한다.

1
2
3
4
5
6
7
8
CREATE TABLE copy_emp
AS
SELECT * FROM employees;
 
UPDATE copy_emp
SET salary = 24100
WHERE employee_id = 100;
COMMIT;
cs

 

    • 의도치 않게 이름이 같은 사람들이 업데이트됨 (Steven이 두명이므로 기본키로 조건을 거는게 좋다)

1
2
3
4
UPDATE copy_emp
SET salary = 24100
WHERE first_name = 'Steven';
COMMIT;
cs

 

 


 

 

  • Where 절을 안썼을때: 전부 업데이트 됨

1
2
3
UPDATE copy_emp
SET phone_number = '123-456-789';
ROLLBACK;
cs

 


 

 

 

<UPDATE 예제>

 

  • copy_departments 테이블의 '개발부 4,5' 부서의 매니저와 location ID를 업데이트

1
2
3
4
5
6
7
UPDATE copy_departments
SET manager_id=100, location_id=1800
WHERE department_name='개발부 4';
 
UPDATE copy_departments
SET manager_id=100, location_id=1800
WHERE department_name='개발부 5';
cs

 

 

 

  • copy_departments 테이블에서 department_id 150부터 200까지 부서번호의 manager_id를 100으로 수정

1
2
3
UPDATE copy_departments
SET manager_id=100
WHERE department_id BETWEEN 150 AND 200;
cs

 

 

 

 

 

 

<데이터 조작어(DML)-데이터의 입력>

 

  • DML: 데이터베이스에 데이터를 입력, 수정, 삭제하는 명령어

 


 

  • INSERT: 테이블에 새로운 행을 입력하는 명령어

 

  • 실행전 열과 제약조건을 확인 (DESC+테이블. DESC:describe의 약자)
1
 DESC departments;
cs

 

 

 

  • 전체 열을 다 입력하는 방법 1

1
2
3
INSERT INTO departments (department_id,
department_name, manager_id, location_id)
VALUES (71'개발부 1'1001700);
cs

 

 

 

  • 입력되었는지 확인

1
2
SELECT *
FROM departments;
cs

 

 

  • COMMIT으로 저장

1
COMMIT;
cs

 

  


 

  • 열의 이름이 없는 경우 전체 열을 다 입력해야 함

1
2
INSERT INTO departments
VALUES (72'개발부 2'1001700);
cs

 

 


 

  • ROLLBACK;

1
ROLLBACK;
cs

 

 


 

 

  • 열의 순서를 바꿀경우

1
2
3
4
INSERT INTO departments (department_name,
manager_id, location_id, department_id)
VALUES ('개발부 3'100170073);
COMMIT;
cs

 

 

  • 자동으로 널값 입력

1
2
3
4
INSERT INTO departments (department_id, department_name)
VALUES (74'개발부4');
COMMIT;
DESC departments;
cs

 


 

 

  • sysdate 현재날짜 입력

1
2
3
4
5
INSERT INTO employees (employee_id, first_name,
last_name, email,hire_date,job_id)
VALUES (1'홍''길동''hong@naver.com', sysdate,'IT_PROG');
COMMIT;
DESC employees;
cs

 

 

  • 날짜 입력하기

1
2
3
4
5
INSERT INTO employees (employee_id, first_name,
last_name, email,hire_date,job_id)
VALUES (2'강''길동''kang@naver.com',
    TO_DATE('2020-04-05','YYYY-MM-DD'),'IT_PROG');
COMMIT;
cs

 

 

 


 

  • 사용자로부터 입력받기

1
2
3
INSERT INTO departments (department_id, department_name)
VALUES (&id, '&name'); --75, 개발부 5
COMMIT;
cs

 

 

 

 

 


 

  • 테이블 만들기

1
2
3
4
CREATE TABLE XX_EMP (
    EMPNO number,
    ENAME varchar2(100),
    SAL number );
cs

 


 

  • 테이블 전체를 카피해서 입력하는 방법

1
2
3
INSERT INTO XX_EMP (EMPNO, ENAME, SAL)
SELECT employee_id, first_name, salary
FROM employees;
cs

 

 

 

 

 


 

 

  • INSERT 실행중에 에러가 나는 경우

 

1. 기본키에 이미 있는 (중복된) 값을 입력할 경우

1
2
3
INSERT INTO departments (department_id, department_name,
                        manager_id, location_id)
VALUES (10'개발부 10'1001700);
cs

 

 

 


 

 

 

2. FK(외래키)에 참조되지 않은 값을 입력 (departments테이블은 location테이블을 참조하기 때문에 location_id는 1000부터 3200사이에만 들어가야함)

1
2
3
INSERT INTO departments (department_id, department_name,
                        manager_id, location_id)
VALUES (5'개발부 5'1001);
cs

 

 

 


 

 

3. 데이터의 종류가 틀릴때

1
2
3
INSERT INTO departments (department_id, department_name,
                        manager_id, location_id)
VALUES ('10''개발부 5'100'D1');
cs

 

 

 


 

 

4. 데이터의 사이즈가 맞지 않을때

 

INSERT INTO departments (department_id, department_name,

                        manager_id, location_id)

VALUES ('10', '개발부 5 개발부 5 개발부 5 개발부 5 개발부 5 개발부 5',

100, 'D1');

 

1
2
3
4
INSERT INTO departments (department_id, department_name,
                        manager_id, location_id)
VALUES ('10''개발부 5 개발부 5 개발부 5 개발부 5 개발부 5 개발부 5',
100'D1');
cs

 

 


 

 

  • 테이블을 카피하기 

1
2
3
CREATE TABLE COPY_DEPT
AS
SELECT * FROM departments;
cs

 

departments 테이블을 카피한 COPY_DEPT 테이블이 생성됨

 

 

 


 

 

<INSERT 예제>

 

  • departments 테이블에 department_id, department_name, manager_id가 200, location_id가 1700인 행을 3개 입력

1
2
3
4
5
6
7
8
9
10
11
INSERT INTO departments (department_id, department_name,
                         manager_id, location_id)
VALUES (271'Sample Dept 1'2001700);
 
INSERT INTO departments (department_id, department_name,
                         manager_id, location_id)
VALUES (272'Sample Dept 2'2001700);
 
INSERT INTO departments (department_id, department_name,
                         manager_id, location_id)
VALUES (273'Sample Dept 3'2001700);
cs

 

 

 


 

  • copy_departments 테이블을 만든 후 SELECT 문을 이용하여 departments 테이블 내용을 전부 입력

1
2
3
4
5
6
7
CREATE TABLE copy_departments (department_id number(4,0),
                               department_name varchar2 (30 byte),
                               manager_id number (6,0),
                               location_id number (4,0));
 
INSERT INTO copy_departments
SELECT * FROM departments;
cs

 

 

 

 

 

<트랜잭션>

 

  • 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위. 반드시 동시에 실행(COMMIT)되거나 취소(ROLLBACK)됨

 

  • COMMIT: 모든 DML작업을 수행한 후 작업을 완료할 때 반드시 필요. COMMIT명령을 수행해야지만 실제 하드디스크에 저장

  • ROLLBACK: 트랜잭션의 실행을 취소하였음을 알리는 연산자. 트랜잭션이 수행한 결과를 원래의 상태로 원상 복귀시킴. ROLLBACK을 실행하면 DML작업에 의해서 변경된 정보를 이전 정보로 환원.

  • SAVEPOINT: 현재 트랜잭션 내에 저장점을 만듦. ROLLBACK TO SAVEPOINT_name명령으로 SAVEPOINT를 지정해놓은 지점으로 되돌아감. 

 

+ Recent posts