StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

Oracle 숫자,날짜,자료형 변환 함수 정리

2018-11-27 00:00:00 +0000

숫자 함수

  • ROUND(숫자,반올림위치)
  • 숫자를 반올림 위치에서 반올림
  • SELECT ROUND(10.12324,2) FROM DUAL;
  • 결과 10.12
  • TRUNC(숫자,버림위치)
  • 숫자 반올림을 버림위치에서 무조건 버림
  • SELECT TRUNC(10.1777,3) FROM DUAL;
  • 결과 10.177
  • CEIL(숫자)
  • 정한 숫자에서 큰 정수를 반환
  • SELECT CEIL(3.14) FROM DUAL;
  • 결과 4
  • FLOOR(숫자)
  • 지정한 숫자에서 작은 정수를 반환
  • SELECT FLOOR(3.14) FROM DUAL;
  • 결과 3
  • MOD(나눗셈 될 숫자, 나눌 숫자)
  • 나머지 숫자를 구하는 함수
  • SELECT MOD(10, 3) FROM DUAL;
  • 결과 1

날짜 함수

  • SYSDATE
  • 현재 날짜를 반환하는 함수
  • SELECT SYSDATE FROM DUAL;
  • 결과 18/11/27
  • ADD_MONTHS(SYSDATE, 더할개월)
  • 몇 개월 이후의 날짜를 반환하는 함수
  • SELECT ADD_MONTHS(SYSDATE,3) FROM DUAL;
  • 결과 19/02/27
  • MONTHS_BETWEEN(날짜 데이터1,날짜데이터2)
  • 두 달간 날짜 차이를 구하는 함수
  • SELECT ROUND(MONTHS_BETWEEN(‘2018-11-27’, ‘2019-02-28’),2) FROM DUAL;
  • 결과 -3.03

자료형 반환

  • 형변환을 사용하면 숫자 데이터<->문자 데이터<->날짜 데이터 끼리 변환이 가능하다
  • TO_CHAR(날짜나 문자,문자형태)
  • 날짜OR문자를 자신이 원하는 형태로 반환하는 함수
  • SELECT TO_CHAR(SYSDATE, ‘YYYY/MM/DD HH24:MI:SS’) FROM DUAL;
  • 결과 2018/11/27 18:55:58
  • TO_NUMBER(문자,변환 숫자형태)
  • 문자데이터를 숫자 형태로 반환하는 함수
  • SELECT TO_NUMBER(‘5,000’, ‘999,999’) FROM DUAL;
  • 결과 5000
  • TO_DATE(문자,인식될 날짜형태)
  • 문자 데이터를 날짜 데이터로 변환하는 함수
  • SELECT TO_DATE(‘20181127’, ‘yyyy-mm-dd’) FROM DUAL;
  • 결과 18/11/27

NULL 처리 함수

  • NVL(NULL검사 데이터 OR 열, NULL 대체 문자)
  • NULL일 경우 대체문자로 변경한다

Oracle 제약조건 정리

2018-11-27 00:00:00 +0000

제약조건

  • 데이터를 추가, 삭제, 수정하는 가운데 DB의 무결성을 유지
  • 무결성이란 DB 데이터가 정확하고 기본 규칙을 지킨다는 뜻이다
종류 설명
NOT NULL NULL의 저장을 허용하지 않는다(반드시 값이 존재해야 됨), 중복여부와는 상관없다
UNIQUE 해당 컬럼에서 중복 데이터를 허용하지 않는다, NULL은 중복 대상에서 제외
PRIMARY KEY UNIQUE + NOT NULL 제약조건을 전부 가짐, 중복 데이터 허용X NULL 허용X, 자동으로 인덱스 생성됨
FOREIGN KEY 서로 다른 테이블 간 관계를 정의 함
CHECK 열에 저장할 수 있는 값의 범위, 패턴을 정의할 수 있음
DEFAULT 특정 열에 저장할 값이 지정되지 않았을 경우에 기본값을 지정

컬럼 레벨 제약 조건

  • 컬럼을 생성할 때 데이터 타입 옆에 제약조건을 적는다
CREATE TABLE NAME(
ID VARCHAR(20) NOT NULL
);

테이블 레벨 방식

  • 테이블 칼럼 을 전부 선언 후 제약조건을 나중에 선언하는 것
CREATE TABLE NAME(
PLAYER_ID VARCHAR(20) NOT NULL

CONSTRAINT 제약조건 이름 FOREIGN KEY(컬럼명)
                        REFERENCES 테이블(컬럼명)
);

테이블 수정 방식

  • 테이블을 생성한 후 제약조건을 ALTER 수정하듯이 추가하는 것
CREATE TABLE NAME(
ID NUMBER,
PASS NUMBER
);

ALTER TABLE 테이블이름 ADD CONSTRAINT 제약조건 이름 PRIMARY KEY(컬럼 이름)

Oracle 기초 쿼리 정리

2018-11-26 00:00:00 +0000

Database

  • 서로 연관성을 가지며, 중복 없이 지속성으로 유지 관리해야 할 융용한 데이터들의 집합
  • 데이터 저장을 위한 가장 원시적인 방법으로 데이터 파일 사용
  • 데이터 파일 사용 시 중복 된 데이터 저장
  • 대용량의 데이터를 관리하기 힘듬, 보안의 취약
  • 파일의 단점으로 인해 Database 사용

DBMS란

  • 데이터베이스 관리 시스템
  • 대용량의 데이터를 쉽게 저장하고 효율적으로 검색, 수정,삭제 할 수 있는 환경을 제공해 주는 소프트웨어 Oracle SQL Develop 설치

Oracle 실행

  • cmd 창 열어서 sqlplus/nolog 명령어 사용
  • conn sys as sysdba명령어 치고 비밀번호를 치면 sql에 접속이 가능하다

user 생성 및 로그인

  • user 생성
create user kosta192 identified by 1234;
  • user 권한 전달
grant connect, resource, dba to kosta192;
  • user 로그인
conn id/pass
  • 파일가져오기
  • cmd창에서 SQL 접속한 후 해당 sql파일 위치를 적고 엔터치면 프로시저가 실행된다

hr계정 unlock

conn / as sysdba
alter user hr identified by hr account unlock;
conn hr/hr
select * from tab;

scott계정 불러오기

conn system/1234
@C:\oraclexe\app\oracle\product\11.2.0\server\rdbms\admin\scott.sql
alter user scott identified by tiger;
conn scott/tiger
select * from tab;

테이블 조회

  • select * from table name;
  • 테이블 구조 불러오기
  • DESC 테이블 이름
  • 별칭은 AS
  • 아래 예제는 LAST_NAME 컬럼 이름을 ‘성’으로 변경해서 출력한다
SELECT EMPLOYEE_ID AS 사원번호, LAST_NAME AS "성" FROM employees

중복된 데이터 제거

  • DUSTINCT
SELECT DISTINCT job_id From employees;

정렬 묶음 검색

  • ORDER BY 절 사용
  • 기준 필드를 내림차순 하고 싶다면 필드명 뒤에 DESC를 쓴다
SELECT eno, ename, sal from emp ORDER BY sal DESC

조건에 맞는 일부데이터 불러오기

  • AND : 조건 두개 다 만족하는지 체크
select * from employees WHERE SALARY > 5000 AND SALARY < 10000
  • BETWEEN AND : BETWEEN 과 AND 사이 값에 들어가는지 체크
select * from employees WHERE salary BETWEEN 5000 AND 10000
  • OR 연산자 : 조건이 2개 일 때 하나라도 일치하는지 체크
select employee_id, last_name, job_id from employees where job_id='FI_MGR' OR job_id = 'FI_ACCOUNT';
  • IN 연산자 : 조건이 두개일 때 체크. 둘 중 하나인지 체크
  • 조건 연산자의 반복적인 작업들을 덜어줌
select employee_id, last_name, job_id from employees where job_id in('FI_MGR', 'FI_ACCOUNT')
  • NOT 연산자 : 제외한다는 의미
  • NOT을 사용하거나 <>,!= 기호 사용
SELECT department_id, department_name from departments where not department_id = 10;
SELECT department_id, department_name from departments where not department_id <> 10;
  • IS NOT NULLL : NULL이 아닌지 체크
  • NULL이 아닌 값만 출력
    SELECT * FROM employees where commission_pct is not null
    

    LIKE 연산자

  • ‘김%’ ‘김’으로 시작하는 모든 문자열 예)김길동, 김박사, 김밥
  • ‘%과’ ‘과’로 끝나는 모든 문자열 예)화학과, 인산과
  • ‘%김%’ ‘김’이라는 문자를 포함하는 모든 문자열 예) 김씨, 돌김, 삼각김밥볶음밥
  • ‘화_’ ‘화’로 시작하는 2글자 문자열 예) 화약, 화분
  • ’ ‘등’이 가운데 들어간 3글자 문자열 예)고등어, 영등포

그룹함수

  • sum(), avg(), max(), count()
  • select sum(salary) from employees;

GROUP BY

  • GROUP BY절을 사용한 컬럼 단위로 묶어서 출력한다
  • group by절에서 언급한 컬럼만 사용할 수 있다
SELECT department_id, avg(salary) from employees group by department_id

having절

  • group by로 나온 group 에 또 조건을 걸고 싶을 때 사용
  • 부서별 급여 평균이 5000 미만의 부서의 내역을 검색하라
    select department_id, AVG(salary) 
                  from departments
                  group by departement_id
                  having avg(salary) < 5000 
    

문제2775

2018-11-26 00:00:00 +0000

문제

https://www.acmicpc.net/problem/2775

풀이

층과 호수가 있는 아파트를 2차원로 볼 수 있다
0층에는 i호는 i명이 살도록 저장하고
1층에는 아랫층(k - 1)의 1호(index 0)에서 n호수까지 값을 더하면
현재 k층, n호의 사람수를 구할 수 있다
층, 호 입력은 14층 까지 받으므로 15x15로 만들어야 한다

Source

import java.util.Scanner;
public class Main {
     final static int MAX_ROW = 15;       //층
     final static int MAX_COL = 15;        //호
     static int[][] arr = new int[MAX_ROW][];
     public static void main(String[] args) {
           
           for(int row = 0; row < MAX_ROW; ++row)      //  배열초기화
                arr[row] = new int[MAX_COL];
                
           for(int row = 1; row < MAX_ROW; ++row)      // 1층  정보만 넣어주기
                arr[0][row] = row;
           
           for(int row = 1; row < MAX_ROW; ++row)      //  값넣어주기, 층
                for(int col = 1; col < MAX_ROW; ++col)// 호
                      for(int i = 0; i <= col; ++i)         //  처음~계산하는 호수 까지 값 계속 더하기
                           arr[row][col] += arr[row-1][i];
           
           Scanner sc = new Scanner(System.in);
           final int roop = sc.nextInt();
           
           int[][] test = new int[roop][];             // k, n 값  저장
           
           for(int i = 0; i < roop; ++i){
                test[i] = new int[2];
                test[i][0] = sc.nextInt();            // 층
                test[i][1] = sc.nextInt();            // 호
           }
     
           for(int i = 0; i < roop; ++i){
                int k = test[i][0];
                int n = test[i][1];
                System.out.println(arr[k][n]);
           }
     }
}

재귀함수로 각 사람인원 수 저장하는 소스

import java.util.Scanner;

public class Main {
	final static int MAX_ROW = 15; // 층 유저가 14층. 14호를 입력할 수 있으므로 15x15로 생성해야한다
	final static int MAX_COL = 15; // 호
	static int[][] arr = new int[MAX_ROW][];

	public static int GetValue(int col, int row, int index, int sum) {
		if (col + 1 == index) {
			return sum;
		}
		sum += arr[row][index];
		return GetValue(col, row, index + 1, sum);
	}

	public static void main(String[] args) {
		for (int row = 0; row < MAX_ROW; ++row) // 배열초기화
			arr[row] = new int[MAX_COL];
		for (int row = 1; row < MAX_ROW; ++row) // 1층 정보만 넣어주기
			arr[0][row] = row;
		for (int row = 1; row < MAX_ROW; ++row) // 값넣어주기, 층
			for (int col = 1; col < MAX_ROW; ++col) { // 호
				arr[row][col] = GetValue(col, row - 1, 0, 0);
			}
		Scanner sc = new Scanner(System.in);
		final int roop = sc.nextInt();
		int[][] test = new int[roop][]; // k, n 값 저장
		for (int i = 0; i < roop; ++i) {
			test[i] = new int[2];
			test[i][0] = sc.nextInt(); // 층
			test[i][1] = sc.nextInt(); // 호
		}
		for (int i = 0; i < roop; ++i) {
			int k = test[i][0];
			int n = test[i][1];
			System.out.println(arr[k][n]);
		}
	}
}

DFS

2018-11-21 00:00:00 +0000
  • 깊이 우선 탐색
  • 루트 노드에서 자식노드로 이동
  • 마지막 깊이에 도달한 경우 다시 상위 노드로 올라가 탐색을 재개한다

Source

  • 아래는 임의의 숫자(NUM)의 순열을 나타내는 예제이다
public class Dfs {
     final static int MAX = 7;                                  // 배열 생성을 위한 임의의 수
     final static int NUM = 3;                                  // 깊이 값
     static boolean[] visit = new boolean[MAX];       			// 방문여부  체크
     static int[] arr = new int[MAX];                           // 값 저장
     public static void dfs(final int depth){
           
           // 지정한 깊이보다 현재 깊이가 더 크면 빠져나온다
           if(NUM + 1 == depth){
                // 출력
                for(int i = 1; i <= NUM; ++i){
                      System.out.print(arr[i]+""); 
                }
                System.out.println(" ");
                
           }else{ // 탐색
                for(int i = 1; i <= NUM; ++i){
                      if(false == visit[i]){           	 // 방문하지  않았다면
                           visit[i] = true;              // 들어가지 않은 노드는 들어갔다고 표시를 한다
                           arr[depth] = i;
                           //System.out.println("depth:"+depth+"  i:"+i);
                           dfs(depth+1);            	// 한단계 깊이 들어간다
                           visit[i] = false;            // 최고 깊이에 도달해서 dfs 함수를 빠져나왔다
                           arr[depth] = 0;            	//  그래서 방문여부와 값을 초기화한다
                      }
                }
           }
     }
     
     public static void main(String[] args) {
           dfs(1);
     }
}

Posts

subscribe via RSS