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

 

  • 클래스 테이블 생성

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를 지정해놓은 지점으로 되돌아감. 

 

<집합연산자 (UNION, INTERSECT, MINUS)>

 

  • 집합 A(1,2,3), B(3,4,5)가 있다고 가정

  • UNION ALL : (1,2,3,3,4,5) 합집합. 중복을 포함한 결과의 합 검색

  • UNION: (1,2,3,4,5) 합집합. 중복을 제거한 결과의 합을 검색

  • INTERSECT: (3) 교집합. 양쪽 모두에서 포함된 행을 검색

  • MINUS: (1,2) 차집합. 첫 번째 검색 결과에서 두 번째 검색 결과를 제외한 나머지를 검색

1
2
3
4
SELECT 문
[UNION | UNION ALL | INTERSECT | MINUS]
SELECT 문
[ORDER BY 컬럼 [ASC/CESC];
cs

 

 

 

  • UNION: employees 테이블의 employee_id, job_id와 job_history 테이블의 employee_id, job_id를 중복을 제외하고 합하여 조회 (중복이 제외된 115개의 행이 출력됨)

1
2
3
4
5
SELECT employee_id, job_id
FROM employees
UNION
SELECT employee_id, job_id
FROM job_history;
cs

 

 

 

  • UNION ALL: employees 테이블의 employee_id, job_id와 job_history 테이블의 employee_id, job_id를 중복을 포함하고 합하여 조회 (중복을 포함 두 테이블의 모든 행을 합한 117개의 행이 출력됨)

1
2
3
4
5
SELECT employee_id, job_id
FROM employees
UNION ALL
SELECT employee_id, job_id
FROM job_history;
cs

 

 

 

  • INTERSECT: employees 테이블의 employee_id, job_id와 job_history 테이블의 employee_id, job_id의 중복된 값을 조회 (교집합 2행이 출력됨 (2행이 중복된다는 뜻))

1
2
3
4
5
SELECT employee_id, job_id
FROM employees
INTERSECT
SELECT employee_id, job_id
FROM job_history;
cs

 

 

 

 

  • MINUS: employees 테이블의 employee_id, job_id와 job_history 테이블의 employee_id, job_id의 중복된 값을 제외한 나머지 행을 조회 (차집합 105행이 출력됨)

1
2
3
4
5
SELECT employee_id, job_id
FROM employees
MINUS
SELECT employee_id, job_id
FROM job_history;
cs

 

 

 

 


 

 

<집합연산자 예제>

 

 

  • employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION 연산자를 이용해 합치기

1
2
3
4
5
SELECT department_id
FROM employees
UNION
SELECT department_id
FROM departments;
cs

 

 

  • employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합을 UNION ALL 연산자를 이용해 합치기

1
2
3
4
5
SELECT department_id
FROM employees
UNION ALL
SELECT department_id
FROM departments;
cs

 

 

 

  • employees 테이블의 department_id 집합과 departments 테이블의 department_id 집합의 교집합을 INTERSECT 연산자를 이용해 합치기

1
2
3
4
5
SELECT department_id
FROM employees
INTERSECT
SELECT department_id
FROM departments;
cs

 

 

  • departments 테이블의 department_id 집합에서 employees 테이블의 department_id 집합을 MINUS 연산자를 이용해 빼보기

1
2
3
4
5
SELECT department_id
FROM departments
MINUS
SELECT department_id
FROM employees;
cs

 

 

 

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

데이터 조작어(DML) - INSERT 데이터의 입력  (0) 2020.06.19
트랜잭션  (0) 2020.06.19
서브쿼리 - 다중열  (0) 2020.06.18
서브쿼리 - 다중행  (0) 2020.06.18
서브쿼리 - 단일행  (0) 2020.06.18

<서브쿼리 - 다중열>

 

  • 여러 개의 컬럼을 검색하는 서브 쿼리

1
2
3
SELECT [DISTINCT] 컬럼, 컬럼...
FROM 테이블
WHERE (컬럼1, 컬럼2,...) IN (SELECT 컬럼1, 컬럼2,... FROM 테이블);
cs

 

 

 

  • first_name이 'Bruce'인 직원의 manager_id와 job_id가 같은 직원들을 조회. 단 first_name이 Bruce인 직원 정보는 제외 (first_name이 Bruce인 직원의 manager_id는 103, job_id는 IT_PROG)

1
2
3
4
5
6
SELECT employee_id, first_name, job_id, salary, manager_id
FROM employees
WHERE (manager_id, job_id) IN (SELECT manager_id, job_id
                               FROM employees
                               WHERE first_name='Bruce')
    AND first_name <> 'Bruce';
cs

 

 

 

 

  • 부서별로 최소 급여를 받는 사원의 부서번호, 사원번호, 이름 급여 정보 검색

1
2
3
4
5
6
7
8
SELECT department_id 부서번호, employee_id 사원번호,
       last_name 이름, salary 급여
FROM employees
WHERE (department_id, salary) IN
       (SELECT department_id, MIN(salary)
        FROM employees
        GROUP BY department_id)
ORDER BY department_id;
cs

 

 

 


 

 

<서브쿼리 - 다중열 예제>

  • employees 테이블에서 job_id별로 가장 낮은 salary가 얼마인지 찾아보고, 찾아낸 job_id별 salary에 해당하는 직원의 first_name, job_id, salary, department_id를 출력 (salary 내림차순 정렬)

1
2
3
4
5
6
7
SELECT first_name, job_id, salary, department_id
FROM employees
WHERE (job_id, salary) IN
        (SELECT job_id, MIN(salary)
        FROM employees
        GROUP BY job_id)
ORDER BY salary DESC;
cs

 

 

 

 

 

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

트랜잭션  (0) 2020.06.19
집합연산자 (UNION, INTERSECT, MINUS)  (0) 2020.06.18
서브쿼리 - 다중행  (0) 2020.06.18
서브쿼리 - 단일행  (0) 2020.06.18
조인 (JOIN) - 리뷰 및 예제  (0) 2020.06.18

+ Recent posts