22.01.21 DB - 뷰, 기타객체, DCL / JAVA while 반복문

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

데이터엑세스제한

-테이블 저장된 데이터를 볼때 전체가 아닌 일부만 볼수 있도록
-검색 관련 객체
-복잡한 질의를 쉽게 보여줌
-독립된 정보 제공
-동일한 데이터로부터 다양한 결과를 얻을 수 있음
✔ 주의 ✔ 테이블은 데이터 저장하기위한 구조적 공간..테이블은 실질적 데이터를 저장함
-보안목적, 다양한 정보를 얻고자 가상의 데이터 활용
-뷰가 삭제되어도 테이블에 영향을 주지 않음 => 논리적 독립성
-뷰는 구조가 없어서 alter table 명령 안됨
-가짜 논리 테이블
-물리적인 구조를 가지고 있지 않고 저장공간을 할당하지 않는다.
->D.D에 저장 (생성할때 사용했던 서브쿼리의 문장 텍스트를 저장하기 때문에 검색하는 sql 문장이 실행됨)
-테이블+뷰 / 뷰+뷰 / 테이블+테이블 조인가능

단순 뷰 : 데이터 원본을 그대로 보여줌

복합 뷰: 가공 데이터를 보여줌 ex)salary*12 / DML 사용불가

뷰 생성

-서브쿼리로 뷰를 만든다.
-서브쿼리의 컬럼들의 구조가 뷰로 만들어진다.
-create문에 alias 쓰거나 서브쿼리 select문에 alias 써도된다
-원본테이블의 create as 서브쿼리 셀렉문 => 문장이 재실행이 되므로 변경해 출력
-수정하고자할때는 똑같은 뷰를 생성해서 서브쿼리의 문장 텍스트를 변경한다 - > 기존 뷰를 덮어써서, 수정하는 것처럼 보임. create or replace view 를 쓴다.
-셀렉리스트, 프롬 오더바이 절에 인라인 뷰 가상의 테이블 생성해서 프롬절에 넣을 수 있다.

create view empvu80 as select employee_id, last_name, salary from employees where department_id = 80; -> view created. 별칭 가능

  • rownum
    -실제 컬럼이 아닌, 이벤트 같은 가상의 컬럼
    -출력되고 난 후의 행의 번호, 행의 번호를 제어할수있다.
    -행의 번호보다 크다는 사용할 수 없다.

  • Top-N view 분석 : 상위, 하위 값 구할때
    -인라인 뷰(별칭을 가진 서브쿼리, from절의 가상의 테이블 조인. 뷰를 따로 생성할 필요가 없음) + rownum 사용 => Top-N view 분석 인라인 뷰의 행,열 결과물을 가져온다
    -서브쿼리나 외부 질의로 수행됨
    -그냥 오더바이 절 사용시 실행순서 에 의해 안됨

from (select department_id, avg(salary) as avgsal from employees 
group by department_id order by avg(salary) desc)
where rownum<4

기타 객체

인덱스

-데이터 가져올때 포인터를 사용해 행의 위치정보 검색 스키마객체
-스캔 사이 값 찾을때 인덱스가 있다면 속도가 높아짐 I/O 줄여줌

-제약조건 중 pk, uk (중복값x) 설치시 인덱스가 자동 설치
-수동 설치는 사용자가 열에 인덱스 생성
-테이블이 작고 자주 갱신되는 경우 인덱스 생성하지 않는 게 좋다.

파싱작업
1 검증
2 실행계획 테이블 풀스캔 방식 테이블로부터 데이터 가져오는 것
3 실행 데이터추출 인덱스 없을시 테이블 풀스캔

시퀀스

-고유번호를 자동으로 생성해줌
-필요할때만 사용하기 일반적으로 기본키 생성에 사용됨
-데이터를 가지고 있지 않는 데이터 생성기
-값을 메모리에 캐시하면 액세스 효율이 높아짐 캐시 : 메모리중 값을 지정하게 되면 덮어쓰거나 밀려나가지 않음 FIFO -> 오래된 메모리가 먼저 빠져나간다

-nextval : 사용 가능한 다음 시퀀스 값 반환, 시퀀스에서 값을 추출해서 값을 가지고 있지 않음
-currval : nextval에서 추출된 시퀀스 값을 임시저장, 먼저 nextval이 실행되어야함
-시퀀스는 다시 생성하면 추출돼서 이미 테이블이 되어버린 데이터라 증가되는 값이 추출되므로 삭제 후 재생성해야됨
-수정 : 이미추출된 값은 x 이후번호에만 영향을 준다. 현재생성된 시퀀스보다 큰값이면 맥스밸류 수정 가능 start with 변경x 이미 생성이 되어버렸기때문에
->추출된 시퀀스를 삭제해서 다시 사용해도 다시 같은 값으로 추출되지 않는다
줄이는 것은 일부 검증하게 된다.
-시퀀스 삭제는 데이터에 영향 미치지않는다. drop sequence 이름

  • 시퀀스 생성
    create sequence dept_deptid_seq increment by 10 start with 300 maxvalue 9999 nocache nocycle // 중복값을 허용한다는 뜻이기 때문에 대부분 안씀
  • 시퀀스 사용
    insert into departments (department_id, department_name, location_id) values (dept_deptid_seq.nextval, 'support', 2500);
    시퀀스.넥스트벨류 명령으로 사용한다

DCL 사용자 액세스 제어

DB사용자그룹
end유저 : select 이용, db접근x
응용개발자 : DML dml
DBA : 시스템 권한

-DBA가 사용하는 시스템권한
-보안과 관련됨 1.권한 없는자 접근 방지 2. 권한이 있는자 db내 불법적 행위 방지
-권한 grant부여 revoke회수
-시스템권한 : DB 에 액세스할수 있음 새 유저생성 및 제거, 테이블 제거 및 백업
-DBA계정 접근 conn system/비밀번호
-권한이름: sysdba--> conn/as
===>sysdba 상위 권한(제우스같은존재), sysopper 유저 생성
-객체권한 : DB 객체 내용을 조작

grant 권한 생성

create user test identified by test //테스트란 유저 생성
-> 이렇게 하면 100프로 권한을 가지게 됨,,
grant create session to test 테스트란 유저에게 create session 할 권한을 부여함 (session- DB 접속할때 부여하는 권한)

계정을 통해 DB 접속해줘야됨

grant create table to test;
테이블 생성권한 부여되지만 tablespace 테이블 저장공간 권한이 없으므로
grant connect, resource to test; 권한을 유자에 부여하면 DB 생성 테스트 계정들이 만들어짐

revoke 권한 회수

-revoke connect , resource from test;
-alter user test account lock 계정 잠금 / unlock으로 풀림 : 유저관리

롤 : 권한을 모아 놓은 집합

-시스템계정 DBA / connect DB 액세스 관련 권한 / resource 자원과 관련 권한
ex) manager 라는 롤을 생성하고, 롤에 a와 b라는 권한을 부여하고, 유저에게 manager롤을 부여함.

-user는 pw바꿀수있지만 사용하는 자원을 바꿀수는없다.

객체권한

-유저가 소유한 객체는 그 유저가 가지고 있다. 타유저가 내 자원에 뭔가를 하고싶을 때 주는 객체권한. 거의 일어나지않음
grant update(department_name, location_id) on departments to scott, manager; 명시된 테이블 각 컬럼에 변경할 수 있는 권한을 스캇, 매니저 롤에게 부여함

시스템권한은 with admin option으로 부여할 수 있다. 기억해놓기 / 권한 부여자만이 권한회수됨, 종속적 회수 x

객체권한 - with grant option으로 권한 이양 가능 둘다 DBA만 할 수 있다. 권한 회수시 이양 권한도 자동으로 회수

JAVA

반복문
while : 코드반복 언제끝날지 모를때, 반복의 횟수를 모를때

while( 조건식){ true일때 
 		문장실행  t일때도 계속 반복해서 조건식 판별, 
        	거짓일때 실행문 나감
}
int num=1;
	while(num<=10) {
	System.out.println(num);//출력은10까지 되나 
	num++;  //실제 num은 11까지 증가
	}


또는

int num=1;
while(true) { //참일때 아래실행문 
System.out.println(num);   // num출력
num++; // 값이 무한대로 실행됨
	if(num == 11) {  //실제 num이 11까지이므로 11이되면(true)
	break; // 실행문 빠져나가기
	}
		}


		Scanner sc = new Scanner(System.in);
		System.out.print("현재 몸무게: ");
		int p = sc.nextInt();
		System.out.print("목표 몸무게: ");
		int g = sc.nextInt();

		int num = 1;
		while(p > g) {
			System.out.print(num + "주차 감량 몸무게: ");
			num++;
			int s = sc.nextInt();
			p -= s;
			
		} 
		
		System.out.println(p + "kg 달성!! 축하합니다!");```

 
for문: 반복횟수를 알고 있을때



post-custom-banner

0개의 댓글