본문 바로가기

DATABASE

DATABASE(3) - 데이터 타입/ALTER /ADD/MODIFY/DROP/INSERT /WHERE /UPDATE/DELETE/DQL/DISTINCT

오라클 데이터 타입
  1. 문자 타입(문자열만 처리)
     n 만큼의 크기를 지정. n은 입력하는 문자열의 길이.
    - CHAR(n) - 고정 길이 문자열(n byte)
    - VARCHAR2(n) - 가변길이 문자열. 입력한 데이터에 따라
    저장 공간의 크기가 달라짐.(n byte)
    - NCHAR(n) - n개의 글자 만큼 저장.
    - NVARCHAR2(n) - n개의 글자 만큼 저장.
  2. 숫자 타입
    NUMBER(m, n) : m - 전체 자리수, n - 소수의 자리수
  3. 날짜 타입
    DATE : YYYY-MM-DD HH:MI:SS
    
복습 예제)
학생 주소록 프로그램용 테이블(ADDRESSBOOK)

학생명(STUDENT) - 3자
생일(BIRTH) - 날짜
전화번호(PHONE) - 11자
비상연락번호(EMERGENCY) - 11자

* 제약조건 없음.

테이블 관리(ALTER TABLE)
  ALTER : 생성된 테이블의 컬럼(속성)을 수정하기 위한 명령어.
     관리 작업
  1. 컬럼 추가 (ADD)
     ALTER TABLE [table_name] 
     ADD [col_name] [data_type(size)];

  2. 컬럼 수정 (MODIFY)
     ALTER TABLE [table_name]
     MODIFY [col_name] [re_data_type(resize)];
   ** 데이터가 있을 경우 타입 변경을 불가!(모든 경우)

  3. 컬럼 삭제 (DROP)
     ALTER TABLE [table_name]
     DROP COLUMN [col_name];



DML(데이터 조작어)
  데이터의 삽입, 수정, 삭제

  1. 삽입(Insert)
    테이블에 데이터를 삽입하는 역할
  문법>
  INSERT INTO [table_name] ([col_name], [col_name],.. )
  VALUES ('데이터', '데이터',...);

  INSERT INTO [table_name]
  VALUES ('데이터', '데이터',...);


  * WHERE 절
  조건을 지정할 때 사용하는 명령어 절
  이 위치에 설정된 조건에 맞는 튜플(레코드)만 
  SQL 명령어의 영향을 받는다.

  2. 수정(UPDATE)
    테이블의 데이터를 수정. 
    조건이 없을 경우 모든 튜플(레코드)를 수정.
    WHERE 절과 조합하여 조건에 맞는 해당 레코드만 수정.
  문법>
  UPDATE [table_name]
  SET col_name1 = 값, col_name2 = 값, ...
  WHERE 조건


  3. 삭제(DELETE)
    테이블의 데이터를 삭제.
    조건이 없을 경우 모든 레코드를 삭제.
    WHERE 절과 조합하여 조건에 맞는 해당 레코드만 삭제.
  문법>
  DELETE FROM [table_name]
  WHERE 조건


DQL(Data Query Language, 데이터 질의어)
  테이블의 레코드를 검색하는 명령어
  문법>
  SELECT [DISTINCT] {*, col_name [alias], ... }
  FROM table_name
  [WHERE 조건]
  [ORDER BY {col_name} [ASC | DESC];


* SQL문(쿼리문) 작성법(권장사항)
  1. SQL문은 대소문자 구분 없음.
  2. 한 문장은 여러줄로 작성할 수 있음.
  3. (일반적으로) 키워드는 대문자로, 테이블이름이나 컬럼명은
     소문자로 작성.
  4. 문장의 마지막에는 ';'를 기술.(must)


SELECT 연산자
  1. 비교 연산자
    =, !=, >, <, >=, <=

   '=' 연산자의 차이(JAVA VS SQL)  
     - JAVA 같다 : ==
     - 오라클에서 같다 : =
     - JAVA 대입한다 : =
     - 오라클에서 대입한다 : =

  2. 논리 연산자
    AND, OR, NOT
    BETWEEN a AND b
    IN (list)
    - NOT을 조합하여 범위 밖의 레코드를 검색

  3. 문자열 검색
    LIKE - 컬럼의 데이터를 문자열로 검색.
    - 모르는 부분에 대한 처리를 위한 특수 문자.
     % : 여러 글자 표현
     _ : 한글자 표현

  4. IS NULL/IS NOT NULL
    NULL인 데이터 또는 NULL이 아닌 데이터를 
    출력하기 위해 사용.


ORDER BY : 검색 결과의 정렬
특정 컬럼을 지정하여 검색된 결과를 정렬한다.
ASC : 오름차순 정렬
DESC : 내림차순 정렬
사용 예>
ORDER BY ename DESC; // Z 부터 내림 차순 정렬





/*
테이블 생성 : CREATE TABLE 테이블명(
속성명1 타입 제약조건,
속성명2 타입 제약조건,
.....
);
*/

CREATE TABLE EMP2(
    EMPNO NUMBER CONSTRAINT emp_pk_empno PRIMARY KEY,
    ENAME VARCHAR2(10) NOT NULL, --NULL 허용하지 않음 
    JOB VARCHAR2(9),  -- 업무
    MGR NUMBER, -- 부서장 직원 번호
    HIREDATE DATE, -- 고용일자
    SAL NUMBER, -- 급여
    COMM NUMBER, -- 수수료
    DEPTNO NUMBER -- 부서번호
);

-- 부서 테이블 DEPT2를 만들어 주세요.
-- 속성 : 부서번호(DEPTNO, 숫자, 기본키),
--       부서명(DNAME, 문자열 40자)
--       위치(LOC, 문자열 50자)

CREATE TABLE DEPT2(
    DEPTNO NUMBER CONSTRAINT dept_pk_deptno PRIMARY KEY,
    DNAME VARCHAR2(40),
    LOC VARCHAR2(50)
);

-- 모든 테이블 조회
SELECT table_name FROM USER_TABLES;

-- NOT NULL 제약조건 : 반드시 값을 입력해야 한다는 제약조건
CREATE TABLE EMP3(
    --ENAME VARCHAR(20) CONSTRAINT emp_nn_ename NOT NULL : 정식적으론 이렇게 쓰는게 맞지만 아래와 같이 간단하게 쓴다
    ENAME VARCHAR(20) NOT NULL
);

-- UNIQUE 제약조건 : 데이터의 유일성 보장 조건(중복 불가)
CREATE TABLE DEPT3(
    --DEPTNO NUMBER CONSTRAINT dept_uk_deptno UNIQUE
    DEPTNO NUMBER UNIQUE
);

-- CHECK : 데이터를 특정 범위로 제한
CREATE TABLE EMP4(
    GENDER VARCHAR2(1) CONSTRAINT emp_ck_gender CHECK (GENDER IN ('M','F'))
);

INSERT INTO EMP4 VALUES ('M');

COMMIT;

-- DEFAULT : 값을 입력하지 않아도 지정한 값으로 입력 처리.
CREATE TABLE MEMBERTBL (
    MID VARCHAR2(20) CONSTRAINT mpk_mid PRIMARY KEY,
    MNAME VARCHAR2(20) NOT NULL,
    MPASS VARCHAR2(16) NOT NULL,
    MGRADE VARCHAR2(10) DEFAULT 'silver'
);

INSERT INTO MEMBERTBL (MID, MNAME, MPASS)
-- 실제 테이블의 컬럼 이름.. 테이블 순서대로 쓸 필요는 없음.
VALUES ('tester', '홍길동', '1234');
-- 앞에 작성한 컬럼의 순서대로 넣어주면 됨
commit;

select * from MEMBERTBL;

-- 기본키 만드는 두번째 방법
CREATE TABLE EMP10 (
    EMPNO NUMBER,
    ENAME VARCHAR2(10) NOT NULL,
    DEPTNO NUMBER, -- 부서번호
    CONSTRAINT emp10_pk_empno PRIMARY KEY (EMPNO),
    CONSTRAINT emp10_fk_deptno FOREIGN KEY (DEPTNO)
    REFERENCES DEPT(DEPTNO)
-- 제약조건을 밑에 줄에 쓰게되면 여러개 컬럼중 어떤 속성의 키로 사용할건지 지정을 해주어야함
);
-- no matching unique or primary key for this column-list
-- : 외래키는 반드시 다른 테이블의 기본키가 와야함. 가지고올 테이블의 기본키를 설정을 해주어야함.
-- 중복되는 데이터를 외래키로 사용할 수 없음.

-- 기본키를 설정하는 세번째 방법
ALTER TABLE DEPT 
ADD CONSTRAINT dept1_pk_deptno PRIMARY KEY (DEPTNO);



--학생 주소록 만들기
CREATE TABLE ADDRESSBOOK(
    STUDENT NVARCHAR2(3), 
    BIRTH DATE, 
    PHONE NVARCHAR2(11),
    EMERGENCY NVARCHAR2(11)
);

-- 데이터의 유일성을 보장하는 컬럼 부재 (기존 속성들은 중복 가능하기 때문에)
-->> 코드화된 컬럼 추가 : SNUMBER NCHAR(3)
ALTER TABLE ADDRESSBOOK ADD SNUMBER NCHAR(3);

-- (가정) 비상연락번호 필요 없어짐 -> EMERGENCY 컬럼 삭제
ALTER TABLE ADDRESSBOOK DROP COLUMN EMERGENCY;

SELECT * FROM ADDRESSBOOK;

-- 유일성 코드 SNUMBER의 크기 변경 : 3 >> 6
ALTER TABLE ADDRESSBOOK MODIFY SNUMBER NVARCHAR2(6);

ALTER TABLE ADDRESSBOOK MODIFY SNUMBER NCHAR(10) NOT NULL; -- 수정할 때 제약조건도 추가할 수 있음.

-- SNUMBER의 타입 변경
ALTER TABLE ADDRESSBOOK MODIFY SNUMBER NUMBER(10); --타입을 수정할 수 있으나 데이터가 들어있는 경우엔 변경 불가 (BUT! CHAR<->VARCHAR는 가능)--확인해보기

-- 테이블 삭제 DROP 명령어 
DROP TABLE ADDRESSBOOK;


 

1. 오라클 데이터 타입
  

1. 문자 타입(문자열만 처리)
     n 만큼의 크기를 지정. n은 입력하는 문자열의 길이.
    - CHAR(n) - 고정 길이 문자열(n byte)
    - VARCHAR2(n) - 가변길이 문자열. 입력한 데이터에 따라
    저장 공간의 크기가 달라짐.(n byte)
    - NCHAR(n) - n개의 글자 만큼 저장.
    - NVARCHAR2(n) - n개의 글자 만큼 저장.

2. 숫자 타입
    NUMBER(m, n) : m - 전체 자리수, n - 소수의 자리수
3. 날짜 타입
    DATE : YYYY-MM-DD HH:MI:SS

 

복습 예제)
학생 주소록 프로그램용 테이블(ADDRESSBOOK)

학생명(STUDENT) - 3자
생일(BIRTH) - 날짜
전화번호(PHONE) - 11자
비상연락번호(EMERGENCY) - 11자

* 제약조건 없음.

 

 


2. 테이블 관리 (ALTER TABLE)
 

ALTER : 생성된 테이블의 컬럼(속성)을 수정하기 위한 명령어.
     관리 작업
  1. 컬럼 추가 (ADD)
     ALTER TABLE [table_name] 
     ADD [col_name] [data_type(size)];

  2. 컬럼 수정 (MODIFY)
     ALTER TABLE [table_name]
     MODIFY [col_name] [re_data_type(resize)];
   ** 데이터가 있을 경우 타입 변경을 불가!(모든 경우)

  3. 컬럼 삭제 (DROP)
     ALTER TABLE [table_name]
     DROP COLUMN [col_name];



DML(데이터 조작어)
  데이터의 삽입, 수정, 삭제

  1. 삽입(Insert)
    테이블에 데이터를 삽입하는 역할
  문법>
  INSERT INTO [table_name] ([col_name], [col_name],.. )
  VALUES ('데이터', '데이터',...);

  INSERT INTO [table_name]
  VALUES ('데이터', '데이터',...);


  * WHERE 절
  조건을 지정할 때 사용하는 명령어 절
  이 위치에 설정된 조건에 맞는 튜플(레코드)만 
  SQL 명령어의 영향을 받는다.

  2. 수정(UPDATE)
    테이블의 데이터를 수정. 
    조건이 없을 경우 모든 튜플(레코드)를 수정.
    WHERE 절과 조합하여 조건에 맞는 해당 레코드만 수정.
  문법>
  UPDATE [table_name]
  SET col_name1 = 값, col_name2 = 값, ...
  WHERE 조건


  3. 삭제(DELETE)
    테이블의 데이터를 삭제.
    조건이 없을 경우 모든 레코드를 삭제.
    WHERE 절과 조합하여 조건에 맞는 해당 레코드만 삭제.
  문법>
  DELETE FROM [table_name]
  WHERE 조건


DQL(Data Query Language, 데이터 질의어)
  테이블의 레코드를 검색하는 명령어
  문법>
  SELECT [DISTINCT] {*, col_name [alias], ... }
  FROM table_name
  [WHERE 조건]
  [ORDER BY {col_name} [ASC | DESC];







/*
    DML(데이터 조작어)
    INSERT(삽입), UPDATE(수정), DELETE(삭제)
    
*/

--EMP 테이블에 데이터 추가
INSERT INTO EMP 
VALUES (7963, 'SMITH', 'CLERK', 7902, TO_DATE('80/12/17'), 800, NULL, 20);
COMMIT;

SELECT * FROM EMP;

INSERT INTO DEPT (DEPTNO, DNAME)
VALUES (50, 'MANAGEMENT');

SELECT * FROM DEPT;

INSERT INTO ADDRESSBOOK VALUES ('강은일', TO_DATE('95/08/07'), '01012341111', '001');
INSERT INTO ADDRESSBOOK VALUES ('강은이', TO_DATE('95/09/07'), '01012341111', '002');
INSERT INTO ADDRESSBOOK VALUES ('강은삼', TO_DATE('95/10/07'), '01012341111', '003');
INSERT INTO ADDRESSBOOK VALUES ('강은사', TO_DATE('95/11/07'), '01012341111', '004');
INSERT INTO ADDRESSBOOK VALUES ('강은오', TO_DATE('95/12/07'), '01012341111', '005');

-- 생일을 같은 날짜로 수정
UPDATE ADDRESSBOOK 
SET BIRTH = SYSDATE;
COMMIT;

SELECT * FROM ADDRESSBOOK;

-- EMP 테이블에서 사원번호가 7902번인 사원의 부서 번호를 30으로 변경
UPDATE EMP
SET DEPTNO = 30
WHERE EMPNO = 7902;

SELECT DEPTNO FROM EMP
WHERE EMPNO = 7902;

-- 부서번호 20번의 사원들 급여를 10% 인상.
UPDATE EMP 
SET SAL = SAL * 1.1 
WHERE DEPTNO = 20;

SELECT SAL FROM EMP WHERE DEPTNO = 20;

-- 사원번호 7963번 사원의 데이터를 삭제
DELETE FROM EMP
WHERE EMPNO = 7963;

-- SELECT 예시1) 이름과 사원번호 출력
SELECT * FROM EMP;

SELECT EMPNO, ENAME 
FROM EMP;

-- SELECT 예시2) 사원이름, 급여 출력
SELECT ENAME, SAL 
FROM EMP;

-- 별칭 사용
SELECT ENAME AS 이름, SAL AS 급여 
FROM EMP;

-- 별칭 사용 시 AS를 안 적어줘도 됨.
SELECT ENAME 이름, SAL 급여 
FROM EMP;

-- 사원들의 급여가 얼마씩인지 알고 싶다. (누가 얼마를 받는지가 아니라 급여체계를 구할 때) : DISTINCT -> 중복 제거
SELECT DISTINCT SAL
FROM EMP;


-- 조건절(WHERE)
-- 부서번호가 10번인 부서의 사원번호와 이름 구하기
SELECT EMPNO, ENAME
FROM EMP
WHERE DEPTNO = 10;

-- 급여가 2000 이상인 사원의 사원번호와 이름, 부서번호 구하기
SELECT EMPNO, ENAME, DEPTNO, SAL
FROM EMP
WHERE SAL >= 2000;

/*
    JAVA에서 같다 : ==
    오라클에서 같다 : =
    JAVA에서 대입한다 : =
    오라클에서 대입한다 : =
*/
    
SELECT EMPNO, ENAME, DEPTNO, SAL
FROM EMP
WHERE SAL != 3000;