오라클 데이터 타입
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;