오라클로배우는데이터베이스 입문/12강 데이터 정의어

Jimin·2022년 7월 27일
1

12-1 객체를 생성, 변경, 삭제하는 데이터 정의어

  • 데이터 정의어(DDL: Data Definition Language)?
    데이터베이스 데이터를 보관하고 관리하기 위해 제공되는 여러 객체(object)의 생성, 변경, 삭제 관련 기능을 수행한다.

- 데이터 정의어를 사용할 때 유의할 점

  • 데이터 정의어는 데이터 조작어(DML, INSERT, UPDATE, DELETE, SELECT)와 달리 명령어를 수행하자마자 데이터 베이스에 수행한 내용이 바로 반영되는 특성이 있다.
    데이터 정의어를 실행하면 자동으로 COMMIT 되기 때문에 이전에 사용한 데이터 조작어는 영구히 데이터베이스에 반영된다.
    ⇒ ROLLBACK을 통한 실행 취소가 불가하다는 것을 의미하므로, DML을 사용할 때는 주의를 기울여야 한다.
  • 트랜잭션 시작 → DML들 → DDL 사용과 동시에 COMMIT 효과, ROLLBACK 불가 → 새로운 트랜잭션 시작
  • 데이터 정의어의 종류
  1. CREATE
    • 객체를 생성
  2. ALTER
    • 생성된 객체를 변경
  3. DROP
    • 객체를 삭제

12-2 테이블을 생성하는 CREATE

  • CREATE문은 오라클 데이터베이스 객체를 생성하는데 사용하는 명령어이다.
  • CREATE TABLE 명령어는 테이블을 만들 때 사용하는 대표적인 데이터 정의어이다.
  • 제약 조건(Constraint) 테이블을 생성할 때 각 열에 저장되는 데이터 특징을 더 구체적으로 지정할 수 있다.
  • 기본 형식
    • 소유 계정 이름은 생략할 수 있다.
      → 계정 이름을 생략히게 되면, 현재 접속해 있는 계정 소유의 테이블이 만들어 진다.
CREATE TABLE 소유 계정.테이블 이름(1 이름 열1 자료형,2 이름 열2 자료형,
    ...
    열N 이름 열N 자료형
);
  • 테이블 이름은 반드시 다음 규칙대로 지정해 주어야 한다.
    • 기본적으로 테이블 이름을 지정할 때는 대, 소문자 구별을 하지 않는데, 대, 소문자를 구별하여 테이블 이름을 지정할 때는 테이블 이름에 큰 따옴표(" ")를 사용한다.
    1. 테이블 이름은 문자로 시작해야 한다.
    2. 테이블 이름은 30BYTE 이하여야 한다.
    3. 같은 사용자 소유의 테이블 이름은 중복될 수 없다.
    4. 테이블 이름은 영문자(한글), 숫자(0-9), 특수문자 $, #, _을 사용할 수 있다.
    5. SQL키워드는 테이블 이름으로 사용할 수 없다.
  • 열 이름 생성 규칙
    1. 열 이름은 문자로 시작해야 한다.
    2. 열 이름은 30BYTE 이하여야 한다.
    3. 한 테이블의 열 이름은 중복될 수 없다.
    4. 열 이름은 영문자(한글), 숫자(0-9), 특수문자 $, #, _을 사용할 수 있다.
    5. SQL키워드는 열 이름으로 사용할 수 없다.

- 자료형을 각각 정의하여 새 테이블 생성하기

  • CREATE 명령어를 사용하여 EMP 테이블과 같은 열 구조를 가지는 EMP_DDL 테이블 생성하기
  • DESC 명령어를 사용하여 EMP_DDL 테이블과 EMP 테이블의 열 구조를 확인할 수 있다.
  • 모든 열의 각 자료형을 정의해서 테이블 생성하기
CREATE TABLE EMP_DDL(
    EMPNO   NUMBER(4),
    ENAME   VARCHAR2(10),
    JOB     VARCHAR2(9),
    MGR     NUMBER(4),
    HIREDATE DATE, -- 길이 지정이 필요 없는 자료형이라 소괄호 사용X
    SAL     NUMBER(7, 2), -- 7: 총 자리수, 2: 소수점 자리수
    COMM    NUMBER(7, 2),
    DEPTNO  NUMBER(2)
);

- 기존 테이블 열 구조와 데이터를 복사하여 새 테이블 생성하기

  • 특정 테이블과 같은 열 구조로 테이블을 만들 때, 위와 같이 일일이 작성하지 않고, CREATE문에 서브쿼리를 활용하여 테이블을 생성하는 방법을 많이 사용한다.
  • CREATE문에 서브쿼리를 사용할 때 AS 키워드를 함께 사용한다.
  • CREATE문은 DEPT 테이블과 같은 열 구조를 가지면서 DEPT 테이블의 데이터까지 그대로 저장한 DEPT_DDL 테이블을 만든다.
CREATE TABLE DEPT_DDL
    AS SELECT * FROM DEPT;

- 기존 테이블 열 구조와 일부 데이터만 복사하여 새 테이블 생성하기

  • 특정 테이블과 열 구조는 같되, 테이블 전체 데이터가 아닌 일부 데이터만 복사하여 만들어야 한다면, 서브쿼리에 WHERE절을 사용하여 생성 테이블에 저장될 데이터를 조건식으로 지정할 수 있다.
  • EMP테이블에서 30번 부서인 사원 데이터만 저장한 테이블을 생성하기
CREATE TABLE EMP_DDL_30
    AS SELECT * FROM EMP WHERE DEPTNO = 30;

- 기존 테이블의 열 구조만 복사하여 새 테이블 생성하기

  • 특정 테이블과 열 구성이 같되, 저장 데이터가 없는 빈 테이블을 생성하려면 WHERE절 조건식의 결과 값이 언제나 FALSE가 나오는 방법을 사용할 수 있다.
  • CREATE문에 서브쿼리를 사용하는 방식은 자주 쓰인다.
  • CREATE문에서 여러 테이블을 조인한 SELECT문을 이용할 수 있다.
  • EMP테이블과 DEPT 테이블을 조인한 결과로 테이블을 생성하는 CREATE문
CREATE TABLE EMPDEPT_DDL
    AS SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE,
        E.SAL, E.COMM, D.DEPTNO, D.DNAME, D.LOC
    FROM EMP E, DEPT D
    WHERE 1<>1;
  • 위의 결과 결과 테이블은 서브쿼리에서 지정한 열 구조를 가지지만, 데이터는 저장되지 않는다.
  • 숫자 1과 숫자 1이 다른 값인가의 결과는 항상 FALSE이기 때문에 EMP테이블과 DEPT테이블을 조인한 모든 결과 행이 출력 대상에서 제외된다.

12-3 테이블을 변경하는 ALTER

  • ALTER명령어는 이미 생성된 오라클 데이터 베이스 객체를 변경할 때 사용한다.
  • 테이블에 새 열을 추가 또는 삭제하거나, 열의 자료형 또는 길이변경하는 등 테이블 구조 변경과 관련된 기능을 수행한다.
  • 실습을 위해 EMP테이블 복사하여 EMP_ALTER테이블 생성하기
CREATE TABLE EMP_ALTER
    AS SELECT * FROM EMP;

- 테이블에 열 추가하는 ADD

  • ALTER TABLE 명령어와 ADD 키워드, 추가할 열 이름과 자료형을 명시하면 테이블에 새 열을 추가할 수 있다.
  • ALTER 명령어로 HP 열 추가하기
ALTER TABLE EMP_ALTER
    ADD HP VARCHAR(20);

- 열 이름을 변경하는 RENAME

  • ALTER 명령어에 RENAME 키워드를 사용하면 테이블의 열 이름을 변경할 수 있다.
  • ALTER 명령어로 HP 열 이름을 TEL로 변경하기
ALTER TABLE EMP_ALTER
    RENAME COLUMN HP TO TEL;

- 열의 자료형을 변경하는 MODIFY

  • 테이블의 특정 열의 자료형이나 길이를 변경할 때는 다음과 같이 MODIFY 키워드를 사용한다.
  • ALTER명령어로 열의 자료형과 길이를 변경하는 것은 테이블에 저장된 데이터에 문제가 생기지 않는 범위 내에서만 허용된다.
  • 즉, 길이를 늘이는 것은 괜찮지만, 길이를 줄이거나 기존 열의 자료형을 다른 자료형으로 변경하는 것은 저장된 데이터 상태에 따라 결정되는 것이다.
  • ALTER 명령어로 EMPNO 열 길이 변경하기
ALTER TABLE EMP_ALTER
MODIFY EMPNO NUMBER(5);

- 특정 열을 삭제할 때 사용하는 DROP

  • 테이블의 특정 열을 삭제할 때 DROP 키워드를 사용한다.
  • 열 삭제 → 해당 열의 데이터 삭제 => 신중해야함
  • ALTER 명령어로 TEL 열 삭제하기
ALTER TABLE EMP_ALTER
DROP COLUMN TEL;

12-4 테이블 이름을 변경하는 RENAME

  • 테이블 이름을 변경할 때는 RENAME명령어를 사용한다.
  • 앞에서 생성한 EMP_ALTER 테이블 이름을 EMP_RENAME으로 변경하기
RENAME EMP_ALTER TO EMP_RENAME;

12-5 테이블의 데이터를 삭제하는 TRUNCATE

  • TRUNCATE 명령어는 특정 테이블의 모든 데이터를 삭제한다.
  • 데이터만 삭제하므로 테이블 구조에는 영향을 주지 않는다.
  • EMP_RENAME 테이블의 데이터를 TRUNCATE 명령어로 삭제하기
TRUNCATE TABLE EMP_RENAME;


--- TRUNCATE 명령어를 사용할 때 유의할 점

  • 테이블의 데이터 삭제는 데이터 조작어 중 WHERE절을 명시하지 않은 DELETE문의 수행으로도 가능하다.
  • 하지만, TRUNCATE는 데이터 정의어이기 때문에 ROLLBAACK이 되지 않는다는 점에서 DELETE문과 다르다.
    ⇒ 즉, 삭제 이후 복구할 수 없다.

12-6 테이블을 삭제하는 DROP

  • DROP 명령어는 데이터베이스 객체를 삭제하는데 사용한다.
  • 테이블이 삭제되므로 테이블에 저장된 데이터도 모두 삭제된다.
  • EMP_RENAME 테이블 삭제하기
DROP TABLE EMP_RENAME;

  • FLASHBACK 기능을 사용하여 DROP명령어로 삭제된 테이블을 복구할 수 있다.
    (하지만 매우 특별한 상황에서만 사용되는 명령어임)

잊기 전에 한 번 더!

  1. 다음 열 구조를 가지는 EMP_HW 테이블을 만들어 보세요
CREATE TABLE EMP_HW(
    EMPNO   NUMBER(4),
    ENAME   VARCHAR2(10),
    JOB     VARCHAR2(9),
    MGR     NUMBER(4),
    HIREDATE    DATE,
    SAL     NUMBER(7, 2),
    COMM    NUMBER(7, 2),
    DEPTNO  NUMBER(2)
);
  1. EMP+HW 테이블에 BIGO 열을 추가해 보세요. BOGO 열의 자료형은 가변형 문자열이고 길이는 20입니다.
ALTER TABLE EMP_HW
ADD BIGO VARCHAR(20);
  1. EMP -HW 테이블의 BIGO 열 크기를 30으로 변경해보세요
ALTER TABLE EMP_HW
MODIFY BIGO VARCHAR(30);
  1. EMP_HW 테이블의 BIGO 열 이름을 REMARK로 변경해보세요
ALTER TABLE EMP_HW
RENAME COLUMN BIGO TO REMARK;

5. EMP_HW 테이블에서 EMP 테이블의 데이터를 모두 저장해보세요. 단 REMARK 열은 NULL로 삽입합니다.

INSERT INTO EMP_HW
    SELECT EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, NULL FROM EMP;
  1. 지금까지 사용한 EMP_HW 테이블을 삭제해보세요.
DROP TABLE EMP_HW;



프로그래머스

STRING, DATE

SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE UPPER(NAME) LIKE UPPER('%el%')
AND ANIMAL_TYPE = 'Dog'
ORDER BY NAME;
SELECT ANIMAL_ID, NAME,
CASE
      WHEN SEX_UPON_INTAKE LIKE '%Intact%' THEN 'X'
      ELSE 'O' 
END AS 중성화
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
SELECT ANIMAL_ID, NAME
FROM (SELECT I.ANIMAL_ID, I.NAME
        FROM ANIMAL_INS I, ANIMAL_OUTS O
        WHERE I.ANIMAL_ID = O.ANIMAL_ID
        ORDER BY O.DATETIME - I.DATETIME DESC)
WHERE ROWNUM <=2;
SELECT ANIMAL_ID, NAME, TO_CHAR(DATETIME, 'YYYY-MM-DD') AS 날짜
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

JOIN

SELECT O.ANIMAL_ID, O.NAME
	FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID(+) = O.ANIMAL_ID
	AND I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID, O.NAME;
SELECT O.ANIMAL_ID, O.NAME
	FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
	AND I.DATETIME > O.DATETIME
ORDER BY I.DATETIME;
SELECT NAME, DATETIME
FROM(
    SELECT I.NAME, I.DATETIME
    FROM ANIMAL_INS I, ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID(+)
        AND O.ANIMAL_ID IS NULL
    ORDER BY I.DATETIME)
WHERE ROWNUM <=3;
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME 
FROM ANIMAL_INS I, ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID
    	AND I.SEX_UPON_INTAKE LIKE '%Intact%'
    	AND O.SEX_UPON_OUTCOME NOT LIKE '%Intact%'
ORDER BY I.ANIMAL_ID;
profile
https://github.com/Dingadung

0개의 댓글