22.01.20 DB-DDL, 제약 조건 / JAVA 조건문

최고고·2022년 1월 20일
0
post-custom-banner

DDL

-DB구조를 정의할 때
-구조를 가지고 있는 객체 ← 객체의 구조를 정의할때 생성 수정 삭제
-테이블 : 데이터저장 기본 단위 행, 열 구성
-뷰 : 데이터 엑세스 제한해서 봄 부분적으로 봄
-시퀀스 : 숫자 값 생성기로 일련번호, pk 만들 때 자주사용
-인덱스 : 검색속도 향상
-동의어 : 객체에 동일이름 제공

  • 테이블 구성
    -테이블 이름, 구성하는 컬럼과 그 컬럼 이름, 컬럼의 구조(데이터 유형 = 데이터 타입, 길이 크기)
    -각 이름에 의미를 갖는다. 업무규칙 반영 네이밍
    -문자로 시작, ~30자까지
    -문자값 전부 가능하나 대부분 알파벳 대소문자 (한글이 저장공간이 더 크다), 특수기호는 _, $, #만
    -같은 계정의 사용자가 소유한 다른 객체의 이름 중복 안됨
    -오라클 서버의 예약어, 명령어가 아니어야됨
  • DB 구현 : 1. create 테이블 생성 2. insert 데이터 삽입 3. commit 저장
    -테이블 생성
    -creat table table_name (column선언 number(2)); -> table created.

  • DD 와 TABLE을 각각 저장. 저장하면 DD가 갱신
    -데이터정보가 바뀌면 DD가 갱신됨. 트랜잭션은 I/O의 최소화해주는 작업

데이터 유형

✔문자값 :

-CHAR(SIZE) - 고정길이
CHAR(5) 'AAA' 일 때 CHAR(저장공간) 공간이 정해져있어서 그 만들어진 공간을 사용, 남은 공간은 사용할 수 없다. 성능↑ 공간활용도↓ 사이즈 결정할 때 주의!! 실제 입력이 될 데이터보다 20% 더 큰 사이즈로 만드는 것이 최적!!
공간 낭비 최소화 하기위해 DB의 확장성 때문
-VARCHAR2(사이즈) - 가변길이 디스크 I/O 최소화
VARCHAR2(5) 입력된 데이터에 따라 공간을 맞춤 / 성능↓ 공간활용도↑

숫자값

-NUMBER : 음수,0,양수 모두가능가변성이 너무 커서 잘 안쓴다
-NUMBER(P)-정수자리만
-NUMBER(P,S)-소수점 표현됨 가장많이씀

날짜값

-DATE 운영체제마다 날짜 포맷이 결정됨
-TIMESTAMP 년 월 일 시간 분 초 EX) HIRE_DATE TIMESTAMP

long~bfile 사이즈가 큰 데이터로 멀티미디어 데이터 (이미지성 등)
BLOB 주로 이미지 데이터, 최대 4GB
ROWID : 인덱스가 주로 사용함

  • 서브쿼리를 통해 테이블 생성

  • 서브쿼리의 결과를 그대로 테이블화 ==> 컬럼의 구조( 컬럼 이름,타입,길이) + 데이터
  1. create table dept ( emp_id number(3), name char(10), annsal number(10));
  2. select emp_id, name, salary*12 from emp where d_id=80;
  3. insert into table(column1,2,3...) values (값1,2,3)
  4. commit
    -서브쿼리를 이용하면 이 과정을 거치지 않고 간단하게 생성할 수 있지만
    서브쿼리르 안쓰는 이유 원본 테이블의 데이터가 변경 되었을 때, 서브쿼리로 가져온 테이블은 업데이트가 안되기 때문에 !
  • alter table

    -테이블의 구조가 변경 됐다는 뜻. 잘 쓰지 않도록 한다!
    -실제 설계시 철저하게 검증해서 db를 구축하기 때문에 db 운영 중일때 구조가 변경되는 경우 리스크 ↑↑↑
    - add 컬럼추가 modify 컬럼 변경 drop 삭제
    -새로 추가된 컬럼은 null값 저장됨
    -modify에서 컬럼 수정할때 컬럼 무결성에 의해 원래 가지고있던 값의 데이터 사이즈보다 작아지면 안 됨
    -기본키가 외래키와 참조되고 있어서 drop으로 해당 테이블을 지울 수없음

delete DML 명령문 행 삭제 저장공간 남음 복구시 rollback으로 취소
truncate DDL 테이블의 전체 데이터, 행 삭제 행 where절 없음
저장된 공간 삭제되고 테이블정보 저장공간은 남김 => 효용 테이블을 만들었을 때 형태로 만들어줌 복구 불가
drop DDL 행, 테이블 정보 모든정보도 삭제 복구 불가
drop, truncate ->> auto commit 실행과 동시에 저장이 됨

제약 조건

-테이블의 데이터 무결성을 보장하기 위한 조건
-컬럼별로 설치 (조건 부여)
-한개의 컬럼에 여러개 제약조건 부여 가능
-종속된 테이블 삭제 방지

  • 오라클의 기본 제약조건

    -NOT NULL : 반드시 값이 있어야함 ex)이름
    -UNIQUE : 널값은 허용하나 실제값에 대해서는 중복 허용x
    -PK : not null, unique 테이블에 1개의 pk 지정되어야됨!
    -FK : 다른테이블에 있는 컬럼을 참조할 때 있어야됨! 참조대상 컬럼에 pk와 unique가 지정되어있어야됨
    -check : 사용자 정의 제약 조건 ex) check(column in(10,20,30))

  • 제약조건 주의사항

    -제약조건에 이름 지정 안하면 오라클 서버가 sys_001과 같이 임의의 이름이 생성됨 ->관리힘듦
    -create table 함께 생성하거나 alter table로 추가
    -DD에서 확인가능
    -constraint 절 사용
    -references : 관계테이블 설정 - 참조대상 지정해주는 절, 참조할 테이블 이름과 컬럼이름을 명시해줘야됨! --->테이블이름(컬럼이름)

  • 테이블 생성할때 제약조건도 생성하는 법 ->

    create 컬럼 나열 후 제약조건 명령문을 포함 시키면 됨

  1. constraint : 제약조건 생성하는 명령어
  2. 제약조건 이름 -제약조건 이름 정할 때 : table-col_약어 ex) dept_did_pk
  3. 설치할 제약조건유형-pk,fk 등등
  4. (설치할 컬럼이름) 어느컬럼에 할지
create table dept
(did number(5), dname char(10),
constraint dept_did_pk primary key(did)
); 
//table level에서의 선언 : 컬럼을 먼저 선언 후 별도로 제약조건 선언
		설치할 컬럼의 이름이 마지막에 명시 
        	**PK, UK, FK, CK 제약조건만 가능**
create table dept
(did number(5)constraint dept_did_pk primary key(did), 
dname char(10)
);
// column level에서의 선언 : 컬럼과 제약조건을 같이 명시, 컬럼이 앞에 명시됨
			**PK, UK, FK, CK, NN 제약조건 가능**
  • ↓↓↓현업에서 쓰는 방식 ↓↓↓
create table dept
(did number(5)
dname char(10) not null,
loc char(10),
constraint dept_did_pk primary key(did)
);
//PK, CK, UK, FK 제약조건은 제약조건 이름을 부여해서테이블레벨로 선언을 많이 사용함 
NOT NULL은 이름없이 컬럼과 같이 선언 -> 시스템임의 이름 생성 SYS_001 
NOT NULL은 바로 NOT NULL을 쓰도록 하자! 
  • 종속적 삭제
    -on delete cascade : 부모행 삭제 + 부모행을 참조하는 자식행이 같이 삭제됨
    -on delete set null : 부모행 삭제 + 자식행에서는 참조값만 삭제됨, 행은 그대로 있고 널값으로 대체
drop table test cascade constraints; 
//drop 하는 이유 위에서 부터 차례로 계속 실행이 되는데, 실행할때마다 반복되기 때문!
//아래에서 테이블을 생성해줬기 때문  
//cascade는 두 관계 테이블을 끊음

drop table test1 cascade constraints;

create table test // 테이블 생성시 테이블이름 - 컬럼 - 컬럼별 - 데이터타입
(a number(3), 
b number(3) not null,
constraint test_a_pk primary key(a) // 제약조건_제약이름_유형(컬럼이름)
);

create table test1
(c number(3),
d number(3) not null,
e number(3),
a number(3),
constraint test1_c_pk primary key(c), 
constraint test1_e_ck check(e in(0,1)),
constraint test1_a_fk foreign key(a) references test(a)
);

.sql 확장자 파일 : 스크립트파일
경로 : C:\oraclexe\app\oracle\product\11.2.0\server\bin
동시에 여러개의 명령문 저장 가능. 문장 끝에;
save 이름.sql
불러내기 -> @이름.sql 엔터


JAVA

조건문 : if 조건식() { true 일때 실행될 코드 } ( )의 결과값이 논리형

  • if 문 조건식이 true일때 실행, false일때 빠져나감

  • if else문 조건식이 t일때 실행, f일때 else t에 해당하지 않는 부분이 넘어옴
    -조건식에 && 로 조건 두 개 이상 줄 수 있음 전부 true일 때 실행문 ~!
    -쓰일 변수를 만들어서 조건식에 넣어도 됨 논리형 변수로!
    boolean a = (b+c+d+f) >= 60; boolean a1 = b>=8 && c>=8 && d>=8;
    -곱하는 최소값이 소수점이면 자동형변환이 되어 실수형으로 됨, 그럴때는 앞에 수동형변환으로 (int) 를 붙여주자
    -if문만 썼을때는 하나하나 위에서부터 아래로 검사하기때문에 조건식을 다 작성해줘야함, 효율떨어짐

  • switch문
    -break 자기를 감싸는 중괄호를 빠져나간다. 마지막엔 안써도됨
    -case는 값이 들어감 딱 떨어지는 정확한 결과값~!
    -default : 기본값이라고 하며, 케이스 값이 모두 해당되지 않을때 이외의 값일 때 구문
    -if 와 차이 : 범위비교 x 비교연산자x 식 쓰는것은 가능하다. 식만 !! ex) num%2 값이 딱 떨어질 때 사용, if는 범위설정
    -값으로 바로 넘어가기 때문에 속도가 조금 더 빠르지만 크게 차이가 없다!

		//num 값이 1이면 안녕하세요
		//2이면 잘가세요
		//3이면 반갑습니다
		//4이면 또만나요
		//그외 또만나요
		int num = 1;
		
		switch(num) {    
		
		case 1:
			System.out.println("안녕하세요");
			break; // 속한 중괄호 밖으로 빠져나가기
		case 2:
			System.out.println("잘가세요");
			break;
		case 3:
			System.out.println("반갑습니다");
			break;
		default:
			System.out.println("또만나요");
			break; // 아래구문이 없어서 안써도 됨 
				
		}
	
post-custom-banner

0개의 댓글