DDL
* DDL(DATA DEFINITION LANGUAGE)
* 오라클에서 제공하는 객체(OBJECT)를
* 새로이 만들고(CREATE), 구조를 변경하고(ALTER) 구조 자체를 삭제하는(DROP) 명령문
* 즉, 구조(테이블)자체를 정의하는 언어로, 주로 DB관리자나 설계자가 사용함.
*
* 오라클에서의 객체
* 테이블, 뷰(조회용 테이블), 시퀀스(자동으로 번호 부여, SELECT에서 ROWNUM과 비슷)
* 사용자(USER), 패키지(자바에서의 패키지와 유사함),
* 트리거(일이 발생했을 때, 자동으로 지정된 일을 수행)
* 프로시저, 함수(자바에서의 메소드와 같음)
* 동의어(SELECT에서의 별칭과 비슷함)
* 테이블이란, 행(ROW,RECORD,튜플)과 열(COLUMN, FIELDS, ATTRIBUTES)로 구성되는
* 가장 기본적인 데이터베이스 객체
* 항상 모든 데이터는 테이블을 통해서 저장됨.
* 즉, 데이터를 보관하고자 한다면 테이블을 만들어야 함.
*
* [표현법]
* CREATE TABLE 테이블명 (
* 컬럼명1 자료형,
* 컬럼명2 자료형,
* ...
* 컬럼명N 자료형
* );
*
* < 자료형 >
* 문자 (CHAR(사이즈),VARCHAR2(사이즈)) : 사이즈는 BYTE수
* (숫자, 영문, 특수문자, 공백 => 1글자당 1BYTE
* 한글 => 1글자당 3BYTE)
* CHAR(BYTE) : 고정길이 문자열. 아무리 적은 값이 들어가도, 공백으로 채워서 할당한 크기를 유지함.
* : BYTE에는 최대 2000까지 지정 가능
* => 주로 들어올 값의 글자수가 정해져있을 때 사용
* => 예) 성별(남,여) : 3BYTE / (M,F) : 1BYTE
* VARCHAR2(BYTE) : 가변길이 문자열. 적은 값이 들어가면, 자동으로 공간을 해당 값만큼 조절함.
* : BYTE에는 최대 4000까지 지정 가능
* => 주로 들어올 값이 정해지지 않았을 때 사용
* => 예) 이름(2~3자), 이메일주소, 집주소,...
* 숫자 (NUMBER) : 정수 / 실수 상관없이 NUMBER임.
* 날짜 (DATE) : 년,월,일,시,분,초의 개념이 들어간 자료형
CREATE TABLE MEMBER (
MEMBER_ID VARCHAR2(20),
MEMBER_PWD VARCHAR2(16),
MEMBER_NAME VARCHAR2(15),
MEMBER_DATE DATE
);
SELECT * FROM MEMBER;
SELECT * FROM MEMBER2;
COMMENT ON COLUMN MEMBER.MEMBER_ID IS '회원 아이디';
COMMENT ON COLUMN MEMBER.MEMBER_PWD IS '회원 비밀번호';
COMMENT ON COLUMN MEMBER.MEMBER_NAME IS '회원 이름';
COMMENT ON COLUMN MEMBER.MEMBER_DATE IS '회원 가입일';
SELECT TABLE_NAME FROM USER_TABLES;
SELECT * FROM USER_TAB_COLUMNS;
SELECT * FROM MEMBER;
INSERT INTO MEMBER VALUES('user01','pass01','홍길동','2022-03-25');
INSERT INTO MEMBER VALUES('user02','pass02','김말똥','2022-03-26');
INSERT INTO MEMBER VALUES('user03','pass03','박개똥',SYSDATE);
INSERT INTO MEMBER VALUES('가나다라마바사','pass04','이동동',SYSDATE);
INSERT INTO MEMBER VALUES('user04', null, null, sysdate);
INSERT INTO MEMBER VALUES(null, null, null, sysdate);
INSERT INTO MEMBER VALUES('user03', 'pass03', '고길동', sysdate);
제약조건
* 원하는 데이터 값만 유지하기 위해서, 특정 컬럼마다 설정하는 제약
* 유효한 값들만 보관하기 위해서, 해당 제약조건을 수행함.
*
* [최대목적]
* 데이터의 무결성(정확성)을 보장하기 위한 목적으로 사용.
* 구체적으로는 중복과 NULL에 대한 대비임.
* 애초에 제약조건이 부여된 컬럼에 들어올 데이터의 문제가 있는지 없는지를 검사함.
*
* [종류]
* NOT NULL, UNIQUE, CHECK, PRIMARY KEY(기본키), FOREIGN KEY(외래키)
* 컬럼에 제약조건을 부여하는 방식 : 컬럼레벨방식, 테이블레벨방식
NOT NULL
* 해당 컬럼(열)에 반드시 값이 존재해야 할 경우에만 사용함.
* NULL이 절대로 들어와서는 안되는 컬럼에 부여
* INSERT할때 / UPDATE할때도 마찬가지로 NULL을 허용하지 않도록 제한
*
* '열'탭의 NALLABLE을 확인
* '제약조건'탭의 SEARCH_CONDITION을 확인
*
* 컬럼레벨방식만 사용가능
CREATE TABLE MEM_NOTNULL (
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30)
);
SELECT * FROM MEM_NOTNULL;
INSERT INTO MEM_NOTNULL VALUES(1, 'user01','pass01','홍길동','남','010-1111-2222','aaa@naver.com');
INSERT INTO MEM_NOTNULL VALUES(2, null, null, null, null, null, null);
INSERT INTO MEM_NOTNULL VALUES(2, 'user02', 'pass02', '김말똥', null, null, null);
INSERT INTO MEM_NOTNULL VALUES(3, 'user03', 'pass03', '박개똥', '여',null, null);
UNIQUE
* 컬럼에 중복값을 제한하는 제약조건
* INSERT(삽입) / UPDATE(수정)시, 기존 해당 컬럼값 중 중복값이 있을 경우
* 추가 또는 수정이 되지 않게끔 제약
*
* '제약조건'탭에 CONSTRAINT_TYPE획인
*
* 컬럼레벨 / 테이블레벨 방식 둘다 가능
CREATE TABLE MEM_UNIQUE(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30)
);
SELECT * FROM MEM_UNIQUE;
CREATE TABLE MEM_UNIQUE(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
UNIQUE(MEM_ID)
);
SELECT * FROM MEM_UNIQUE;
DROP TABLE MEM_UNIQUE;
INSERT INTO MEM_UNIQUE VALUES(1, 'user01','pass01','홍길동','남','010-1234-1234','abc@gmail.com');
INSERT INTO MEM_UNIQUE VALUES(2, 'user02','pass02','김말똥',null,null,null);
INSERT INTO MEM_UNIQUE VALUES(3, 'user02','pass02','고영희',null,null,null);
CONSTRAINT
* 제약조건 부여시 제약조건명을 지정
*
* 1.컬럼레벨 방식일 경우
* CREATE TABLE 테이블명(
* 컬럼명 자료형 CONSTRAINT 제약조건명 제약조건,
* 컬럼명 자료형 CONSTRAINT 제약조건명 제약조건,
* ...
* );
*
* 2.테이블레벨 방식일 경우
* CREATE TABLE 테이블명(
* 컬럼명, 자료형
* 컬럼명, 자료형
* ...
* CONSTRAINT 제약조건명 제약조건(컬럼명)
* );
*
* 이때, 두 방식 모두 CONSTRAINT 제약조건명 부분은 생략이 가능함
* => 생략시 임의로 이름이 붙음(SYS_C007092)
CREATE TABLE MEM_CON_NAME(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) CONSTRAINT MEM_NAME_NOTNULL NOT NULL,
GENDER CHAR(3),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
CONSTRAINT MEM_ID_UNIQUE UNIQUE (MEM_ID)
);
SELECT * FROM MEM_CON_NAME;
INSERT INTO MEM_CON_NAME VALUES(1, 'user01', 'pass01', '홍길동', NULL, NULL, NULL);
INSERT INTO MEM_CON_NAME VALUES(2, 'user01', 'pass02',' 고길동', null, null, null);
SELECT * FROM MEM_CON_NAME;
CHECK
* 컬럼에 기록될 수 있는 값에 대한 조건을 설정해 둘 수 있는 제약 조건
*
* '제약조건'탭에 SEARCH_CONDITION을 확인
*
* CHECK(조건식)
*
* 컬럼레벨 / 테이블레벨 방식에서 사용 가능
CREATE TABLE MEM_CHECK (
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN ('남','여')) NOT NULL,
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE NOT NULL
);
SELECT * FROM MEM_CHECK;
INSERT INTO MEM_CHECK VALUES(1, 'user01', 'pass01', '홍길동', '남', '010-1111-1111', null, SYSDATE);
INSERT INTO MEM_CHECK VALUES(2, 'user02', 'pass02', '김갑생', null, null, null, SYSDATE);
INSERT INTO MEM_CHECK VALUES(3, 'user03', 'pass03', '김말똥', '가', null, null, SYSDATE);
DEFAULT
* 특정 컬럼에 들어올 값에 대하여, 기본값으로 설정 가능함.
* 단, DEFAULT는 제약조건이 아님
*
* '열'탭에 DATA_DEFAULT를 확인
*
* 컬럼레벨방식에서 사용 가능
DROP TABLE MEM_CHECK;
CREATE TABLE MEM_CHECK(
MEM_NO NUMBER NOT NULL,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE not null
);
SELECT * FROM MEM_CHECK;
INSERT INTO MEM_CHECK
VALUES(1, 'user01','pass01', '홍길동', '남', null, null, );
INSERT INTO MEM_CHECK(MEM_NO, MEM_ID, MEM_PWD, MEM_NAME)
VALUES(1, 'user01','pass01', '홍길동');
INSERT INTO MEM_CHECK
VALUES(2, 'user02', 'pass02','고길동',null, null, null, default);
INSERT INTO MEM_CHECK
VALUES(3, 'user03', 'pass03', '김말똥', null, null, null, '21/03/25');
PRIMARY KEY
* 테이블에서 각 행들의 정보를 유일하게 식별해줄 수 있는 컬럼에 부여하는 제약조건
* 각 행 한줄 한줄마다 구분할 수 있는 식별자의 역할(자바 컬랙션에서 MAP계열의 KEY와 같음.)
*
* '제약조건'탭에 CONSTRAINT_TYPE에서 확인
*
* 예) 주민등록번호, 사번, 학번, 예약번호, 아이디, 회원번호
* => 중복되지 않고, 값이 존재해야만 하는 컬럼에 PRIMARY KEY를 부여(UNIQUE, NOT NULL)
* 단, 한 테이블당 한개의 PRIMARY KEY 제약조건만 존재해야 함.
* - PRIMARY KEY 제약조건을 컬럼 한개에만 거는 것
* - PRIMARY KEY 제약조건을 컬럼 여러개를 묶어서 한번에 거는 것(복합키)
CREATE TABLE MEM_PRIMARY_KEY1(
MEM_NO NUMBER CONSTRAINT MEM_PK PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE
);
SELECT * FROM MEM_PRIMARY_KEY1;
INSERT INTO MEM_PRIMARY_KEY1
VALUES(1, 'user01', 'pass01','홍길동','남',NULL, NULL, DEFAULT);
INSERT INTO MEM_PRIMARY_KEY1
VALUES(1, 'user02', 'pass02','김말똥',NULL ,NULL, NULL, DEFAULT);
INSERT INTO MEM_PRIMARY_KEY1
VALUES(NULL, 'user02', 'pass02','김말똥',NULL ,NULL, NULL, DEFAULT);
INSERT INTO MEM_PRIMARY_KEY1
VALUES(2, 'user02', 'pass02','김말똥',NULL ,NULL, NULL, DEFAULT);
CREATE TABLE MEM_PRIMARY_KEY2(
MEM_NO NUMBER,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE,
CONSTRAINT MEM_PK2 PRIMARY KEY (MEM_NO)
);
SELECT * FROM MEM_PRIMARY_KEY2;
CREATE TABLE MEM_PRIMARY_KEY3(
MEM_NO NUMBER PRIMARY KEY,
MEM_ID VARCHAR2(20) PRIMARY KEY,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE
);
CREATE TABLE MEM_PRIMARY_KEY3(
MEM_NO NUMBER,
MEM_ID VARCHAR2(20),
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE,
PRIMARY KEY(MEM_NO, MEM_ID)
);
INSERT INTO MEM_PRIMARY_KEY3
VALUES(1, 'user01', 'pass01','홍길동',NULL ,NULL, NULL, DEFAULT);
SELECT * FROM MEM_PRIMARY_KEY3;
INSERT INTO MEM_PRIMARY_KEY3
VALUES(1, 'user02', 'pass02','김영희',NULL ,NULL, NULL, DEFAULT);
INSERT INTO MEM_PRIMARY_KEY3
VALUES(2, NULL, 'pass02','김영희',NULL ,NULL, NULL, DEFAULT);
FOREIGH KEY
* 해당 컬럼에 다른 테이블에 존재하는 값만 들어와야되는 컬럼에 부여하는 제약조건
* => 다른 테이블(부모테이블)을 '참조'한다고 표현함.(Reference)
* => 즉, 참조된 다른 테이블이 제공하고 있는 값만,
* => 해당 외래키 설정이 되어있는 컬럼에 들어올 수 있음.
* => FOREIGN KEY 제약조건으로, 다른 테이블간의 관계를 형성할 수 있음 == JOIN
*
* [예시]
* EMPLOYEE테이블의 JOB_CODE컬럼에 들은 값들은
* JOB테이블의 JOB_CODE컬럼에 들은 값들로 '반드시' 이루어져 있어야 함.
* 그 이외의 값은 들어오면 안됨.
* => EMPLOYEE테이블 입장에서 JOB테이블의 컬럼값을 끌어다가 '참조'함.
* => EMPLOYEE테이블 입장에서 JOB테이블을 부모테이블이라고 표현 가능
* => JOB테이블 입장에서 EMPLOYEE테이블을 자식테이블이라고 표현 가능
*
* [표현]
* - 컬럼레벨 방식
* 컬럼명 자료형 [CONSTRAINT 제약조건명] REFERENCES 참조할테이블명(컬럼명)
*
* - 테이블레벨 방식
* 컬럼명 자료형,
* [CONSTRAINT제약조건명] FOREIGN KEY(제약조건을걸컬럼명) REFERENCES 참조할테이블명(컬럼명)
*
* 단, 두 방식 모두 참조할컬렴명은 생략 가능함.
* 이 경우, 기본적으로 참조할테이블의 PRIMARY KEY 컬럼으로 참조할컬럼명이 자동으로 잡힘.
* CONSTRAINT 제약조건은 생략 가능함.(SYS_C007092)
CREATE TABLE MEM_GRADE(
GRADE_CODE CHAR(2) PRIMARY KEY,
GRADE_NAME VARCHAR2(20) NOT NULL
);
SELECT * FROM MEM_GRADE;
INSERT INTO MEM_GRADE VALUES('G1', '일반회원');
INSERT INTO MEM_GRADE VALUES('G2', '우수회원');
INSERT INTO MEM_GRADE VALUES('G3', '특별회원');
CREATE TABLE MEM(
MEM_NO NUMBER PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GRADE_ID CHAR(2) REFERENCES MEM_GRADE(GRADE_CODE),
GENDER CHAR(3) CHECK (GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE
);
SELECT * FROM MEM;
DROP TABLE MEM;
INSERT INTO MEM
VALUES(1, 'user01', 'pass01', '홍길동', 'G1', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(2, 'user02', 'pass02', '김말똥', 'G2', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(3, 'user03', 'pass03', '고영희', 'G1', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(4, 'user04', 'pass04', '박개똥', NULL , NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(5, 'user05', 'pass05', '고길동', 'G5' , NULL, NULL, NULL, DEFAULT);
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 'G1';
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 'G3';
SELECT * FROM MEM_GRADE;
ROLLBACK;
DROP TABLE MEM;
FOREIGN KEY 삭제옵션
* 자식테이블을 생성 시(외래키 제약조건을 부여할 시)
* 부모테이블의 데이터가 삭제되었을 때, 자식테이블에서는 삭제된 값에 대하여 어떤 처리를 할 것인지
* 옵션으로 정할 수 있음.
*
* FOREIGN KEY 삭제옵션
* - ON DELETE RESTRICTED : 삭제옵션을 별도로 제시하지 않았을 때(기본값)
* => 삭제제한(자식테이블에서 해당 값 참조시)
* - ON DELETE SET NULL : 부모데이터를 삭제 시, 해당 데이터를 사용하는 자식데이터를 NULL로 변경
* - ON DELETE CASCADE : 부모데이터를 삭제 시, 해당 데이터를 사용하는 자식데이터도 같이 삭제
CREATE TABLE MEM(
MEM_NO NUMBER PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK (GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE,
GRADE_ID CHAR(2),
FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE SET NULL
);
DROP TABLE MEM;
DROP TABLE MEM_GRADE;
SELECT * FROM MEM;
SELECT * FROM MEM_GRADE;
INSERT INTO MEM
VALUES(1, 'user01', 'pass01', '홍길동', 'G1', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(2, 'user02', 'pass02', '김말똥', 'G2', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(3, 'user03', 'pass03', '고영희', 'G1', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(4, 'user04', 'pass04', '박개똥', NULL , NULL, NULL, NULL, DEFAULT);
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 'G1';
SELECT * FROM MEM;
SELECT * FROM MEM_GRADE;
ROLLBACK;
DROP TABLE MEM;
CREATE TABLE MEM(
MEM_NO NUMBER PRIMARY KEY,
MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
MEM_PWD VARCHAR2(20) NOT NULL,
MEM_NAME VARCHAR2(20) NOT NULL,
GENDER CHAR(3) CHECK(GENDER IN('남','여')),
PHONE VARCHAR2(15),
EMAIL VARCHAR2(30),
MEM_DATE DATE DEFAULT SYSDATE,
GRADE_ID CHAR(2),
FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE CASCADE
);
SELECT * FROM MEM;
INSERT INTO MEM
VALUES(1, 'user01', 'pass01', '홍길동', 'G1', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(2, 'user02', 'pass02', '김말똥', 'G2', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(3, 'user03', 'pass03', '고영희', 'G1', NULL, NULL, NULL, DEFAULT);
INSERT INTO MEM
VALUES(4, 'user04', 'pass04', '박개똥', NULL , NULL, NULL, NULL, DEFAULT);
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 'G1';
SELECT * FROM MEM_GRADE;
SELECT * FROM MEM;
SELECT MEM_NO, MEM_ID, MEM_PWD, MEM_NAME, GRADE_NAME
FROM MEM , MEM_GRADE
WHERE GRADE_ID = GRADE_CODE(+);
SELECT MEM_NO, MEM_ID, MEM_PWD, MEM_NAME, GRADE_NAME
FROM MEM
LEFT JOIN MEM_GRADE ON(GRADE_ID = GRADE_CODE);
ROLLBACK;
DROP TABLE MEM;
CREATE TABLE ~ AS
* 서브쿼리를 이용한 테이블 생성(테이블 복사의 개념)
* 서브쿼리 : 메인 SQL문(SELECT, CREATE, INSERT, UPDATE)를 보조역할하는 쿼리문(SELECT)
*
* [표현법]
* CREATE TABLE 테이블명
* AS (서브쿼리);
* => 해당 서브쿼리를 실행한 결과를 이용해서,
* => 새로이 테이블을 생성하는 개념.
CREATE TABLE EMPLOYEE_COPY
AS (SELECT *
FROM EMPLOYEE);
SELECT * FROM EMPLOYEE_COPY;
CREATE TABLE EMPLOYEE_COPY2
AS (SELECT *
FROM EMPLOYEE
WHERE 1 = 0) ;
SELECT * FROM EMPLOYEE_COPY2;
CREATE TABLE EMPLOYEE_COPY3
AS(SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000);
SELECT * FROM EMPLOYEE_COPY3;
CREATE TABLE EMPLOYEE_COPY4
AS (SELECT EMP_ID, EMP_NAME, SALARY, SALARY*12"연봉"
FROM EMPLOYEE);
SELECT * FROM EMPLOYEE_COPY4;