본문 바로가기

JAVA 공책/수업 메모

DB(Oracle)_Database&Oracle

Database


{데이터 저장}

- 내용
1. 변수: 메인 메모리에 저장한 것이므로 프로그램을 종료하면 모두 사라진다.
2. file: file에 저장하면 디스크(보조 기억장치)에 저장한 것이므로 직접 삭제를 하지 않는 한 데이터는 모두 보관이 됩니다.
기록은 편리하지만 데이터가 순차적으로 저장되기 때문에 데이터를 순서대로 검색해야 해서 검색 효율이 나쁘고
데이터를 저장할 옵션 설정이 불가능하기 때문에 중복된 데이터가 저장될 가능성도 항상 존재합니다.
3. database: 특별한 형식의 file을 이용하는 것인데 일반 파일보다 저장 오버헤드는 크지만 검색이 편리하고
저장옵션을 설정할 수 있어서 데이터를 좀 더 안전하고 사용하기 편리하게 저장할 수 있습니다.
일반적으로 데이터베이스는 별도의 컴퓨터에 만들어 두고 접속해서 사용하는 경우가 많습니다.

{DBMS 종류}

1. 관계형 데이터베이스: 테이블의 집합으로 데이터를 표현하는 데이터베이스
Oracle, MySQL, MSSQL, DB2, sqlite...

[Oracle]
1) 대표적인 소프트웨어
현재 가장 많이 사용되는 상용[각주:1] 관계형 데이터베이스
가장 안정적.
비용이 많이 듬.
대기업이나 공공기관에서 주로 이용.

[MySQL]
(Maria DB)
open source로 출발했으나 지금은 Oracle이 인수해서 상용화된 버전이 있다.
open source 진영에서 동일한 엔진으로 Maria DB를 만들어서 무료배포하고 있다.
소규모 기업에서 많이 사용

[MSSQL]
Microsoft(MS)에서 만든 상용화 된 데이터베이스
게임회사에서 많이 쓴다.
약 1000만원 정도 하며 Oracle 살 돈은 안되고 open source 데이터베이스는 관리자가 없을 때 주로 쓴다.

[DB2]
IBM에서 만든 데이터베이스.
주로 금융권에서 사용

[SQLite]
스마트 폰에 내장된 관계형 데이터베이스
Embedded,IOT에서도 이용

[Tibero]
우리나라 TMax에서 만든 데이터베이스
공공기관에서 많이 사용하고 있는 추세

2. NoSQL
Map의 Collection으로 데이터를 표현하는 데이터베이스
Not Only SQL의 약자로, SQL을 이용하지 않고 자바스크립트 함수 형식으로 데이터를 조작
테이블을 만들지 않기 때문에 데이터의 구조 변화에 빠르게 대응할 수 있는 데이터베이스입니다.
트렌잭션의 개념이 없어서 관계형 데이터베이스보다 안정적이지 못합니다.
MongoDB(c++), Cassandra(Java - Linux에서만 가능), Hive 등등이 있습니다.

3. 에자일
반응을 보고 고쳐가는 것 - 마이크로서비스를 가져다 붙이는 것.
요즘에는 에자일식으로 데이터베이스를 다루는 것을 선호함.
(NoSQL를 하나 배워서 에자일 형식으로 할 수 있게 연습하기.)

*참고
Oracle은 기회가 되면 꼭 배울 것! 다른 건 몰라도 오라클은 배워두면 대접을 받는다. 외국에 오라클 유니버시티가 있으니 배우고 와도 대접을 받는다.
게임 회사는 MSSQL를 많이 쓴다.
오라클은 비싸고 MySQL은 못 믿을 때 많이 쓴다.

*참고
MongoDB로 게시판을 만들 수 있거나 프로젝트를 진행해봤으면 취업은 걱정 없다.
각 한개씩은 다룰 수 있도록 한다.


{데이터베이스 사용}


[Database Server 가 필요]
1) 오라클 설치

[Database Modeling Tool을 사용]
1) 데이터 베이스 설계를 하고 자동으로 테이블을 생성하도록 할 때 필요
2) ER - Win이 가장 유명합니다.

[Database 접속도구]
1) 데이터 베이스에 SQL을 실행하기 위한 프로그램

{Oracle설치}


[설치확인]

- 콘솔 창에서sqlplus 라고 입력하고 아이디는 system 비밀번호는 설치할 때 설정한 비밀번호를 입력해서 제대로 설치되었는지 확인



- 서비스에서 확인 : Oravle Service 와 Oracle TNS Listener(외부에서 읽기) 확인

느리면 우클릭, 시작유형을 수동으로 바꿈. -> 오라클을 껐다 켰다 할 수 있다.


{Oracle 접속도구}

- 오라클을 설치하면 sqlplus라는 접속도구가 자동으로 설치가 됩니다.

관리자는 sqlplus를 많이 사용합니다.

오라클을 전문적으로 다룰 때는 sqlplus에서 작업하는 것이 좋습니다.

- sqldeveloper.oracle에서 무료로 제공하는 java로 만든 gui 접속도구.

java로 만든 프로그램은 jre가 설치되어 있어야만 실행이 가능.


- toad: 개발 현업에서 많이 사용하는 데이터베이스 접속도구

무료도 있기는 하지만 근본적으로는 유료.

*참고

메모장에 옮겨적어 놓고 복사해서 붙여넣기한다(네트웍, 데이터베이스)


{Oracle 을 설치하고 난 후 처음 제공되는 계정}


- sysdva: 슈퍼 관리자

- system: 관리자 계정

- 데이터베이스에 문제가 생긴 경우 sysdba에서 작업 그 이외의 경우는 system에서 작업합니다.

오라클은 기본적으로 1521 번 포트를 사용하도록 설치되고 8080번 포트도 사용합니다.

데이터베이스 이름을 SID라고 하는데 Express Edition은 기본으로 xe이라는 이름으로 설치되고 enterprise edition을 설치하면 orcl로 설치됩니다.


1. 실습용 계정 생성 - 시스템으로 로그인해서 생성

오라클에서는 보통 scott이나 hr계정으로 연습을 합니다.

scott을 만들 때는 보통 비밀번호를 tiger로 합니다.


이곳에 명령어 입력.

scott 계정 생성하는 코드.

입력한 명령어를 선택하고 실행키를 클릭.

스크립트 출력 부분을 통해 제대로 시행이 되었는지 확인 가능.




--scott 계정을 생성하고 접속 권한을 부여하는 명령입니다.
GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO scott 
IDENTIFIED BY tiger;

--scott에게 테이블 스페이스를 사용할 수 있도록 해주는 명령입니다.
ALTER USER scott DEFAULT TABLESPACE USERS;

ALTER USER scott TEMPORARY TABLESPACE TEMP;



2. scott 계정에 샘플데이터베이스를 삽입

scott.sqp 파일의 내용을 실행하면 됩니다.


1)scott 계정으로 로그인

우클릭 - 접속해제 / 우클릭 - 접속(scott/tiger)

->실습을 할 때 관리자 계정을 사용하는 것은 위험한 행동입니다.

그래서 보통 계정을 생성을하고 사용하는데,

오라클에서 제공하는 샘플 sql이 전부 scott이나 hr로 되어 있어서 계정을 scott이나 hr로 생성했습니다.

그리고 scott이 테스트 해 볼 데이터는 scott.sql이라는 파일로 제공이 됩니다. 이 데이터를 삽입해서 사용합니다.

3)샘플 데이터 확인


select * from emp;


명령어를 입력해서 제대로 등록이 되었는지 확인할 수 있습니다.

->최근에 데이터베이스를 다운받은 경우는 12개의 데이터가 나오고 예전 버전에서는 14개의 데이터가 조회됩니다.



{Oracle 을 설치하고 난 후 처음 제공되는 계정}


1. desc 테이블이름;
- emp, dept, salgrade테이블의 구조확인

empno 사원번호, 숫자4, 프라머리 키

ename 사원이름, 문자10

job 업무, 문자9

mgr 관리자 사원번호, 숫자4

hiredate 입사일, 날짜형식

sal 급여, 숫자7

comm 상여금, 숫자 7

deptno 부서번호 dept 테이블의 외래키 숫자2


2. dept 테이블 - 부서 테이블

deptno 부서번호, 숫자2자리, primary key

dname 부서명, 문자 14자리

loc 위치, 문자 13자리


3. salgrade테이블 호봉 테이블

grade 등급, 숫자

losal 최저급여

hisal 최고급여


{Select}

데이터를 조회할 때 사용하는 구문. 6개의 절로 구성.


- select 조회하고자 하는 컬럼이나 연산식 또는 *

- from 조회하고자 하는 테이블이름을 나열

- where 조회하고자 하는 조건을 기술

- group by 그룹화하고자 하는 컬럼이나 연산식

- having 그룹화(group by) 이후의 조건

- order by  정렬할 컬럼이나 연산식을 나열


- select와 from은 필수

- 실행순서 : from - where - group by - having - select - order by

- 예약어와 테이블이름 그리고 컬럼이름은 대소문자 구분을 하지 않습니다.

- 예약어 다음에는 반드시 한 칸 이상의 공백이 있어야 합니다.


1. 테이블의 전체 데이터 조회

select*

from 테이블이름

ex) emp 테이블의 전체 데이터를 조회


select *
from emp;


2. 특정 컬럼에 해당하는 데이터만 조회
select 컬럼이름을 나열
from 테이블이름;

ex) emp테이블에서 ename과 job을 조회


select ename, job
from emp;

3. 컬럼의 연산식(+,-,*,/)을 조회

데이터베이스에서는 날짜도 산술 연산이 가능.

- 하루를 1로 보고 계산.

ex) emp 테이블에서 ename 과 sal*12 한 결과를 조회.


ex) emp 테이블에서 ename 과 입사한 지 몇일이 지났는지 조회

입사일은 hiredate 컬럼이고 현재 시간 및 날짜는 sysdate


select ename, sal*2
from emp;


select ename, sysdate-hiredate
from emp;

4. 컬럼에 별명을 설정해서 출력.

- 별명은 한 칸 공백을 주고 설정. (단, 대문자나 공백이 있으면 별명을 ""로 감쌈)

ex) emp 테이블에서 ename 과 sal*12를 조회. 단, sal*12는 년봉이라고 출력


select ename, sal*12 년봉
from emp;

select ename, sal*12 "년 봉"
from emp;

- 연산식이나 함수의 결과를 조회할 때는 별명을 사용하는 것이 좋습니다.


5. 데이터베이스 에서 NULL

- 데이터베이스는 모든 자료형에 대해서 NULL을 대입할 수 있습니다.

- 데이터베이스에서는 NULL을 실제로 저장하는 것이 아니고 NULL을 판단할 수 있는 별도의 바이트를 할당해서 NULL 여부를 저장

- NULL 과 산술연산을 수행하면 NULL 이 됩니다.

- emp 테이블의  comm이라는 컬럼은 NULL을 포함하고 있습니다.

ex) emp 테이블에서 ename 과 sal*12+comm의 결과 조회


select ename, sal*12+comm
from emp;


-comm이 NULL인 컬럼의 값이 NULL로 출력됩니다.


[NVL함수]

- 컬럼이나 연산식이 결과가 NULL일 때 이를 다른 값으로 치환하기 위한 함수.

- NVL(컬럼이름 또는 연산식, 치환할 값)의 형식으로 사용합니다.

ex) emp 테이블에서 ename 과 sal*12+comm 의 결과를 조회

emm 컬럼의 값이 NULL일 때는 0으로 해서 계산

sal*12+comm 컬럼의 이름을 지급액이라고 출력


6. 결합 연산자 - ||

- 문자열을 결합할 때 사용하는 연산자

- 컬럼들을 하나로 합쳐서 출력하고자 할 때 사용하는 연산자

- 날짜 같은 데이터를 저장할 때 Date를 이용하지 않고 년 월 일을 각각의 컬럼으로 저장한 후 출력할 때 하나로 합치기 위한 목적으로 사용

ex) emp 테이블 ename 과 job을 하나로 묶어서 조회



7. Literal

- 사용자가 직접 입력하는 데이터

- 프로그램의 상수 영역에 별도로 저장해서 다음에 사용할 대 저장된 데이터를 이용합니다.

- 리터럴은 한 번 메모리를 할당하면 프로그램이 종료될 때까지 소멸되지 않습니다.

- 리터럴은 사용할 대 상수 영역을 확인해서 상수 영역에 존재하면 그 데이터를 이용하고 존재하지 않으면 새로 저장해서 사용합니다.

- 오라클에서는 문자 리터럴은 작은 따옴표 안에 기재합니다.

'문자 또는 문자열' / 자바: 큰 따옴표

 

int a =10;

int b =10;

- 변수는 위치를 저장한다. 상수의 경우, 메모리에 같은 데이터가 있는지를 확인하고 있으면 이전 데이터를 사용한다. (자바도 마찬가지)





8. distinct

- select 절의 맨 앞에 기재할 수 있는 예약어.

- 컬럼의 중복을 제거하고 조회할 때 사용합니다.

- 컬럼이름이 하나 일 때는 컬럼 1개의 중복을 제거하지만 컬럼을 여러 개 나열하면 나열 된 모든 컬럼의 값이 동일한 경우에만 중복을 제거.

ex) emp 테이블에서 job의 중복을 제거하고 조회






distinct 는  select 절의 맨 앞에 1번만 올 수 있음

아래 같은 문장 안됨


이 문장의 경우는 ename 과 job이 모두 동일한 경우에만 제거



9. where 절

- 테이블에 조건을 적용해서 조건에 맞는 행 만 필터링 하기 위한 절

- select 가 테이블의 데이터를 열 단위로 필터링하는데 where 는 행단위로 필터링 합니다.

- from 다음으로 수행됩니다.


1) 단일 행 연산자

> / >= / < / <=

= / !=(<>)

- 앞에 not을 붙이면 결과는 반대가 됨

- 날짜도 숫자로 간주함 때문에 크기 비교 연산자 사용 가능

- 문자열도 크기 비교 연산자를 사용할 수 있는데 코드 값을 가지고 비교함.

ex) EMP 테이블에서 sal이 3000 이상인 사원의 empno, ename, job, sal을 조회

select empno, ename, job

from emp

where sal >= 3000;


ex) EMP 테이블에서 job이 MANAGER 인 사원의 empno, ename, job, sal, deptno을 조회



select empno, ename, job, sal, deptno
fromg emp
where job = 'MANAGER';


2) 날짜 데이터 사용

- 날짜 - to_date('2008/04/14 22:02:14', 'yyyy/mm/dd hh24:mi:ss;)

- 오늘 날짜 및 시간 -sysdate

ex) EMP 테이블에서 hiredate가 1982년 01월 01일 이후 인 사원의 empno, ename, job, sal, hiredate, deptno 을 조회

select empno,ename, job, sal, hiredate, depton
from emp
where hiredate >= to_date('1982/01/01','yyyy/mm/dd');




3) and, or

- and : 모두 true 일 때만 true

첫번째 결과가 false이면 결과가 무조건 false이기 때문에 뒤에 조건은 조사하지 않음

 양쪽의 식은 서로 다른 값이 출력된다.

int a = 10;

if(a>1 && a++>5){

}

System.out.println(a)

 int a = 10;

if(a<1 && a++>5){

}

System.out.println(a)


- or : 모두 false 일 때 만 false

첫번째 결과가 true이면 결과가 무조건 true이기 때문에 뒤의 조건은 조사하지 않음


4) in, not in

- in은 여러 개 값 중에서 하나라도 일치하는 게 있으면 조회

- not in 은 여러 개 값에 일치하는 게 없으면 조회


5) between A and B

- A 보다 크거나 같고 B보다 작거나 같은 데이터 조회

- 반드시 B의 값이 A보다 크거나 같아야 합니다.


6) is null, in not null

- null인 데이터를 조회할 때는 is null

- null이 아닌 데이터를 조회할 때는 is not null




ex1) emp 테이블에서 sal이 1000이상이고 job이 CLERK인 사원의 ename과 job과 sal을 조회

select ename, job, sal

from emp

where job = 'CLERK' && sal >= 1000;



and 앞뒤의 내용이 바뀌어도 결과는 똑같다.



하지만 효율을 따져봐야 한다.

첫번째 부분에서 많이 걸러야 일을 덜 해서 효율적이다.

현장에서는 많은 양의 데이터를 다루어야 하기 때문이다.

job이 CLERK 인것이 3개,

sal이 1000이상 인것이 10개 이므로

3개 중에서 sal이 1000이상인 것을 고르는 게 효율적이다.

따라서 이 예제에서는 

이 방법이 좋은 방법이다.


ex2) emp 테이블에서 job 이 CLERK 이거나 MANAGER인 사원의 ename 과 job을 조회


select ename, job

from emp

where job = 'CLERK' or job = 'MANAGER';


select ename, job

from emp

where job in ('CLERK', 'MANAGER');

-- 위와 같은 말이다. where job = ('CLERK', 'MANAGER');



ex3) emp 테이블에서 comm의 값이 null 이 아닌 데이터의 ename 과 sal을 조회

select ename, sal

from emp

where comm is not null;


null은 = 나  != 로 비교하지 않습니다.

7) 부분일치 검색 - like 와 와일드카드 문자 이용
- _: 반드시 하나의 문자의 매핑
- %: 0개 이상의 문자

ex) emp 테이블에서 ename에 L이 포함된 사원의 ename 과 job을 조회

select ename, job

from emp

where ename like '%L%';


ex2) emp 테이블에서 ename의 3번째 글자가 L인 사원의 ename과 job을 조회

select ename, job

from emp

where ename like '__L%';


-즉, %%로 감싼 문자열이 포함된 것을 찾아 출력

-즉, n번째에 특정문자가 포함된 것을 찾을 대는 n-1번째까지는 _로 도배 후 특정문자 위에 %를 붙이면 원하는 결과가 출력


ex) emp 테이블에서 hiredate가 81년인 데이터의 모든 컬럼을 조회

select *

from emp

where hiredate like '81%';

(크다,작다 또는 between을 사용해도 된다.)



10. order by 절

- 데이터를 순서대로 나열(정렬)하기 위한 절

- select 구문에서 가장 마지막에 작성하고 가장 마지막에 수행됩니다.

- ascending(오름차순): 작은것→큰것 순서대로 나열하는 것. 기본은 오름차순

- descending(내림차순): 큰것→작은것 순으로 나열하는 것.

- order by 정렬할 컬럼이름 또는 연산식 asc 또는 desc
- asc는 생략해도 되는데 오름차순. desc는 내림차순
- 여러 개의 컬럼이나 여러 개의 연산식을 나열해도 되는데 앞의 조건부터 순서대로 적용하게 됨.
- 첫번째 컬럼을 가지고 정렬을 하고 동일한 값이 있을 때 두번째 컬럼을 가지고 수행합니다.
- 데이터베이스에 데이터가 저장될 때는 순서와 상관없이 저장됨. 그래서 2개 이상의 데이터를 조회할 때는 정렬을 하는 게 좋음.

ex1) emp 테이블의 모든 컬럼을 조회하는데 ename의 알파벳 순으로 조회
select *
from emp
where order by ename asc;

ex2) emp 테이블의 모든 컬럼을 조회하는데 job의 오름차순으로 정렬하고 job이 동일한 경우에는 sal이 많은 데이터부터 조회
select *
from emp
order by job, sal desc;


연습문제 연결▼▼

  1. 비용 有 [본문으로]

'JAVA 공책 > 수업 메모' 카테고리의 다른 글

Student 테이블을 만들어서 stream API 연습하기  (0) 2018.08.07
상위클래스의 생성자를 호출하는 방법  (0) 2018.08.06
통신  (0) 2018.07.24
URL  (0) 2018.07.24
MulticastSoket22  (0) 2018.07.24