[Oracle] 데이터 타입, DDL, DML

이혜원·2024년 8월 1일

Oracle

목록 보기
1/6

데이터 타입

char : 고정형 문자형 데이터 타입
varchar2 : 가변형 문자형 데이터 타입
number : 숫자형 데이터 타입

  • char vs varchar2
    고정형인 char에 (10)의 데이터 공간을 할당하고 3글자만 입력한다면 10byte만큼 데이터 공간을 사용한다.
    하지만 varchar2에 동일하게 (10)만큼의 데이터 공간을 할당하고 3글자만 입력한다면 가변형 문자형인 varcahr2는 3byte만큼의 데이터 공간을 사용한다.
    따라서 대부분 varchar2를 사용한다.

  • number
    숫자 타입은 4가지가 있는데 대부분 Number형을 사용한다.
    Number(p,s) 이런식으로 사용할 수 있는데
    P는 소숫점을 포함한 전체 자리수를,
    S는 소숫점 자리수를 의미한다.
    P, S를 입력하지 않으면 저장 데이터의 크기에 맞게 자동으로 조절된다.

  • number(p,s) : 예시

입력값 타입 저장되는 값
123.89 NUMBER 123.89
123.89 NUMBER(3) 124
123.89 NUMBER(5,2) 123.89
123.89 NUMBER(6,1) 123.9
123.89 NUMBER(3,2) ERROR
123.89 NUMBER(4,2) ERROR

  • date

가장 일반적으로 사용하는 날짜 데이터 타입은 date.

  • LOB

LOB이란 Large Object의 약자로 대용량 데이터를 저장할 수 있는 데이터 타입이다. 일반적으로 그래픽, 이미지, 사운드 등 비정형 데이터를 저장할 때 사용한다.


서브쿼리(sub query)란?

Main Query에 반대되는 개념으로 이름을 붙인것.
메인쿼리를 구성하는 소단위 쿼리로 select, insert, delete, update 절에서 모두 사용 가능하다.
서브쿼리의 결과 집합을 메인쿼리가 중간 결과값으로 사용할 수 있으며 서브쿼리 자체는 일반 쿼리와 다를바가 없다.

  • 예제문제1 : 평균 급여보다 적게 받는 사원의 데이터 출력.

SELECT AVG(SALARY)
FROM EMPLOYEES e
;

↳ 평균 급여를 출력하는 쿼리.

SELECT *
FROM EMPLOYEES e
WHERE SALARY < (SELECT AVG(SALARY) FROM EMPLOYEES e )
;

↳ 평균급여를 출력하는 쿼리를 WHERE절에서 서브쿼리로 사용하여 평균 급여(SALARY)보다 적게 받는 사원의 데이터를 출력함.


  • 예제문제2 : 지역 아이디가 'US'인 부서 정보 출력.

SELECT LOCATION_ID
FROM LOCATIONS l
WHERE COUNTRY_ID = 'US'
;

↳ LOCATIONS 테이블에서 지역 아이디값이 'US'인 데이터를 출력하는 쿼리

SELECT *
FROM DEPARTMENTS d
WHERE LOCATION_ID IN ( SELECT LOCATION_ID
FROM LOCATIONS l
WHERE COUNTRY_ID = 'US')
;

↳ 지역 아이디값이 'US'인 데이터를 출력하는 쿼리를 서브쿼리로 사용하여 관련 부서 정보를 출력함.


  • 예제문제3 : 월급이 가장 적은 사원의 정보 출력.

SELECT MIN(SALARY)
FROM EMPLOYEES e
;

↳ EMPLOYEES 테이블에서 급여(SALARY)의 최솟값을 출력하는 쿼리

SELECT *
FROM EMPLOYEES e
WHERE SALARY = (SELECT MIN(SALARY)
FROM EMPLOYEES)
;

↳ 급여 최솟값을 출력하는 쿼리를 서브쿼리로 사용하여 월급이 가장 적은 사원의 정보를 출력함.


  • 예제문제4 : EMPLOYEES 테이블에서 (가장 많은 사원이 속해 있는 부서 번호)와 사원수를 출력하라.
    SELECT MAX(COUNT(*))
    FROM EMPLOYEES
    GROUP BY DEPARTMENT_ID
    ;

↳ EMPLOYEES 테이블에서 DEPARTMENT_ID를 GROUP BY하여 COUNT로 결과값을 출력하면 부서별 인원수가 알 수 있다. 이것을 MAX()로 최댓값을 출력하면 부서별 가장 많은 사원수를 알 수 있다.

SELECT DEPARTMENT_ID , COUNT()
FROM EMPLOYEES e
GROUP BY DEPARTMENT_ID
HAVING COUNT(DEPARTMENT_ID) = (SELECT MAX(COUNT(
)) FROM EMPLOYEES GROUP BY DEPARTMENT_ID )
;

↳ HAVING절에 부서별 최대 사원수를 출력하는 쿼리를 서브쿼리로 넣어 부서별 인원(COUNT(DEPARTMENT_ID))이 최대 사원수(서브쿼리)와 동일한 값을 출력하는지 확인하고 결과적으로 COUNT(*)를 사용하여 이에 해당하는 사원수를 출력한다.


DDL(Data Definition Language)

데이터의 구조를 정의하기 위한 테이블 생성, 삭제 같은 명령어

  • create : 테이블 생성
  • drop : 테이블 삭제
  • alter : 테이블 수정
  • truncate : 테이블에 있는 모든 데이터 삭제
  • create

create table employees2 (
employee_id number(10),
name varchar2(20),
salary number(7,2)
);

↳ employees2라는 이름의 테이블에
employee_id라는 이름에 number(10) 데이터 타입을 가진 컬럼,
name이라는 이름에 varchar(20) 데이터 타입을 가진 컬럼,
salary라는 이름에 number(7,2) 데이터 타입을 가진 컬럼
을 생성하였다.

  • create : 기존 테이블과 동일하게 작성하는 방법

CREATE TABLE EMPLOYEES3
AS
SELECT FROM EMPLOYEES2 e
;
SELECT
FROM EMPLOYEES3;

↳ 기존의 EMPLOYEES2 테이블과 동일한 구조의 EMPLOYEE3 테이블을 생성함.


  • drop

DROP TABLE EMPLOYEES3 ;

↳ 기존에 있던 EMPLOYEES3 테이블을 삭제함.


  • alter

ALTER TABLE EMPLOYEES2 ADD(
manager_id varchar2(10)
);

↳ 기존의 EMPLOYEES2 테이블에
MANAGER_ID라는 이름과 varchar2(10) 데이터 타입을 가진 컬럼을 추가함.

  • alter : modify 수정

ALTER TABLE EMPLOYEES2 modify(
manager_id varchar2(20)
);

↳ 기존의 EMPLOYEES2 테이블에 있던 MANAGER_ID의 데이터 타입을
varchar2(10)에서 varchar(20)으로 수정함.

  • alter : drop 삭제

ALTER TABLE EMPLOYEES2 DROP COLUMN manager_id;

↳ 기존의 EMPLOYEES2 테이블에 있던 MANAGER_ID 컬럼을 삭제함.


  • truncate : 테이블 데이터 전체 삭제

TRUNCATE TABLE EMPLOYEES2 ;
↳ 기존에 있던 EMPLOYEES2 테이블의 데이터를 전체 삭제함. (테이블은 남아있음)


데이터 조작어(Data Maniquation Language)

데이터 조회 및 변형을 위한 명령어

  • select : 데이터 조회
  • insert : 데이터입력
  • update : 데이터 수정
  • delete : 데이터 삭제
  • insert

INSERT INTO EMPLOYEES2 e values(1, '홍길동', 30000);

↳ 기존에 있던 EMPLOYEES2 테이블에 행을 추가함
(1, '홍길동', 30000)은 각각 순서대로
1 -> employee_id number(10),
홍길동 -> name varchar2(20),
3000 -> salary number(7,2)

이와같이 저장됨.

insert into 테이블명(컬럼1, 컬럼2, ...)
values (값1, 값2, ...);

↳ 이런식으로 컬럼을 지정해서 값을 저장할 수도 있음.


  • update

update 테이블 set 컬럼1 = 값, 컬럼2 = 값, ...
where 조건...;

ex. UPDATE SAMPLE SET DEPTNO = 50 WHERE deptName = '영업부';


  • delete

delete from 테이블명
where 조건...;

// from은 생략 가능
ex. delete sample where deptName='영업부';

0개의 댓글