[Day 11 | DB] DDL (2) : CREATE TABLE, 테이블 복제

y♡ding·2024년 10월 28일
0

데브코스 TIL

목록 보기
71/163

CREATE TABLE

새로운 테이블을 생성할 때 사용됩니다. 이 명령어를 통해 테이블의 열 이름, 데이터 타입, 제약조건 등을 정의할 수 있으며, 테이블 생성 시 초기 구조를 설정할 수 있습니다.

CREATE TABLE 테이블_이름 (
    열_이름 데이터_타입 [제약조건],
    열_이름 데이터_타입 [제약조건],
    ...
);
  • 테이블_이름: 생성할 테이블의 이름을 지정합니다.
  • 열_이름: 테이블 내 열(컬럼)의 이름을 지정합니다.
  • 데이터_타입: 열에 저장될 데이터의 유형을 지정합니다. 예: INT, VARCHAR(50), DATE
  • 제약조건: 열에 설정할 추가 조건 (예: PRIMARY KEY, NOT NULL, UNIQUE 등)
CREATE TABLE IF NOT EXISTS employees (
    empno INT PRIMARY KEY,
    ename VARCHAR(50) NOT NULL,
    job VARCHAR(50),
    sal DECIMAL(10, 2) DEFAULT 0.00,
    hiredate DATE
);

DROP TABLE

테이블을 삭제할 때 사용됩니다. 이 명령어를 실행하면 테이블과 그 안에 있는 모든 데이터가 완전히 제거되므로, 데이터 복구가 불가능하다는 점에서 신중하게 사용해야 합니다.

DROP TABLE 테이블명;

IF EXISTS 조건 추가
IF EXISTS 조건을 추가하면, 지정한 테이블이 존재하지 않는 경우에도 오류가 발생하지 않고 명령을 무시하게 됩니다. 이를 통해 테이블이 없는 경우에도 안전하게 명령을 실행할 수 있습니다.

DROP TABLE IF EXISTS employees;
  • DROP TABLE 명령어는 테이블을 삭제하는 데 사용되며, 모든 데이터가 함께 삭제됩니다.
  • IF EXISTS 조건을 사용하여 테이블이 없는 경우 오류 없이 명령을 수행할 수 있습니다.
  • 여러 테이블을 한 번에 삭제할 수도 있으며, 테이블 삭제 시 데이터 손실에 주의가 필요합니다.

테이블 복제

1. 테이블 구조와 데이터 모두 복제

CREATE TABLE 새_테이블명 AS
SELECT * FROM 기존_테이블명;
  • 기존_테이블명의 구조와 데이터를 그대로 새_테이블명에 복제합니다.
  • 새로 생성된 테이블에는 원본 테이블의 데이터도 함께 저장됩니다.
  • 주의: AS SELECT 구문을 사용할 경우, 원본 테이블의 제약조건(PRIMARY KEY, INDEX 등)은 복제되지 않습니다.
  • SELECT 문에 맞춰 복제가 가능합니다.
// 전체 복사
create table dept1
    -> as select * from sample.dept;

// 일부 복사(행은 전체, 열만 일부 복사)
create table dept2 
    -> as select loc, dname from sample.dept; 
    
// 일부 데이터만 복사
create table dept3
    -> as select loc, dname from sample.dept where deptno=10;
[문제] 사원번호, 사원이름, 급여, 연봉, 입사일자가 복제되어 있는 emp_year1 테이블 생성

-- 사원번호(empno), 사원이름(ename), 급여(sal), 연봉(annual_salary), 입사일자(hiredate) 컬럼이 있는 emp_year1 테이블 생성
-- 연봉(annual_salary)은 급여(sal) * 12로 계산

create table emp_year1 as
select
    empno,                  -- 사원번호
    ename,                  -- 사원이름
    sal,                    -- 급여
    sal * 12 as annual_salary,  -- 연봉 (급여 * 12)
    hiredate                -- 입사일자
from sample.emp;

2. 테이블 구조만 복제

CREATE TABLE 새_테이블명 LIKE 기존_테이블명;
  • 기존_테이블명구조와 제약조건을 그대로 복제하되, 데이터는 복사하지 않습니다.
  • LIKE 구문은 PRIMARY KEY, INDEX, DEFAULT 값 등 모든 제약조건을 그대로 유지한 채 테이블을 복제할 수 있습니다.
create table empty_dept2 like sample.dept;

WHERE 1 != 1 조건을 사용하면, 테이블의 구조만 복제하고 데이터는 복제하지 않는 효과를 얻을 수 있습니다. 이 방법은 CREATE TABLE ... AS SELECT 구문을 사용할 때 유용합니다. WHERE 1 != 1 조건은 항상 FALSE이므로, 선택된 데이터는 없지만 테이블의 구조는 동일하게 복사됩니다.

CREATE TABLE 새_테이블명 AS
SELECT * FROM 기존_테이블명
WHERE 1 != 1;
  • SELECT * FROM 기존_테이블명 구문에서 WHERE 1 != 1 조건을 사용하면 데이터가 선택되지 않지만, 구조는 복제됩니다.
  • 원본 테이블의 열 이름과 데이터 타입을 그대로 복사하여 새로운 테이블을 생성합니다.
  • 주의: 제약조건(PRIMARY KEY, INDEX 등)은 복제되지 않습니다. 제약조건이 필요한 경우에는 추가 설정이 필요합니다.
 [문제] 사원번호, 사원이름, 부서번호, 부서이름, 부서위치를 저장할 수 있는 emp_dept 테이블 생성 스크립트 
 
create table emp_dept
as select e.empno, e.ename, d.deptno, d.dname, d.loc
from sample.emp e inner join sample.dept d
on (e.deptno = d.deptno)
where 1 != 1;

예제 코드

-- 1. 부정 조건 이용
MariaDB [test1]> select * from sample.dept where 1 != 1;
Empty set (0.001 sec)

MariaDB [test1]> create table empty_dept
    -> as select * from sample.dept where 1 != 1;
Query OK, 0 rows affected (0.114 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [test1]> desc empty_dept;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| deptno | int(2)      | NO   |     | NULL    |       |
| dname  | varchar(14) | YES  |     | NULL    |       |
| loc    | varchar(13) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.004 sec)

MariaDB [test1]> select * from empty_dept;
Empty set (0.001 sec)

-- 2. like 키워드 이용

MariaDB [test1]> create table emplty_dept2 **like** sample.dept;
Query OK, 0 rows affected (0.076 sec)

MariaDB [test1]> desc emplty_dept2;
+--------+-------------+------+-----+---------+-------+
| Field  | Type        | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| deptno | int(2)      | NO   | PRI | NULL    |       |
| dname  | varchar(14) | YES  |     | NULL    |       |
| loc    | varchar(13) | YES  |     | NULL    |       |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.004 sec)
MariaDB [test1]> select * from  empty_dept;
Empty set (0.000 sec)


-- 3. 조인 키워드를 이용한 생성


// 사원번호, 사원이름, 부서번호, 부서이름, 부서위치를 저장할 수 있는 테이블 생성 스크립트
create table empty_dept3 
as select e.empno, e.ename, d.deptno, d.dname, d.loc
from sample.dept d inner join sample.emp e
on (e.deptno = d.deptno)
where 1 != 1;

0개의 댓글

관련 채용 정보