되도록 셀이 null 상태를 가지지 않는다. null 상태의 셀이 많으면 좋지 않다.(공간차지 안좋음)
중복값을 저장하지 않는다. 》 동일한 성격의 데이터 1개 이상의 테이블에 저장하지 않는다.
》 같은 데이터를 여기저기 동시에 저장하지 않는다. 》공간 낭비, 관리 불편(수정 불편)
하나의 셀 > 반드시 원자값 저장(단일값, 분리될 수 없는 값(Scaler)) -> ex) 성적 : 100,80,90 X
null 제거
중복값 제거
자료 삽입, 갱식, 삭제에 따른 이상 현상 제거 》 데이터 무결성 보장
삽입 이상(Insertion Anormaly)
갱신 이상(Update Anormaly)
동일한 데이터가 2개 이상의 데이블에 존재 》 그 중 1개는 수정했지만, 다른 1개를 수정 못했을 때
》 두 데이터간의 이상 오류가 발생 》 2개 데이터 중 어떤 데이터가 올바른 데이터인지 구분 못하는 상황 발생
삭제 이상(Deletion Anormaly)
제 1 정규화, 1NF
제 2 정규화, 2NF
제 3 정규화, 3NF
역정규화
데이터 모델링 분야에서 개체-관계 모델이란 구조화된 데이터에 대한 일련의 표현이다. (테이블의 관계)
"구조"화된 데이터를 저장하기 위해 데이터베이스를 쓴다. (오라클 같은거 쓴다.)
이 데이터의 "구조" 및 그에 수반한 제약 조건들은 다양한 기법에 의해 설계될 수 있다.
그 기법 중 하나가 개체-관계 모델링(Entity-Relationship Modelling)이다.
줄여서 ERM이라고 한다.
ERM 프로세스의 산출물을 가리켜 개체-관계 다이어그램(Entity-Relationship Diagram)이라 한다.
줄여서 ERD라 일컫는다.
Procedural Language Extensions to SQL
절차성 언어
흐름과 제어를 추가
ANSI-SQL 모두 지원
PL/SQL = ANSI-SQL + 확장(제어구조)
PL/SQL의 구성요소
메소드, 함수, 서브루틴 등..
순서가 있는 코드의 집합
익명 프로시저
실명 프로시저
4개의 키워드로 구성
declare
begin
exception
end
자료형
변수 선언하기
대입 연산자
dbms_output.put_line -- 기본적으로 꺼진 상태
set serveroutput on; -- 켜기 (매번 로그인할때마다 켜야함)
set serveroutput off; -- 끄기
set serveroutput on;
declare
-- 선언
num number; -- 숫자형
name varchar2(30); -- 문자형
today date; -- 날짜형
begin
-- 숫자형
num := 10;
dbms_output.put_line(num); -- syso과 같은 역할(화면출력)
-- 문자형
name := '홍길동';
dbms_output.put_line(name);
-- 날짜형
today := '2021-05-26'; -- 리터럴 -> 암시적 형변환O
dbms_output.put_line(today);
today := to_date('2021-05-26', 'yyyy-mm-dd'); -- FM(권장)
dbms_output.put_line(today);
today := sysdate;
dbms_output.put_line(today);
end;
declare
num1 number;
num2 number default 200;
num3 number not null := 300; -- 변수선언 + 값대입
num4 number not null default 400;
begin
dbms_output.put_line('num1: ' || num1); -- null 출력
dbms_output.put_line('num2: ' || num2); -- default 출력
dbms_output.put_line('num3: ' || num3); -- 값 출력
dbms_output.put_line('num4: ' || num4); -- default 출력
end;
1행 1열
1행 N열
N행 1열(레코드가 여러개)
N행 N열
-- 홍길동 어느 부서? -- 기획부
select buseo from tblInsa where name = '홍길동'; -- ANSI-SQL, 결과값 단일값
declare
vbuseo varchar2(15); -- 부서를 저장할 변수 1개
begin
-- PLS-00428: an INTO clause is expected in this SELECT statement
-- PL/SQL 블럭내부에서는 select의 결과를 반드시 변수에 저장해야 한다.
-- 만약 변수에 저장하지 않는 일반 ANSI-SQL의 select문을 그냥 사용하면 에러가 발생한다.
-- select buseo from tblInsa where name = '홍길동';
-- select into 사용
-- select 컬럼 into 변수
-- ANSI-SQL의 결과를 PL/SQL로 옮겨담는 작업 중 하나(★★★)
select buseo into vbuseo from tblInsa where name = '홍길동';
dbms_output.put_line('결과: ' || vbuseo); -- PL/SQL 변수
-- PLS-00201: identifier 'BUSEO' must be declared
-- PL/SQL 블럭내부에서는 ANSI-SQL의 식별자(테이블명, 컬럼명 등)를 직접 사용할 수 없다.
-- dbms_output.put_line('결과: ' || buseo); -- ANSI-SQL 식별자
end;
declare
vname varchar2(15); -- 이름을 담을 변수
vbuseo varchar2(15); -- 부서를 담을 변수
begin
vname := '이순신';
-- 기존의 ANSI-SQL을 구성하면서 PL/SQL 값을 상수로 사용할 수 있다.
select buseo into vbuseo from tblInsa where name = vname;
dbms_output.put_line(vbuseo);
end;
-- 총무부 몇명?
declare
vcount number;
begin
select count(*) into vcount from tblInsa where buseo = '총무부';
dbms_output.put_line('총무부 직원수: ' || vcount || '명');
end;
-- select into
-- 1. 컬럼의 갯수 = 변수의 갯수 일치
-- 2. 자료형 일치
-- 3. 순서 일치
-- '홍길동'의 직위, 부서, 직위, 급여...
declare
vname varchar2(15);
vbuseo varchar2(15);
vjikwi varchar2(15);
vbasicpay number;
begin
-- 순서와 갯수가 맞아야한다.
select name, buseo, jikwi, basicpay into vname, vbuseo, vjikwi, vbasicpay from tblInsa
where name = '홍길동';
dbms_output.put_line(vbuseo);
dbms_output.put_line(vjikwi);
dbms_output.put_line(vbasicpay);
end;