Day 20. 오라클 데이터베이스 기초

ho_c·2022년 3월 15일
0

국비교육

목록 보기
20/71
post-thumbnail
post-custom-banner

한 달간의 자바 문법을 끝내고 오늘부터는 DB 파트로 넘어왔다.
일단 첫날이라 그리 어렵지 않았지만, 앞으로가 기대가 되는 파트이다.

📝목차

  1. RAM 과 보조 기억장치
  2. 저장 방식의 발전
  3. DBMS
  4. DML : select 응용

1. RAM 과 보조 기억장치

자바 문법을 실습하면서, 주로 데이터를 입력받고, 그 데이터를 출력하는 예제를 많이 풀어봤다.
이 때, ArrayList 배열을 heap 메모리에 저장했고, 주소를 stack 에 저장했다.
그런데 콘솔로 입력받은 데이터들은 프로그램이 꺼지면 함께 사라졌다.

이는 RAM 이라는 공간의 특성 때문이다.
구체적으로 앞선 데이터들은 공통적으로 RAM이라는 휘발성 메모리에 생성되었다.
그런데 RAM 은 전기를 통해서 정보를 저장해둔다.
따라서 컴퓨터 전원이 꺼지거나, 아니면 공급이 멈추면 전기의 힘으로 기억하고 있던 데이터를 날려버린다. 따라서 RAM에 보관되는 데이터는 안정적이지 못하다.

이런 RAM 의 휘발성을 보완하려 만든 것이 ‘보조 기억 장치’이다.
흔히, HDD 또는 SSD 로 불리는 보조 기억 장치는 반 영구적으로 데이터를 저장한다.
먼저 HDD는 Magnetic Disk 로 자력의 힘으로 데이터를 기록한다.
물론 언젠가는 사라지지만, 그 사라지는 시간이 오래 걸리다 보니 반영구적으로 보관한다.
다른 보조 기억 장치인 SSD 는 전기를 사용하지만, 저장이 가능하다.

아무튼 RAM 에서 보관하던 Data를 잃어버리지 않기 위해 보조 기억 장치에 옮겨 담는 것을 Save 라고 하며, 반대는 Loading 이라 한다.


2. 저장 방식의 발전

초기에는 위의 과정을 File IO를 통해서 했다. 굉장히 낯설 것 같지만 지난 시간 실습 내용이 파일전송프로그램이었다. 이 방식은 메모장 같은 파일에 프로그램에 사용되던 데이터를 단순 출력하여서 저장하였다.

아주 단순한 방법을 택했지만, 점점 데이터의 규모가 커지기 시작하면서 한계가 생겨났다.

① 탐색의 비효율

기본적으로 데이터를 순차적으로 저장해둔다. 굳이 말하자면 오름차순으로 저장하는 방식이라 생각하면 된다. 따라서 특정 데이터를 찾으려면 무조건 처음부터 시작해야 되었다.
이런 부분에서 성능이 별로 좋지 못했다.

② 안전성, 보안 문제

앞서 메모장 같은 파일이라 했지만, 기껏해야 .dat 라는 확장 파일에 데이터를 저장해둔다.
그래서 누구든지 접근할 수 있기에 보안의 문제가 있었고 그로부터 생겨나는 데이터 분실, 강제 수정 등의 문제가 존재했다.

③ 버그

안전성과 마찬가지로 버그가 많았다. 종종 운영체제를 프로그램이 잘못 건드리면서 블루스크린이 나올 때, 데이터 파일도 같이 깨지기도 했다.

이런 문제점들 사소하지만 결코 용납이 안되는 문제이기도 하다.
그리고 이를 해결하여 시장을 장악한 기업이 있으니, 바로 그게 ‘Oracle’이다.


3. DBMS

단순 파일 저장 방식은 앞서 설명한 문제점들이 있었다.
그래서 몇몇 개발자가 모여 성능과 보안이 좋은 프로그램을 만드는데, 그걸 DBMS라고 한다.

‘DataBase Management System (DBMS)’

이건 자바처럼 프로그래밍 언어가 아니다. 물론 사용을 위한 언어체계가 있지만
기본적으로 데이터를 관리해주는 솔루션이다. 그래서 오늘부턴 DBMS을 다루는 법에 대해서
배워나갈 것이다.

먼저 DBMS를 사용하는 법은 크게 3가지가 있다.
① CMD
② 웹 사이트로 접속해서
③ 개발 프로그램 사용.

이 중 ③번이 주로 사용된다. 따라서 인터넷에서 SQL Developer 프로그램을 Oralce DBMS와 함께 다운받아주면 된다.

구성

DBMS와 개발프로그램을 저장해줬다면, 개발프로그램을 실행시켜주면 된다.
이때, 개발프로그램은 DBMS가 아니다. DBMS라는 거대한 DB를 쉽게 다룰 수 있도록 지원하는 프로그램을 다루는 프로그램이다.

DBMS은 역시 객체를 지니고 있다. 사실 객체로 다룰 수 있는 것은 다양하지만 처음부터 하나씩 살펴보자.

1) 계정

계정은 하나의 영역이다. 이 영역 중 DBMS 전체를 포괄하는 슈퍼계정이 있는데, 그것이 시스템 계정이다. 이는 DBMS 내부에 DB를 생성하고, 관리하는 용도의 계정이다.

그리고 시스템 계정을 통해 만들 수 있는 계정이 있는데, 이는 각 DB를 만들어 내부에 입력되는 데이터를 관리하는 계정이다.

create user OO identified by OO; // OO라는 계정 생성 및 pw 설정
grant connect, resource to kh; // 접근과 생성 권한 부여

새로운 계정을 생성하면, 그 계정에 맞는 영역이 또 생겨난다. 해당 계정으로 인해, 우리가 DB에 접근하려면 그 계정 자체가 필요하게 되므로, 보안 문제가 해결된다.

2) Table

: DB 내부에 데이터를 저장하는 단위

계정은 쉽게 말하면 ‘주류창고’ 정도로 생각하면 될 것 같다.
그럼 우리는 이 주류 창고 안에다가 무언가를 채워야 한다.
예를 들어 술, 직원, 장비 등으로 구성될 수 있을 것이다. 그럼 우리는 이 데이터들을 각 주제에 맞춰서 관리할 수 있는 가능성이 있다.
즉, 소주-맥주는 술로, 생산직-행정직은 직원으로 구성할 수 있다.
따라서 이렇게 하나의 주제로 뭉쳐있는 데이터 집합을 ‘Table’ 이라고 한다.

Member Table

create table Member(
    ID varchar(20)
    PW varchar(20),
    Address varchar(300),
    Phone number 
);

3) head line

: 데이터 카테고리

테이블은 내부적으로 저장하고 싶은 카테고리에 따라서 실 데이터들을 채워나간다.
따라서 어떻게 데이터를 분류해서 담을 것인지를 정할 필요가 있고, 이를 헤더라고 한다.

Member Table – 테이블 명
ID | PW | Address | Phone - 헤드라인

create table Member(
    ID varchar(20)
    PW varchar(20),
    Address varchar(300),
    Phone number 
);

헤더 밑에 실제 데이터를 입력하는데, 이를 행과 열로 구분해서 볼 수 있다.

4) record (행- 가로)

DB를 출력하게 된다면, 하나의 표로서 보여준다. 이때 표를 가로로 보는 것을 로우 또는 레코드라고 부른다.
이 로우의 특징은 하나의 개체의 여러 정보를 보여준다.

5) Column (열- 세로)

반대로 Column은 세로로 표를 보는데, 이는 한 헤더(자료형)에 대한 여러 개체의 정보를 나타낸다.

6) SQL : 구조화된 질의 언어 Structured Query Language

그럼 이런 DB를 어떻게 관리를 하느냐? 또 데이터를 어떻게 출력받아 보느냐?

DB를 관리하기 위해선, DBMS이라는 프로그램의 명령어를 알아야 한다.
이 명령어를 SQL이라고 하는데, 프로그래밍 언어와 달리 DB를 관리하기 위한 언어이다.

따라서 한 가지 짚고 넘어가야 할 것은 자바와 자료형의 표현이 다르다.

  • 숫자 : number
  • 문자열 : varchar // “”(X) | ‘’(O)
  • 날짜 : date ( 초단위 사용은 timeStamp )
create table Member(
    ID varchar(20) // () 안은 입력 받을 수 있는 최대 용량
    PW varchar(20),
    Address varchar(300),
    Phone number 
);

이런 SQL은 DBMS에서 수행하는 명령 체계로 4가지로 나뉜다.

① DDL ( Data Definition Language )
: DBMS 안에서 사용되는 객체 들을 생성, 수정, 삭제하는 명령

DBMS 안에도 객체로 관리된다. (테이블, 뷰, 트리거, 스토리지 클래스, 인덱스, fuction 등등)

create user OO identified by OO; // OO라는 계정 생성 및 pw 설정

create user : 계정 객체를 생성하는 명령어
idnetified by : pw을 생성하는 명령어

② DCL ( Data Control Language )
: 객체 또는 데이터에 대한 접근 권한 을 생성, 수정, 삭제하는 명령어 체계

grant connect, resource to kh; // 접근과 생성 권한 부여
  • grant to : 권한 부여 명령어
  • connect : 접근
  • resource : 자원 생성

③ DML ( Data Manipulation Language )
: DBMS에 기록되는 데이터 를 생성 / 수정 / 삭제하는 명령어

DML을 가장 많이 사용되며, 내부에서 또 두 종류로 나눠진다.

  • DQL : select
  • ETC : insert / update / delete

④ TCL ( Transaction Control Language )
트랜잭션을 통제하는 명령어

따라서 앞서 SQL을 통해 다음 과정을 실행했다.

DDL로 계정 생성 → DCL로 해당 계정에 접근 권한부여 → DBMS 내부에 KH소유의 DB가 생성 → DML을 통해 데이터를 입력 및 출력


4. DML : select 응용

select을 활용하는 방법은 DQL이라는 파트가 따로 있을 정도로 방대하다.
다만 어렵게 생각할 필요가 없다. 실제 원리는 for 반복문을 돌리는 것과 같은 원리이다.

① 기본 구조

select *컬럼명 from 테이블명;

이 경우, 설정한 테이블의 컬럼 데이터를 모조리 출력한다.

또한, 다음과 같이 컬럼 자리에서 연산 또는 상수값을 넣을 수 있다.

select emp_name, salary * 12 from employee; -- 각 데이터에 *12적용
select emp_name, salary * 12 as "연봉" from employee; -- as 헤드라인 명 설정 
select emp_name 사원, salary * 12 연봉 from employee; -- as와 “” 생략될 수 있다.
select emp_name, salary*12||'원' 연봉 from EMPLOYEE; -- || : 문자열 연결 연산자

그러나 우리는 특정한 조건을 활용하는 것을 좋아하기 때문에 이제 조건식을 알아보자.

② where

select 컬럼명 from 테이블명 where (조건식) ;

where 을 붙이면 조건 비교를 먼저 하여 true 인 것만 출력한다.
일반 조건식에서 사용하는 것들은 모두 사용할 수 있다.
단, 오라클 DB에서 === 이다.

예제를 통해서 어떻게 사용되는지 알아보자.


예제 1 : Employee 테이블에서 월급이(SALARY)이 2,500,000원 이상인 사람의 EMP_NAME 과 SAL_LEVEL을 출력하세요

select emp_name, sal_level from EMPLOYEE where salary >= 2500000;


예제 2 : Employee 테이블에서 월급이(SALARY)이 350만원 이상이면서 JOB_CODE가 'J3'인 사람의 이름(EMP_NAME) 과 전화번호(PHONE) 을 출력하세요

select emp_name, phone from EMPLOYEE where salary >= 3500000 and JOB_CODE = 'J3';


예제 3 : between

select emp_name, salary from EMPLOYEE where salary >= 3000000 and salary <= 4000000;
select emp_name, salary from EMPLOYEE where salary between 3000000 and 4000000;

특정 구간을 설정하여 출력하고 싶은 경우, and로 연결하지만 코드의 가독성을 위해
between A and B 를 사용하는 것이 더 좋다.


예제 4 : null 값 비교

select * from employee where bonus is null; 
select * from employee where bonus is not null; 

null 은 일반 부등호로 연산이 되지 않는다. 따라서 is null 구문을 이용해서 연산할 수 있다.


예제 5 : or 연산자의 간략화

select emp_name, dept_code from EMPLOYEE where dept_code='D2' or dept_code='D6';
select emp_name, dept_code from EMPLOYEE where dept_code in ('D2', 'D6');


예제 6 : date 로 일수 계산하기

select emp_name, floor(sysdate - hire_date)||'일' 근무일 from EMPLOYEE;
select emp_name, salary, bonus  from EMPLOYEE where floor(sysdate - hire_date) > 365*20;

sysdate 라는 현재 시간에서 뺄셈을 해주면 일수가 출력된다. 다만 소수점까지 나오니 그게 싫으면 floor(); 에 넣어주면 된다.


예제 7 : like 구문 - 검색 대상의 데이터가 모호할 때 쓰임.

% : %을 기준으로 이후 글자가 없을 수도 있고, 있을 수도 있다.

select * from employee where emp_name like '차%';
select * from employee where emp_name like '%연%'; -- '연'을 포함하는 데이터
select * from employee where emp_name like '%태'; -- '태'로 끝나는 데이터
select * from employee where emp_name like '노%'; -- '노'로 시작하는 데이터

_ : 정확한 한 글자가 존재한다.

select * from employee where emp_name like '차__'; -- '차'로 시작해서 2글자가 존재하는 것 (검색 결과 나옴)
select * from employee where emp_name like '차_'; -- '차'로 시작해서 1글자가 존재하는 것 (검색 결과 안 나옴)


예제 8 : 날짜 표기

고용일이 90/01/01 ~ 00/12/01이면서, 월급이 270만원 이상인 사원의 전체 정보를 출력하세요

select * from Employee  where email like '%s%' and Dept_code in ('D9', 'D6') and  hire_date between '90/01/01' and '00/12/01' and salary >= 2700000;
profile
기록을 쌓아갑니다.
post-custom-banner

0개의 댓글