드디어 본격적으로 오라클에 대해 배우게 되었다.
0. DATA / DATABASE 란
Data - 관찰의 결과로 나타난 정량적 혹은 정성적인 실제 값을 의미
Database - 한 조직에 필요한 정보를 여러 응용 시스템에서 공용할 수 있도록 논리적으로 연관된 데이터를 모으고, 중복되는 데이터를 최소화 하여 구조적으로 통합, 저장해놓은 것
Database의 특징 4가지
1. 실시간 접근성 - 사용자가 데이터를 요청하면 실시간으로 결과 서비스함
2. 계속적인 변화 - 데이터값은 시간에 따라 항상 바뀜
3. 동시 공유 - DB는 서로다른 업무, 또는 여러사용자에게 동시공유됨
4. 내용에 따른 참조 - DB에 저장된 데이터는 DB의 물리적 위치가 아니라 DB값에 따라 참조됨
DBMS의 특징
CRUD 의 기능을 가짐
Create Read Update Delete
관계 데이터 모델 rDBMS (relational DBMS)
1. SQL이란
Structured Query Language 구조화된 질의 언어
관계형 데이터베이스에서 데이터를 조회하거나 조작하기 위해 사용하는 표준 검색언어
SQL의 종류
DDL (Data Definition Language) : 데이터 정의어 ex) CREATE, ALTER, DROP, TRUNCATE
DML (Data Manipulation Language) : 데이터 조작어 ex) INSERT, UPDATE, DELETE, SELECT (Data Query Language)
(DQL: DML중에서도 select는 따로 정의)
DCL (Data Control Language) : 데이터 제어어 ex) GRANT, REVOKE
TCL (Transaction Control Language) : 트랜젝션 제어어 ex) COMMIT, ROLLBACK, SAVEPOINT
2. Oracle 의 구조
database
ㄴ user (schema)
ㄴ table
ㄴ data
다른 DBMS의 경우 schema가 user 전에 존재하나, Oracle은 생략되어있다.
table의 구조는 실제 데이터를 관리하는 객체로 행단위로 데이터를 관리한다.
table ( = entity, relation )
column 열 ( = field , attribute )
row 행 ( = record, tuple )
domain : 하나의 속성(열)에서 가질 수 있는 원자값의 집합 Y/N, M/F, 1/0
3. 데이터타입
null 여부 : not null (필수), null (선택)
문자형
문자형에는 고정형과 가변형이 있다.
고정형 char (2000 byte)
가변형 varchar2 (4000 byte)
가변길이 long (2gb)
가변길이 clob (4gb) -- character large object 타입
* 가변형 varchar2가 데이터가 부족할 경우 long과 clob을 사용하면 된다.
char형과 varchar2
|
char(10)
|
varchar2(10)
|
korea
|
10byte로 저장
|
5byte로 저장
|
한국
xe버전 : 한글자당 3byte로 저장 ee버전 : 한글자당 2byte로 저장 |
10byte로 저장
|
6byte로 저장
|
대한민국
|
실제 데이터가 12byte라 입력 불가
|
실제 데이터가 12byte라 입력 불가
|
create table tb_charandvarchar(
a char(10),
b varchar2(10)
);
insert into tb_charandvarchar values('korea','korea');
insert into tb_charandvarchar values('한국','한국');
insert into tb_charandvarchar values ('한국','대한민국');--3byte*4
--ORA-12899: value too large for column "KH"."TB_CHARANDVARCHAR"."B" (actual: 12, maximum: 10)
select
a,
lengthb(a),
b,
lengthb(b)
from tb_charandvarchar;
순서대로 실행하고, 마지막 코드 실행(Ctrl + Enter )시 다음과 같은 결과가 나온다.
* 참고로 Ctrl + Enter 는 한줄씩 실행하는 코드이고, JAVA와 달리 sql문은 한줄씩 실행해서 추가해야하며, 삭제가 생각보다 자유롭지 않다.
표에서 예상한 결과와 같다.
숫자형
number([p],[s])
p : 표현할 수 있는 전체 자리수
s : 소수점이하 자리수
ex ) 실제데이터 1234.567을 저장 시도
number
|
1234.567
|
number(7,3)
|
1234.567
|
number(7) or
number(7,0) |
1235
|
number(7,1)
|
1234.6
|
number(7,-2)
|
1200
|
0은 생략이 가능하다. -2면 반대로 10의자리 2자리임을 의미한다.
create table tb_datatype2(
a number,
b number(7,3),
c number(7),
d number(7,1),
e number(7,-2)
);
insert into tb_datatype2 values (1234.567,1234.567,1234.567,1234.567,1234.567);
insert into tb_datatype2 values (1234567.89,1234.567,1234.567,1234.567,1234.567);
select*from tb_datatype2;
실제 예상한대로 결과가 나온다.
그리고 number의 경우 자리 제한이 없기 때문에 더 큰 자리도 입력이 가능하다.
날짜형(DATE)
date : 년월일 시분초
timestamp : 년월일 시분초 밀리초 / 타임존
+ 날짜형 연산 지원
date + number : date (number 일 후 날짜정보를 리턴)
date - number : date (number 일 전 날짜정보를 리턴)
date - date : number (날짜차이를 리턴) 1 = 하루. 날짜는 빼기만 가능.
select
sysdate, -- 현재 시각정보 date 반환
to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss'),
systimestamp as --현재 시각정보 timestamp 반환
current_timestamp
from
dual; --1행짜리 가상테이블
select
to_char(sysdate+1,'yy/mm/dd hh24:mi:ss')tomorrow,
to_char(sysdate,'yy/mm/dd hh24:mi:ss')today,
to_char(sysdate-1,'yy/mm/dd hh24:mi:ss')yesterday,
to_char(sysdate+(25/24),'yy/mm/dd hh24:mi:ss') "25시간뒤",
(sysdate+1)-sysdate
from
dual;
create table tb_datatype3(
a date,
b TIMESTAMP,
c timestamp with time zone
);
--drop table tb_datatype3; table 삭제 방법
insert into tb_datatype3 values(sysdate, systimestamp,systimestamp);
select*from tb_datatype3;
커밋과 롤백
그리고 이 모든 것을 저장하기 위해서는, commit 과 rollback을 알아야 한다.
먼저 cmd창에서 sqlplus를 검색하고, show user; 를 친 후 레코드를 확인해보자.
실제로 오라클에서는 삽입되었다고 뜨지만,
명령프롬프트에는 뜨지 않는다. 이 경우, commit이 필요하다.
작업을 완료한 후, 오라클에서 commit; 을 입력하고 Ctrl+Enter 하면
다음과 같이 뜨고
다시 검색해보면 자료가 들어간 것을 확인할 수 있다.
rollback;은 마지막 commit시점으로 되돌리는 명령어이다. 작업내용(메모리상)을 취소하는 방법이지, 자바에서 undo 같은게 아니다.
commit; 은 메모리상 작업을 실제 db에 적용하는 명령어이다. 커밋 후에는 롤백을 해도 지워지지 않는다.
4. DQL
Data Query Language : 테이블의 데이터를 검색(추출)하기 위해 사용하는 sql
DML의 하위 그룹으료 분류
데이터 조회결과를 Result Set(결과 집합)이라고 함.
조회시 0행 이상의 결과집합을 리턴받음.
select (필수) 5. 조회할 컬럼
from (필수) 1. 조회할 테이블
where 2. 조건절 (true - 결과집합에 포함, false - 결과집합에 제외)
group by 3. 행을 특정컬럼 기준으로 그룹핑
having 4. 그룹핑된 결과에 대한 조건절
order by 6. 행간 정렬
숫자는 실제 처리 순서이고, 이 순서대로 코드를 작성하는 것을 추천한다.
ex) 다음과 같은 테이블이 존재할 때,
4-1 . 사원테이블에서 이름, 이메일, 전화번호, 입사일 출력
select
emp_name,
email,
phone,
hire_date
from
employee;
4-2. 사원테이블에서 급여가 250만원 이상인 사원의 이름과 급여를 조회
select
emp_name,
salary
from
employee
where
salary>=2500000;
4-3. 사원테이블에서 직급코드가 J3 인 사원조회(사원명, 직급코드, 전화번호)를 사원명으로 오름차순
select
emp_name,
job_code,
phone
from employee
where job_code='J3'
order by emp_name asc;
여기서 주의할 점은, SQL의 대소문자는 구분하지 않으나, 자료의 대소문자는 구분한다는 점이다. 즉 job_code='j3'로 찾으면 오류가 발생한다.
이렇게 자료형과 DQL의 기본에 대해 알아보았다.
굉장히 기초부분을 배웠는데, 새로 알게된 지식이 넘 많아서 정리하는데 시간이 필요했다.
정리해보니까 별거 아닌거 같기도 하고...
확실히 kt에서 첫 이미지가 재미있었던 과목이라 그 이후에 배우는 것들이 더 기대가 된다.