분류 전체보기 (277)

반응형

 

관계형 데이터 모델

 

: 관계형 데이터베이스(RDB)에서 사용하는 모델이다.

 

관계형 데이터 모델 구성 요소

 

- 관계 연산

UNIO : 합집합

INTERSECT : 교집합

DIFFERENCE : 차집합

PRODUCT : 카티젼 곱

RESTRICTION : 수평적인 부분 집합

PROJECTION : 수직적인 부분 집합

JOIN

 

관계 연산

 

 

- 관계형 데이터 모델의 성공 요인

 

1. 단순하고 이해가 쉬움 : 테이블 형식

2. 수학적 이론 기반

3. 비절차적인 질의어 사용 : SQL 사용

4. 지속적인 투자와 기술 지원

 

 

 

제약 조건

 

1. 엔터티 무결성 규칙 (= 개체 무결성 규칙)

: 튜플의 유일성을 보장하기 위한 제약 조건

 

- 기본키(PK)

 · 튜플 유일성 보장을 위해 하나 이상의 속성으로 구성된 식별자

 · 유일성(uniqueness)와 최소성(minimality)을 만족

 

· 유일성

: 기본 키를 구성하는 값이 릴레이션내에서 유일

 

· 최소성

: 유일성을 해치지 않는 최소 속성

 

 

2. 참조 무결성 규칙

: 데이터의 일관성을 보장하기 위한 제약 조건

기본 키와 참조 키 간의 관계가 항상 유지된다는 걸 보여준다.

참조하기 위해서는 참조되는 속성 값이 해당 릴레이션에 존재해야 한다.

외래키(foreign key = FK) : 다른 릴레이션의 칼럼 값을 참조하는 칼럼

 

 

3. 도메인 무결성 규칙 (= 영역 무결성 규칙)

: 속성에서 허용 가능한 값의 범위를 지정하기 위한 제약 조건

특정 속성 값이 그 속성에 정의된 도메인에 속한 값이어야 한다는 규칙

ex) 성별의 경우 '남', '여'로 입력받게 한다. 이때 '남', '여'를 제외한 값은 입력하지 못한다.

 

 

 

SQL(Structured Query Language) 이란

 

: 비절차적 언어로 간단한 SQL문을 사용하여 작업을 요청할 수 있다.

대부분의 관계형 DBMS에서 채택하고 있는 질의어이다.

 

+비절차적 언어 : 사용자가 자신이 원하는 바만 명시하면 되며 DBMS을 어떻게 처리할지 명시할 필요 없는 언어.

+질의어(DQL) : 데이터베이스와 정보 시스템에 질의를 할 수 있게 하는 언어

 

 

- SQL 사용 방식

1. 대화식 SQL : 직접 SQL 문을 입력하고 실행결과를 확인하는 방식 ex) 최종 사용자들이 사용

2. 내장식 SQL : C, Java 와 같은 프로그램 안에 포함되어 SQL 문을 사용하는 방식 ex) 응용 프로그래머가 사용

 

 

 

관계형 데이터베이스 주요 용어 요약

 

객체 : 논리적 표현

관계 : 테이블, 튜플들의 집합

: 가상의 테이블, 테이블처럼 사용되지만 실제 데이터를 갖지 않음

튜플 : 행, 레코드

속성 : 열, 컬럼, 필드

도메인 : 사용자가 정의한 데이터 범위의 데이터 타입

카디날리티 : 행들의 수

차수 : 열들의 수

: 튜플을 유일하게 구별할 수 있는 속성 모음

널값(Null) : 존재하지 않는 값

 

반응형
반응형

 

문제

 

1. VIEW_EMP1에서 고용일이 2000년 이후이고 급여가 350만원 이상인 사원을 조회하시오.

 

2. VIEW_EMP2에서 업무(job)가 특수영업인 사원을 조회하시오.

 

3. VIEW_EMP3에서 생일이 1999년도인 사원을 조회하시오.

 

4. VIEW_EMP1에서 고용인원수, 평균급여, 최저급여, 최고급여를 조회하시오.

 

5. VIEW_EMP2에서 업무(job)가 ‘품’이들어간 사원을 모두 조회하시오.

 

6. VIEW_EMP3에서 1995~1999년 사이에 태어난 사원수와 총예산을 표시하시오.

 

힌트

더보기

1. 타입이 맞지 않는다면 '00/12/31' 이후로 하여 조회한다.

   여러개의 조건을 이용시 and 을 사용한다.

 

2. 한글로 조회 시 작은 따옴표(' ')로 감싸야 한다.

 

3. 특정 문자만 잘라 사용하고 싶다면 substr을 사용한다.

substr(속성명, 시작위치, 길이)

 

4. 수를 알기 위해선 count를 사용한다.

평균의 경우 avg

최저의 경우 min

최고의 경우 max

 

5. 특정 단어가 포함된 것을 조회할 때는 like 와 %를 사용한다.

 

6. 조회한 것만 보고자 한다면 select * 대신 select 보고자 하는 테이블로 확인한다.

 

 

 

제공되는 테이블과 데이터

 

-- 테이블 생성
create table emp (
        empid char(6) not null,
        name varchar2(20) not null,
        dept varchar2(20) not null,
        hire_date date,
        birthday varchar2(20),
        address varchar2(50),
        job varchar2(20),
        salary number(10),
        constraint pk_emp primary key(empid)
    );

-- 테이블 조회
select * from emp;

-- 데이터 삽입
INSERT INTO EMP(EMPID,NAME,DEPT,HIRE_DATE,BIRTHDAY, ADDRESS, JOB, SALARY)
        VALUES('1006','김민수','개발부',SYSDATE,'1985.10.12','대전시 서구 갈마로29', 'ERP프로그램', 350);
INSERT INTO EMP(EMPID,NAME,DEPT,HIRE_DATE,BIRTHDAY, ADDRESS, JOB, SALARY)
        VALUES('1002','곽희준','영업부',SYSDATE,'1985.10.12','서울시 동작구 노량진로100', '특수영업', 400);
INSERT INTO EMP(EMPID,NAME,DEPT,HIRE_DATE,BIRTHDAY, ADDRESS, JOB, SALARY)
        VALUES('1003','김동준','생산부',SYSDATE,'1985.10.12','부산시 남구 해운대로15', '품질관리', 300);
INSERT INTO EMP(EMPID,NAME,DEPT,HIRE_DATE,BIRTHDAY, ADDRESS, JOB, SALARY)
        VALUES('1004','성재규','인사부',SYSDATE,'1999.08.10','대구시 중구  달성로 300', '급여관리', 450);
INSERT INTO EMP(EMPID,NAME,DEPT,HIRE_DATE,BIRTHDAY, ADDRESS, JOB, SALARY)
        VALUES('1005','박성범','구매부',SYSDATE,'1985.10.12','대전시 중구 계룡로800', '수입자재', 320);

 

 

 

1번 문제

 

-- 1. VIEW_EMP1에서 고용일이 2000년 이후이고 급여가 350만원 이상인 사원을 조회하시오.
select * from view_emp1 
    where 
        HIRE_DATE > '00/12/31'
    and
        SALARY >= 350;

 

결과 화면

 

 

 

2번 문제

 

-- 2. VIEW_EMP2에서 업무(job)가 특수영업인 사원을 조회하시오.
select * from view_emp2
    where
        JOB = '특수영업';

 

결과 화면

 

 

 

3번 문제

 

-- 3. VIEW_EMP3에서 생일이 1999년도인 사원을 조회하시오.
select * from view_emp3
    where
        SUBSTR(BIRTHDAY, 1, 4) = '1999';

 

substr(속성명, 시작위치, 길이)

 

결과 화면

 

 

 

4번 문제

 

-- 4. VIEW_EMP1에서 고용인원수, 평균급여, 최저급여, 최고급여를 조회하시오.

-- 고용인원수
select count(*) from view_emp1;

-- 평균급여
select avg(SALARY) from view_emp1;
    
-- 최저급여
select min(SALARY) from view_emp1;

-- 최고급여
select max(SALARY) from view_emp1;

select count(*) 고용인원수, avg(SALARY) 평균급여, min(SALARY) 최저급여, max(SALARY) 최고급여 from view_emp1;

select count(*) 고용인원수, round(avg(SALARY)) 평균급여, min(SALARY) 최저급여, max(SALARY) 최고급여 from view_emp1;
-- round를 사용하지 않아도 괜찮지만 소수점을 위해 round를 사용해야 함

 

avg(속성명) : 평균

min(속성명) : 최저

max(속성명) : 최고

 

결과 화면

 

 

 

5번 문제

 

-- 5. VIEW_EMP2에서 업무(job)가 ‘품’이들어간 사원을 모두 조회하시오.
select * from view_emp2
    where
        job like '%품%';

 

속성명 like '%문자%' ;

와일드 카드(%)가 뒤에만 있다면 첫글자는 문자 여야 한다.

 

결과 화면

 

 

 

6번 문제

 

-- 6. VIEW_EMP3에서 1995~1999년 사이에 태어난 사원수와 총예산을 표시하시오.
select count(*) 인원수, (count(*)*100) 총예산
    from view_emp3
    where
        substr(BIRTHDAY, 1, 4) between 1995 and 1999;
        
select count(*) 인원수, (count(*)*100) 총예산
    from view_emp3
    where
        BIRTHDAY >= '1995.01.01' and BIRTHDAY <= '1999.12.31';

 

속성명 between 비교값1 and 비교값2 ;

 

결과 화면

 

반응형
반응형

 

Scanner 사용

 

Class 안에 하단의 코드를 기입해야만 Scanner을 사용할 수 있다.

 

Scanner 이름 = new Scanner(System.in);  // System.in 은 키보드로 입력 받는다는 뜻
// ctrl + shift + o로 인해 위에 import 함.

String 변수명 = 이름.nextLine(); // 데이터를 입력 받음
String 변수명 = 이름.next();
int 변수명 = 이름.nextInt();

 

package kr.or.ddit.study02.sec03;

import java.util.Scanner;


public class CastExample01 {
	Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		CastExample01 obj = new CastExample01();
		obj.method1();
	}
	
	public void method1() {
		String str = sc.nextLine(); // 데이터를 입력 받음
		System.out.println("키보드로 입력 받은 값은 : " + str);
		
		/*
		 * 문자열 -> 문자
		 * String -> char
		 */
		char ch = str.charAt(0); // 0이 첫번째 문자열을 뜻함, 두번째 문자열로 변경 후 한 글자만 입력 시 오류.
		System.out.println("키보드로 입력 받은 첫번째 문자는 : " + ch);
	}
}

 

결과 화면

 

 

 

타입 변환

 

- 자동 타입 변환

: 작은 타입이 큰 타입으로 저장되는 경우 발생한다.

 

타입 변환

 

· 범위

byte < short < int < long < float < double

 

 

- 강제 타입 변환

: 큰 타입을 강제로 작은 타입으로 나누어 저장하는 경우 발생한다.

Wrapper class를 이용하여 변환할 수 있다.

 

변환 방법

변환 타입 사용 예
String -> byte String str = "10" ;
byte value = new Byte(str).byteValue ;
// byte value = Byte.parseByte(str) ;
// byte value = Byte.valueOf(str) ;
String -> short String str = "200" ;
short value = new Short(str).shortValue ;
// short value = Short.parseShort(str) ;
// short value = Short.valueOf(str) ;
String -> int String str = "300000000" ;
int value = new integer(str).intValue ;
// int value = Integer.parseInt(str) ;
// int value = Integer.valueOf(str) ;
String -> long String str = "4000000000000" ;
long value = new Long(str).longValue ;
// long value = Long.parseLong(str) ;
// long value = Long.valueOf(str) ;
String -> float String str = "12.345" ;
float value = new Float(str).floatValue ;
// float value = Float.parseFloat(str) ;
// float value = Float.valueOf(str) ;
String -> double String str = "12.345" ;
double value = new Double(str).doubleValue ;
// double value = Double.parseDouble(str) ;
// double value = Double.valueOf(str) ;
String -> boolean String str = "true" ;
boolean value = new Boolean(str).booleanValue ;
// boolean value = Boolean.parseBoolean(str) ;
// boolean value = Boolean.valueOf(str) ;

 

 

 

자동 타입 변환 예시

 

int -> double 변환

 

int 변수명1 = 90;
double 변수명2 = 변수명1 / 3.0; // int 타입 / int 타입의 경우 int 타입이기에 double로 변환되지 않음
// 그렇기에 3.0 또는 앞에 (double)로 실수 타입으로 변환해주어야 함.

 

package kr.or.ddit.study02.sec03;

public class CastExample02 {
	public static void main(String[] args) {
		CastExample02 obj = new CastExample02();
		obj.method1();
	}
	
	public void method1() {
		/*
		 * int type 
		 * 국어 영어 수학
		 * 점수 입력 해보기
		 */
		int kor = 90;
		int eng = 77;
		int math = 84;
		
		/*
		 * int sum 에 변수 저장해보기
		 */
		int sum = kor + eng + math;
		
		System.out.println("국어: " + kor);
		System.out.println("영어: " + eng);
		System.out.println("수학: " + math);
		
		System.out.println("총점: " + sum);
		
//		double avg = (double)sum / 3;
		double avg = sum / 3.0;
//		double avg = sum / 3; // int 나누기 int로 하여서 double로 바꿔줘야 함
		
		System.out.println("평균: " + avg);
	}
}

 

 

 

강제 타입 변환 예시

 

1. String -> char 변환

.charAt(몇번째 문자열인지)

 

// Scanner 사용
Scanner 명칭 = new Scanner(System.in);
String 변수명1 = 명칭.nextLine(); // 데이터를 입력 받음

// 기존 String을 char로 변환
char 변수명2 = 변수명1.charAt(0); // 0은 몇번째 문자열인지를 뜻한다.
// 프로그램은 0번째부터 존재하기에 0이 곧 처음을 이야기한다.

 

 

2. String -> int 변환

변환하지 않을 시 10 + 10이 1010으로 출력된다.

 

// Scanner 사용
Scanner 명칭 = new Scanner(System.in);
String 변수명1 = 명칭.nextLine(); // 데이터를 입력 받음

// 기존 String을 int로 변환
int 변수명2 = Integer.parseInt(변수명1); // 하단의 2가지를 대신 사용해도 된다.
// int 변수명2 = Integer.valueOf(변수명1);
// int 변수명3 = new Integer(변수명1).intValue();

 

package kr.or.ddit.study02.sec03;

import java.util.Scanner;

public class CastExample03 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		CastExample03 obj = new CastExample03();
		obj.method1();
	}
	
	public void method1() {
		String str = sc.nextLine();
		System.out.println("입력 받은 문자열은 : " + str);
		String str2 = str + 10;
		System.out.println("문자열에 10을 더한 값은 : " + str2);
		
		// 숫자로 바꿀 때
		int num = Integer.parseInt(str); // 문자열 String타입의 숫자를 int타입으로 변환해줌
		num = num + 10;
		System.out.println("숫자로 변환 후 10을 더한 값은 : " + num);
	}
}

 

결과 화면

 

 

3. String -> double 변환

 

// Scanner 사용
Scanner 명칭 = new Scanner(System.in);
String 변수명1 = 명칭.nextLine(); // 데이터를 입력 받음

// 기존 String을 double로 변환
double 변수명2 = Double.parseDouble(변수명1); // 하단의 2가지를 대신 사용해도 된다.
// double 변수명2 = Double.valueOf(변수명1);
// double 변수명2 = new Double(변수명1).doubleValue();

 

package kr.or.ddit.study02.sec03;

import java.util.Scanner;

public class CastExample03 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		CastExample03 obj = new CastExample03();
		obj.method4();
	}
	
	public void method4() {
		/*
		 * 키보드로 문자(double 형 데이터) 데이터를 입력받고
		 * 나누기 3 한 값을 출력 해보기.
		 */
		System.out.println("실수형 숫자를 입력하시오.");
		String str = sc.nextLine();
				
		double d1 = Double.valueOf(str);
		double result = d1/3;
		System.out.println("3으로 나눈 값은 : " + result);
	}
}

 

 

 

출력 메소드

 

아래와 같은 형식으로 쓰인다.

 

System.out.출력메소드 ;

 

1. println() 메소드

: 괄호 안의 내용 출력 후 행 바꿈

 

2. print() 메소드

: 괄호 안의 내용 출력

 

3. printf("형식문자열", 값1, 값2) 메소드

: 괄호 안의 첫번째 문자열 형식대로 내용 출력

 

 

- 형식문자열

 

형식 문자열의 종류

 

 

package kr.or.ddit.study02.sec04;

public class PrintExample {
	public static void main(String[] args) {
		// System.out.print() -- 줄바꿈 없음
		System.out.print("홍길동 ");
		System.out.print(" 34061 ");
		System.out.print(" 대전시 중구 계룡로 ");
		System.out.println();
		
		// System.out.println() -- 줄바꿈.
		// 단축키 syso
		System.out.println("홍길동 ");
		System.out.println("34061");
		System.out.println("대전시 중구 계룡로");
		
		// System.out.printf("형식지정문자열", 변수 리스트)
		// "형식 지정문자열"
		// "%[[-0]n]d 10진 정수
		// - : 왼쪽 정렬
		// 0 : 남은 왼쪽 빈공간에 0 채움
		System.out.printf("숫자 : %d 입니다.\n", 10000);
		System.out.printf("숫자 : %8d 입니다.\n", 10000);
		System.out.printf("숫자 : %-8d 입니다.\n", 10000);
		System.out.printf("숫자 : %08d 입니다.\n", 10000);
	}
}

 

결과 화면

 

 

 

+ System.in.read() 메소드

: 키보드에서 입력된 키보드를 읽는 메소드.

2개 이상 키가 조합된 한글을 읽을 수 없다.

=> Scanner로 문제를 해결했다.

 

반응형
1 ··· 85 86 87 88 89 90 91 ··· 93