06_DDL(CREATE)_KH계정
----- 여기서부터는 KH 계정에서 실행 -----
*SUBQUERY를 이용한 테이블 생성 (테이블을 복사 뜨는 개념)
서브쿼리: 메인 SQL문(SELECT, CREATE, INSERT, ...)을 보조역할 하는 SELECT문
AS (서브쿼리);
=> 해당 서브쿼리를 수행한 결과로 새로이 테이블을 생성하겠다
- EMPLOYEE 테이블을 복제한 새로운 테이블 생성 (EMPLOYEE_COPY)
CREATE TABLE EMPLOYEE_COPY
AS (SELECT *
FROM EMPLOYEE);
--> 컬럼들, 조회 결과의 데이터들, 제약조건 중에서 NOT NULL만 복제됨
--> 나머지 제약 조건들은 복제가 안 됨
-- SELECT * FROM EMPLOYEE;
SELECT * FROM EMPLOYEE_COPY;
-- EMPLOYEE 테이블에 있는 컬럼 구조만 가지고 오고 싶음 (내용물 제외)
/*
CREATE TABLE EMPLOYEE_COPY2 (
EMP_ID VARCHAR2(3),
EMP_NAME VARCHAR(20),
...
);
*/
-- 이렇게 새로 만드는 방법도 쓸 수 있지만 너무 귀찮음...!
CREATE TABLE EMPLOYEE_COPY2
AS (SELECT *
FROM EMPLOYEE
WHERE 1 = 0);
-- 서브쿼리에 어떻게 넣어야 할까?
SELECT *
FROM EMPLOYEE
WHERE EMP_ID = 0; -- 무조건 FALSE인 조건 넣기
-->> 언젠가 사번이 0인 사람이 들어올 수도 있으므로 좋은 조건이 아님
SELECT *
FROM EMPLOYEE
WHERE 1 = 0; -- 무조건 FALSE인 조건!
SELECT * FROM EMPLOYEE_COPY2;
--> 구조만 따 오기 성공!
-- 전체 사원들 중 급여가 300만원 이상인 사원들의 사번, 이름, 부서코드, 급여 컬럼 복제
-- 1) 서브쿼리를 먼저 구하기
SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000;
-- 2) 위의 서브쿼리를 통해서 원하는 테이블 생성 (EMPOYEE_COPY3)
CREATE TABLE EMPLOYEE_COPY3
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY
FROM EMPLOYEE
WHERE SALARY >= 3000000);
SELECT * FROM EMPLOYEE_COPY3;
-- 전체 사원의 사번, 사원명, 급여, 연봉 조회 결과를 테이블로 생성 (EMPLOYEE_COPY4)
-- 1) 서브쿼리 부분 구하기
SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12
FROM EMPLOYEE;
-- 2) 위의 서브쿼리를 통해서 원하는 테이블 생성 (EMPLOYEE_COPY4)
CREATE TABLE EMPLOYEE_COPY4
AS(SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12
FROM EMPLOYEE);
-- ORA-00998: must name this expression with a column alias
-->> 서브쿼리의 SELECT절에 산술연산 또는 함수식이 기술된 경우 반드시 별칭 부여를 해야 함
CREATE TABLE EMPLOYEE_COPY4
AS(SELECT EMP_ID, EMP_NAME, SALARY, SALARY * 12 "연봉"
FROM EMPLOYEE);
--> 별칭 추가해 주니 잘 생성됨!
SELECT * FROM EMPLOYEE_COPY4;
--> 조회 시 별칭 적용된 후 결과값 나옴
*테이블이 다 생성된 후 뒤늦게 제약조건 추가 (ALTER TABLE 테이블명 XXXXX)
- PRIMARY KEY: ADD PRIMARY KEY (컬럼명);
- FOREIGN KEY: ADD FOREIGN KEY (컬럼명) REFERENCES 참조할테이블명(참조할컬럼명);
=> 참조할컬럼명 생략 가능
- UNIQUE: ADD UNIQUE (컬럼명);
- CHECK: ADD CHECK (컬럼명을 포함한 컬럼에 대한 조건);
- NOT NULL: MODIFY 컬럼명 NOT NULL;
--EMPLOYEE_COPY 테이블에 없는 PRIMARY KEY 제약조건을 추가
ALTER TABLE EMPLOYEE_COPY ADD PRIMARY KEY(EMP_ID);
-- EMPLOYEE 테이블에 DEPT_CODE 컬럼에 외래키 제약조건을 추가 (DEPARTMENT 테이블의 DEPT_ID 참조)
ALTER TABLE EMPLOYEE ADD FOREIGN KEY (DEPT_CODE) REFERENCES DEPARTMENT (DEPT_ID);
-- EMPLOYEE 테이블에 JOB_CODE 컬럼에 외래키 제약조건을 추가 (JOB 테이블의 JOB_CODE 참조)
ALTER TABLE EMPLOYEE ADD FOREIGN KEY (JOB_CODE) REFERENCES JOB (JOB_CODE);