데이터 베이스

문이빈·2023년 7월 27일
0

Oracle Database 21c Express Edition for Windows x64


Oracle Database 21c Express Edition

다운


InputeStream, OutputeStream, Reader, Writer 모두 추상 클래스여서 new 불가능

객체 직렬화

객체는 파일이나 네트워크로 전송이 안되기 때문에 객체를 byte[ ]로 변환시켜서 전송해야한다
Serializable

숙제.

package member.Byteacher;

public class MemberMain_T {

public static void main(String[] args) {
    MemberService_T memberService = new MemberService_T();
    memberService.menu();
    System.out.println("프로그램을 종료합니다.");
    }
}

----------------------------------------------------------------

import java.util.List;

public interface Member_T {
    public void execute(List<MemberDTO_T> list); 
}

----------------------------------------------------------------

import java.io.Serializable;

public class MemberDTO_T implements Serializable{

private String name;
private int age;
private String phone;
private String address;


public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

public String getPhone() {
	return phone;
}

public void setPhone(String phone) {
	this.phone = phone;
}

public String getAddress() {
	return address;
}

public void setAddress(String address) {
	this.address = address;
}

@Override
public String toString() {
	return name + "\t" + age + "\t" + phone + "\t" + address;
	}
}

----------------------------------------------------------------

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class MemberService_T {
    List<MemberDTO_T> list = new ArrayList<MemberDTO_T>(); // 부모 = 자식

public void menu() {
	Scanner scan = new Scanner(System.in);
	Member_T member = null;
	int num;
	
	while(true) {
		
	System.out.println();
	System.out.println("***********");
	System.out.println("1. 등록 ");
	System.out.println("2. 출력 ");
	System.out.println("3. 파일 저장 ");
	System.out.println("4. 파일 읽기 ");
	System.out.println("5. 이름으로 오름차순 ");
	System.out.println("6. 끝");
	System.out.println("***********");
	System.out.print  ("번호 : ");
	num = scan.nextInt();
	
	if(num == 6) {
		break;
	}
	if(num == 1) 
		member = new MemberInsert_T();
	else if (num == 2) 
		member = new MemberPrint_T(); 
	else if (num == 3)
		member = new MemberFileOutput_T();
	else if (num == 4)
		member = new MemberFileInput_T();
	else if (num == 5)
		member = new MembrNameAsc_T();
	
	member.execute(list); // 호출
  

	}
  }
}

----------------------------------------------------------------

import java.util.List;
import java.util.Scanner;

public class MemberInsert_T  implements Member_T {

@Override
public void execute(List<MemberDTO_T> list) {
	Scanner scan = new Scanner(System.in);
	
		System.out.println();
		System.out.print("이름 입력 : ");
		String name = scan.next();
		System.out.print("나이 입력 : ");
		int age = scan.nextInt();
		System.out.print("핸드폰 입력 : ");
		String phone = scan.next();
		System.out.print("주소 입력 : ");
		String address = scan.next();
		System.out.println("***********");
		
		MemberDTO_T memberDTO_T = new MemberDTO_T();
		memberDTO_T.setName(name);
		memberDTO_T.setAge(age);
		memberDTO_T.setPhone(phone);
		memberDTO_T.setAddress(address);
		
		list.add(memberDTO_T);

        System.out.println("등록 완료");
	}
}

----------------------------------------------------------------

import java.util.List;

public class MemberPrint_T implements Member_T{
    @Override
    public void execute(List<MemberDTO_T> list) {
        System.out.println();
        System.out.println("이름\t나이\t핸드폰\t\t주소");
        for (MemberDTO_T memberDTO_T : list) {
            System.out.println(memberDTO_T);
        }
    }	
}

----------------------------------------------------------------

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.List;

public class MemberFileOutput_T implements Member_T{

@Override
public void execute(List<MemberDTO_T> list) {
	System.out.println();
	
	// Stream 생성
	
	try{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("member.txt")));
		
		for(MemberDTO_T memberDTO_T : list) {
			oos.writeObject(memberDTO_T); // 파일 저장
		}
		
		oos.close();
		System.out.println("파일 저장 완료");
		
	}catch(IOException e) {
		e.printStackTrace();	
    }	
  }
}

----------------------------------------------------------------

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;

public class MemberFileInput_T implements Member_T{

@Override
public void execute(List<MemberDTO_T> list) {
	System.out.println();
	
	list.clear(); // ArrayList 초기화
	
	ObjectInputStream ois;
	try {
		ois = new ObjectInputStream(new FileInputStream("member.txt"));
		
		while(true) {
			try {
				MemberDTO_T memberDTO_T = (MemberDTO_T)ois.readObject(); // 파일 읽기
				list.add(memberDTO_T); //파일에서 읽은 데이터 ArrayList 보관
				
			}catch(EOFException e) {
				break;
				
	}catch (ClassNotFoundException e) {
		e.printStackTrace();
		}
	}
	ois.close();
	System.out.println("파일 읽기 완료");
	
	}catch(IOException e) {
		e.printStackTrace();
        }
    }
}

----------------------------------------------------------------


import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MembrNameAsc_T implements Member_T{

@Override
public void execute(List<MemberDTO_T> list) {
	System.out.println();
	System.out.println("이름순으로 오름차순 정렬합니다.");

	Comparator<MemberDTO_T> com = new Comparator<MemberDTO_T>() {
		
		@Override
		public int compare(MemberDTO_T m1, MemberDTO_T m2) {
			return m1.getName().compareTo(m2.getName());
		}
	};
	
	Collections.sort(list, com);

	System.out.println();
	System.out.println("아래와 같이 정렬됩니다.");
	System.out.println();
	System.out.println("이름\t나이\t핸드폰\t\t주소");
    for (MemberDTO_T memberDTO_T : list) {
        System.out.println(memberDTO_T);
        }             
    }	
}

----------------------------------------------------------------


데이터베이스(Database)

DBMS(Data Base Management System)

데이터베이스 관리 시스템(DBMS)은 데이터베이스(Database)를 관리하는 소프트웨어를 의미하며, 대표적인 기능은 데이터의 정의(Define), 생성, 조작, 공유, 보호, 유지 보수가 있다.

오라클 포트 번호 1521 (외워)

연습용 계정 hr / hr
관리자 계정은 건들지 않는게 좋음
계정 = sys, system은 관리자,


설치는 app 폴더 안에 하자.

다음 다음 후


1521 포트로 허용시켜 놨음.

관리자로 로그인

현재 위치..

cmd로도 똑같이 들어올 수 있다.

하면 나가짐

cmd는 분리만 됨

너는 누구야? 알려줘 - show user

현재 데이터 베이스의 이름은 XE입니다~


hr 계정

  • 오라클 18c 버전 이후에는 연습용 스키마가 따로 분리되어 있어서 따로 설치해야 한다.
  • 반드시 관리자 계정(system)에서 해야 한다
  • cmd (관리자 권한으로 실행)

SQL> select * from all_users;

hr계정이 안 보인다.
예전에는 lock으로 설정되어 있어서 unlock으로 풀어 썼지만 지금은 hr 계정이 존재하지 않기 때문에 hr계정을 만들어서 사용해야 한다.

SQL> alter session set "_ORACLE_SCRIPT"=true;

세션이 변경되었습니다.

hr 계정 생성 시 '올바르지 않은 이름' 오류를 방지하기 위함이다.

SQL> @?/demo/schema/human_resources/hr_main.sql

@ - 실행하세요 라는 뜻.
? - 앞에 긴 주소를 너무 길어서 ? 로 대체
human_resources 폴더가 존재하는 위치
C:\app\bitcamp\product\21c\dbhomeXE\demo\schema\human_resources

마지막에 이런 error가 뜨는 경우

__SUB__CWD__는 현재 디렉토리를 저장하는 변수인데, 제대로 작동하지 못할 수 있다.
그러므로
C:\app\bitcamp\product\21c\dbhomeXE\demo\schema\human_resources\hr_main.sql 파일을 열어서
@__SUB__CWD__ → @?/demo/schema로 수정하면 된다.

아니오 누른다~

사용자 계정 만들기

  • 반드시 관리자 계정(system)에서 해야 한다.
    - 계정명 앞에 c##을 붙여야 한다.

계정명 : c##java (12c부터)
비밀번호 : 1234
① SQL> create user c##java identified by 암호;

② SQL> grant create session, create table, create sequence, create view to c##java;
↳ 이 계정에게 4개의 권한을 줌.

③ SQL> alter user c##java default tablespace users;
↳ users 가 테이블스페이스명이다

④ SQL> alter user c##java quota unlimited on users;
↳ UNLIMITED는 사용자가 USERS 테이블스페이스가 완전히 채워질 때까지 데이터를 저장할 수 있음을 지정하는 키워드

테이블스페이스(TableSpace) 정의

테이블이 저장되는 공간입니다.
오라클 에서는 테이블스페이스라고 해서 테이블이 저장될 공간을 먼저 만들고 나서 테이블을 생성합니다.
각각의 테이블을 테이블스페이스별로 나누어서 관리와 퍼포먼스의 향상을 가지고 오는 것입니다.
테이블스페이스를 생성하면 정의된 용량만큼 미리 확보한 테이블스페이스가 생성되어지고 생성되어진 테이블스페이스에 테이블의 데이타가 저장됩니다.
예를 들면 많은 데이터가 쌓일 게시판 테이블은 기본용량 100MB, 자동 확장 10MB로 테이블스페이스를 만들어서 그곳에 게시판 테이블을 만들어 쓰면 게시판 데이터는 그곳에 100MB 까지 데이터가 저장되고 용량 초과 시 자동적으로 10MB 단위로 테이블 스페이스의 크기는 확장됩니다.

관리자 계정 시트에서 작성.

자바 계정 생성

예제

create table 연산(
x int, -- 고정형, int는 소수이하 자른다(반올림 된다)
y number, -- 가변형, number는 소수이하 놔둔다
z number(10,3)); -- 전체 10자리에 소숫점이하 3째자리 까지만 보여준다.

insert into 연산 values(25, 36, 12.34567);
-- 필드명 생략 가능하게 되면 필드를 빠짐없이 순서대로 입력해야한다
insert into 연산 values(25, 36, 1234567.3456); -- 유효숫자는 최대7자리

insert into 연산 values(25, 36, 12345678.3456); -- error


트랜잭션

commit을 하기 전까지의 모든 명령어

insert, update, delete에 lock이 걸려있다.

commit

rollback;을 하면 commit한 시점으로 돌린다.

레코드 추출

  1. select 필드, 필드,.. from 테이블명;

  2. select * from 테이블명;

  3. select * from 테이블명 order by 필드명 asc; → 오름차순(asc는 생략가능)

    select * from 테이블명 order by 필드명 desc; → 내림차순

    select * from 테이블명 order by 필드명 asc, 필드명 desc;

    → 첫번째 필드에 똑같은 데이터가 존재하면 두번째 필드로 정렬한다.

  4. select * from 테이블명 where 조건;

조건을 주고 select 함

select * from dbtest where name = '홍길동';

select * from dbtest where age < 20;
나이가 20보다 적은 모든 사람들

select * from dbtest where name like '%홍%';
홍이 들어가는 모든 이름

select * from dbtest where name like '홍%';
홍이 맨 앞에 있는 이름

select * from dbtest where name like '%홍';
홍이 맨 뒤에 있는 이름

select * from dbtest where name like '_홍%';
앞에는 어떤 글자 0홍~

문제 -- 이름에 홍이 들어가면서 나이가 20이상인 레코드만 추출하세요

답 = select * from dbtest where name like '%홍%' and age >= 20;

추가적인 방법들.

select * from dbtest order by name;

select * from dbtest order by name asc;
이름으로 오름차순

select * from dbtest order by name desc;
이름으로 내림차순

select * from dbtest where name = 'Hong';
데이터는 대소문자 가림

select * from dbtest where lower(name)= 'hong';
lower() 소문자

select * from dbtest where upper(name) = 'HONH';
upper() 대문자

별칭을 주는 as는 "" 을 사용

select name, age, height, age+height as "나이와 키의 합" from dbtest;

select * from dbtest where age is null;

  • age의 값이 null인 레코드 불러오기

select * from dbtest where age is not null;

  • age의 값이 null이 아닌 레코드 불러오기

update dbtest set age = 0 where name = '홍당무';

레코드 수정

[형식]
update 테이블명 set 수정할 내용 where 조건

update dbtest set age=0 where name='홍당무';
↳ 홍당무 라는 이름을 가진 필드의 나이를 0으로 수정

update dbtest set age=0, height=0 where name='진분홍';
↳ 진분홍 라는 이름을 가진 필드의 나이와 키를 0으로 수정

update dbtest set age=age+1;
↳ dbtest 테이블의 모든 나이를 +1씩 수정

update dbtest set age=age+1 where name='홍길동';
↳ 홍길동 라는 이름을 가진 필드의 나이를 +1하여 수정

레코드 삭제

delete 테이블명; ← 모든 레코드 삭제
delete 테이블명 where 조건;

테이블 삭제

drop table 테이블명;

휴지통으로 간다.

휴지통에 간것을 확인

show recyclebin;
↳ 휴지통에 간것을 확인 - 다른 명령어

flashback table 테이블명 to before drop; ← 복원

purge recyclebin;
↳ 휴지통비우기

select * from recyclebin;
↳ 휴지통에 테이블 정보 검색

drop table 테이블명 purge;
↳휴지통을 거치지 않고 바로 삭제 (영구 삭제)

시퀀스 객체

: 순차적으로 정수값을 자동으로 생성하는 객체

create sequence 시퀀스명
[increment by 증가값][start with 시작값]
[maxvalue 최대값 | minvalue 최소값][cycle | nocycle]
[cache | nocache]

  • increment by 증가값 : 증가/감소 간격(기본값 : 1)
  • start with : 시작번호(기본값 : 1)
  • maxvalue/minvalue : 시퀀스의 최대/최소값 지정
  • cycle/nocycle : 최대/최소값에 도달 시 반복여부 결정
  • cache/nocache : 지정한 수량 만큼 메모리 생성여부 결정
    (최소값 : 2, 기본값 : 20)

SQL> create sequence test increment by 2 start with 1 maxvalue 9 cycle nocache;

create sequence sample nocycle nocache;

Sequence created.

SQL> select test.nextval from dual;
↳ dual 가상 테이블명

1에서 엔터 할때 마다 2씩 증가 -> 1, 3, 5, 7..

SQL> select test.currval from dual;
SQL> select * from user_sequences;
SQL> drop sequence test;
Sequence dropped.

0개의 댓글