Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

ALLYES

[2022년 청년친화형 기업 ESG지원 사업 - 11] 본문

ESG

[2022년 청년친화형 기업 ESG지원 사업 - 11]

Allyes_99 2022. 9. 20. 17:47

일시 : 2022.09.20

시간 : 9:00 ~ 18:00


오전 : Database

오후 : Java


  • 개념 
    • 논리적으로 하나 이상의 테이블에 있는 데이터의 부분 집합을 나타냄
  • 목적 
    • 데이터 액세스 제한
    • 복잡한 질의 쉽게 작성
    • 데이터 독립성 제공
    • 동일한 데이터로부터 다양한 결과를 얻기 위해
  • 단순 뷰 및 복합 뷰
    • 단순 뷰 : 테이블의 원본데이터를 그대로 보여줌
    • 복합 뷰 : 테이블의 데이터가 아닌 변형된 데이터를 보여줌
  • 뷰 생성문
create view empvu80
as
select employee_id, last_name, salary
from employees
where department_id = 80;

create view salvu50
as
select employee_id id_number, last_name name, salary*12 and_salary
from employees
where department_id=50;


  • 테이블 vs 뷰

  • 뷰 수정
    • create 명령문
    • replace 명령문
  • 복합 뷰 생성
create view dept_sum_vu
as
select department_id, min(salary) minsal, max(salary) maxsal, avg(salary) avgsal
from employees
group by department_id;

  • 예제 : 부서별 최저 급여를 받는 사원의 이름과 급여와 최저급여를 출력하시오.
  • 서브 쿼리 사용
select last_name, salary
from employees
where (department_id, salary) in (select department_id, min(salary)
							from employees
							group by department_id)
  • 뷰 사용 
select e.last_name, e.salary, d.minsal
from employees e, dept_sum_vu d
where e.department_id = d.department_id
and e.salary = d.minsal;

 


  • 뷰 제거
    • 데이터베이스의 기본 테이블을 기반으로 하므로 데이터 손실 없이 뷰를 제거 가능
    • 독립성 보장
drop view empvu80;
  • 인라인뷰
    • 개념
      • 정렬된 data를 가진 가상 테이블
      • SQL문에서 사용 가능한 별칭을 사용하는 서브쿼리
      • from절에 있는 명명된 서브쿼리

인라인뷰는 어려울 수 있음

이를 쉽게 해결하는 방법 : rownum

 

  • rownum : 행이 출력이 되고나서 출력된 임의의 행의 번호
    • rownum 예시
select rownum, last_name, salary
from employees;

             ● rownum < 4

select rownum, last_name, salary
from employees
where rownum < 4;

             ● rownum > 4

select rownum, last_name, salary
from employees
where rownum > 4;

Why?

출력이 되지 않은 행의 번호는 출력이 되지 않음 == 결과 값이 없다고 나옴

               ● rownum < 4 , oreder by salary asc

select rownum, last_name, salary
from employees
where rownum < 4
order by salary asc;

Why?

where절부터 실행이 되기 때문에 결과가 이상하게 나옴

이를 해결하기 위해 Top-N분석 사용

  • Top-N 분석
    • 열에서 가장 큰 n개의 값 또는 가장 작은 n개의 값을 요청
    • 인라인 뷰 사용
select last_name, salary
from (select last_name, salary
	from employees
	order by salary asc)
where rownum < 4

  • Top-N분석 예제
    • 부서별 평균급여가 많은 상위 3개의 부서번호와 평균급여를 출력하시오.
    • avg : 그룹함수로 인식, avg(salary)는 네이밍 규칙에 의하여 에러 발생
    • 이를 해결하기 위해 alias를 사용하여 avgsal로 변경
select department_id, avgsal
from ( select department_id, avg(salary) as avgsal
	from employees
	group by department_id
	order by avg(salary) desc)
where rownum < 4


  • 데이터베이스 객체
    • 인덱스
      • 테이블의 검색 속도 향상을 위해 만들어짐
      • 컬럼에 설치
      • create (unique) index empidx on employees(emp_id)
        • 유일하다는 단어가 제시가 되어있어야 unique 사용, 그렇지 않다면 표기 금지
    • 시퀀스
      • 개념 
        • 고유번호 자동생성
        • 공유 가능한 객체
        • 일반적으로 기본키 값을 생성하는데 사용
        • 응용 프로그램 코드 대체
      • 수정
        • strat with 변경 x => 굳이 변경 하겠다면 지웠다가 다시 생성
        • maxvalue는 크기를 크게 키우기는 가능
      • 예제
create sequence dept_deptid_seq
	increment by 10			// 증가 값
	start with 120			// 첫번째 생성되는 squence number
	maxvalue 9999			// 마지막에 생성되는 squence number
	nocache					// 캐시x
	nocycle;				// 주기 반복 x

                   ● 시퀀스 확인 : 데이터 딕셔너리

select sequence_name, min_value, max_value, increment_by, last_number
from user_sequences;

 

  • NEXTVAL 및 CURRVAL
    • NEXTVAL 개념
      • 사용 가능한 다음 시퀀스 값을 반환
      • 참조될 때마다 고유한 값을 반환
    • CURRVAL 개념
      • 현재 시퀀스 값 반환
      • NEXTVAL이 실행이 되어야 실행가능
  • 사용자 액세스 제어
    • 목표
      • 사용자 생성
      •  보안 모델 설정 및 유지 관리 용이하게 해주는 롤 생성
      • GRANT , REVOKE문 사용하여 객체 권한 부여 및 취소
      • 데이터 베이스 링크 생성 및 액세스
    • 보안
      • 권한이 없는 애들이 DB 접근 방지
      • 권한이 있는 애들이 DB 불법적인 행위 방지

    • 사용자 시스템 권한
      • DBA : 생성된 사용자에게 특정 시스템 권한 부여 가능
        • 암호 변경
          • 권한 집합체
          • 롤에 권한 부여
          • 사용자에게 롤을 부여
        • 객체 권한
          • 특정 테이블, 뷰, 시퀀스 또는 프로시저에 대해 특정 작업을 수행할 수 있는 권한
          • 객체마다 다름
          • 소유자는 객체 대한 모든 권한을 갖음
          • 소유자는 자신의 객체에 대한 특정 권한을 부여가능
    • 예제 실습
// DBA계정일 경우에만 가능

create user test		// id
identified by test;		// pw

// 로그인 권한
grant create session to test;	// grant : 권한 부여, create session : 권한 이름(DB접속)

// table 생성 권한
grant create table to test;

// 개발권한 부여
grant connect, resource to test;

// 권한 회수
revoke connect, resource from test;

 


 

과제 : 14장 연습문제

기간 : 9/25_9:00, 개인톡으로 제출

1.

member : systemdate : sysdate (default)로 지정

title : 확인란에 check 주라는 의미

title_copy : 복합pk 생성

rental : pk가 4개, fk1,fk2(복합 fk), sysdate + 2 => 이틀 뒤 라는 의미

reservation : 복합fk

 

2. 생략

 

3. c번 생략

 

4. insert작업, c번에서 title에 빈칸이 있음고민할것, d : 3 days ago, 1day ago : 계산식을 넣을것(sysdate기준으로)

 

5. 뷰 생성

 

6. 업데이트

 

7. 테이블 구조 변경

 

8. 생략


오후 [Java]

예제

import java.util.Scanner;

public class Ex01_메소드 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("정수형");
		int num1 = sc.nextInt(); 
		int num2 = sc.nextInt();
		addInteger(num1, num2);
		
		System.out.println("실수형");
		double num3 = sc.nextDouble();
		double num4 = sc.nextDouble();
		addDouble(num3, num4);
		
		System.out.println("정수+실수형");
		int num5 = sc.nextInt();
		double num6 = sc.nextDouble();
		System.out.println(addIntAndDouble(num5,num6));
	}
	// 실수형
	private static void addDouble(double num3, double num4) {
		System.out.println(num3 + num4);
	}
	// 정수형
	private static void addInteger(int num1, int num2) {
		System.out.println(num1+num2);
	}
	
	// 한 개의 정수, 한 개의 실수를 매개변수로 받아 두 수의 합을 반환하는 addIntAndDouble함수
	private static double addIntAndDouble(int num5, double num6) {
		return num5+num6;
	}
	

}

 

  • 메소드 오버로딩[MethodOverloading]
    • 개념 
      • 메소드의 이름은 하나만 주고 매개변수를 다르게 함으로써 메소드를 여러 개 만드는 기법
      • 구별은 매개변수의 개수 및 매개변수의 데이터 타입으로 구분
    • 조건
      • 메소드 이름이 같아야함
      • 매개변수의 개수 or 타입이 달라야함
      • 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 아님
    • 장점
      • 메소드 이름의 낭비 방지
      • 같은 메소드에 여러 종류의 매개변수를 받을 수 있음
  • 절차적 프로그래밍 (Procedural Programming)
    • step by step(Process)
    • Data and Logic Mixed 
    • 단점
      • 가독성 ↓
      • 유지보수가 힘듬
  • 객체 지향 프로그래밍 : Object Oriented Programming(OOP)
    • 개념
      • 여러 개의 독립된 단위
      • 객체들의 모임으로 파악하고자 하는 것
      • 각각의 객체는 메시지를 주고 받고 데이터를 처리
    • 장점
      • 유지보수 편리
    • Class
      • 개념 
        • 틀 또는 설계도
      • 구조
        • Field : 필드 
          • 해당 클래스 내에 정의된 변수 의미
          • 정의된 변수는 객체의 특성을 나타냄
          • 이름, 키, 나이, 성별, 머리색
        • Method : 메소드
          • 객체가 행해야 하는 작업을 기술한 것
          • 객체의 기능
          • 걷다, 먹다, 자다, 싸우다, 말하다
    • Object
      • created from the class 
      • 클래스의 인스턴스
        • 인스턴스 == 객체
      • 설계도를 통해 만들어진 것

package 객체지향프로그래밍;

public class Person {
	
	// 창조주가 되어서 원하는 사람을 만들 수 있는 '설계도'
	
	// 클래스의 구조
	// 1. 필드 : 객체의 특징, 속성, 데이터적으로 정의할 수 있는 것
	// 나이, 키, 이름, 성별 ....
	
	String name;
	int age;
	String gender;
	
	
	// 생성자 메소드 : 객체가 생성되는 순간에 자동으로 호출되는 메소드
	//			 : 생성과 동시에 필드에 값을 적용
	// 생성자의 특징
	// 1. 리턴타입이 없음(void 자체도 없음)
	// 2. 메소드 이름은 클래스와 동일하다
	// 3. 생성자는 new 키워드를 통해서만 이루어집니다.
	public Person(String name, int age, String gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}
	
	// 기본생성자, default 생성자
	// 또 다른 생성자가 없는 경우 클래스 내에 존재하지 X
	// 하지만, 하나 이상의 생성자가 존재하면 자동생성X
	public Person() {
		
	}
	
	
	// 2. 메소드 : 객체가 할 수 있는 행위, 기능, 행동
	// 먹기, 자기, 달리기 ...
	
	public void eat() {
		System.out.println("맛있게 냠냠 먹기");
	}
	public void sleep() {
		System.out.println("쿨쿨 자기!");
	}
	public void run() {
		System.out.println("집으로 달려");
	}

	
}

 

  • 생성자 메소드
    • 개념
      • 객체가 생성되는 순간에 자동으로 호출되는 메소드
      • 생성과 동시에 필드에 값을 적용
    • 특징
      • 리턴타입이 없음(void 자체도 없음)
      • 메소드 이름은 클래스와 동일하다
      • 생성자는 new 키워드를 통해서만 이루어집니다.
      • 생성자 메소드도 오버로딩 가능
    • 기본 생성자
      • 또 다른 생성자가 없는 경우 클래스 내에 존재하지 X
      • 하지만, 하나 이상의 생성자가 존재하면 자동생성X
package 객체지향프로그래밍;

import java.util.Scanner;

public class PersonMain {

   public static void main(String[] args) {

      // Person 설계도 클래스를 통해서 실제 사람(object)이 만들어지는 클래스
      
      // 1. 객체(사람) 생성하기
      // 객체를 생성할 때 - new 키워드 사용해서 생성
      // 클래스이름 객체명 = new 클래스이름();
      Scanner sc = new Scanner(System.in);
      Person p1 = new Person();
      Person p2 = new Person();
      Person p3 = new Person("황예진", 20, "여자");
      
//      sc.next();
      p1.name = "이주희";
      System.out.println(p1.name);
      System.out.println(p1.age);
      System.out.println(p1.gender);
      
      System.out.println("p1 의 주소값 : " + p1);
      
      p1.age = 20;
      p1.gender = "여자";
      System.out.println(p1.name);
      System.out.println(p1.age);
      System.out.println(p1.gender);
      
      p2.name = "이수환";
      p2.age = 100;
      p2.gender = "남자";
      
      System.out.println(p2.name);
      System.out.println(p2.age);
      System.out.println(p2.gender);
      
      p1.eat();
      p1.sleep();
      p1.run();
      
      p2.eat();
      p2.sleep();
      p2.run();
      
      
      
   }

}