본문 바로가기

수업 정리

20일차 수업 정리(Database, Oracle)

Tip!
 - 데이터를 가져올때 double시 에러가 발생할 수 있음(null이 들어가면 기본형은 오류가 남)
   => double -> Double / NVL(comm, 0)


**관계형 데이터 베이스(Relation DBMS)
    => 테이블의 집합으로 Data를 표현
    => SQL(Structured Query Language)로 질의
    => Oracle, MySQL, MS-SQL server, HANA DB등이 대표적

**Key
    =>구별할수 있는(Unique) Attribute 또는 Attribute의 집합
1. Super Key
    => Attribute 갯수에 상관없이 구별이 가능한 속성, 또는 속성의 집합(ex - 학번, 학번 +이름 등..)
2. Candidate(후보) Key
    => 속성의 갯수가 최소인 SuperKey(ex - 학번)
3. Primary Key(기본키, 주키)
    => 개발자가 선택한 후보키 : 1개만 생성
    => 테이블에서 데이터를 구별할 수 있는 유일한 키
4. Alterate Key(대체키)
    => 기본키가 아닌 후보키
5. Foreign Key(외래키, 참조키)
    => 다른 테이블에서 기본키(Unique)인 속성

**용어 정리

  - Domain - 자료형 + 제한
    => 속성이 가질수 있는 값의 집합
  - Cardinality : 행의 갯수(성능에 관여)
  - Degree : 열의 갯수(데이터 파악에 관여)

**오라클 설치(중요하지 않음 - 오라클 구매시 설치해줌)
    => 오라클 다운로드 : www.oracle.com - 회원가입을 해야만 다운로드 가능
1. 종류
  - 개발 순서 : 11g, 12c, 18c, 19c
  - 규모 : eXpress Edition, Standard Edition, Enterprise Edition
            (PC에 설치해서 공부시 eXpressEdition이 적당, DBA 공부시에는 Enterprise Edition 설치)
2. Oracle 11g xe 버전 설치

3. Oracle은 특별한 경우를 제외하고, Unix나 Linux에 설치하여 사용
    => 설치 확인 및 시작 옵션 변경
        - [제어판] - [관리도구] - [서비스]

**오라클 접속
1. 접속에 필요한 정보
    => 오라클 접속 컴퓨터 정보 - localhost:1521(오라클 기본 포트)
    => 데이터베이스 이름이나 서비스 이름 - 이름(sid)이 xe
    => 사용자 계정 - sys(슈퍼관리자), sysdba, system(관리자) 계정이 제공
    => 비밀번호 - 설치할때 입력한 비밀번호

2. 접속 프로그램
  1) sqlplus : 오라클 설치시 자동으로 설치 - 관리자 프로그램
  2) instant client : 오라클에서 만든 콘솔 기반의 접속 프로그램
  3) sql developer : 오라클에서 만든 GUI 기반의 접속 프로그램 - 자바로 만들어짐
  4) toad : 금융권에서 많이 사용하는 접속 프로그램
  5) dbeaver : 하나의 프로그램으로 여러종류의 데이터 베이스에 접속 가능 - 자바로 만들어짐
    => 자바로 데이터 베이스를 접속하기 위한 드라이버가 필요

3. 데이터베이스 사용시 필요한 것
  1) DB Server
    => 데이터베이스 위치 - IP와 PORT
    => 데이터베이스 이름 - SID나 Service Name
    => 계정
    => 비밀번호
  2) DB Client Program
    => DB Server를 설치하면 기본적으로 제공, 미설치된 곳에서는 직접 설치하여 DB Server에 접속해야 함

4. Sample Database 설치
  1) system으로 접속
    => 유저를 생성
  2) scott 계정으로 접속

**SQL 개요
    => Structured Query Language : 구조적 질의 언어
    => 관계형 데이터 베이스 작업을 위한 언어
1. 분류
  1) DDL(Data Definition Language - DBA의 언어)
    => 구조를 제작, 변경, 삭제하는 언어
    => Create : 구조 생성 / Alter : 구조 변경 / Drop : 구조 삭제
    => Truncate : 테이블 삭제 / Rename : 테이블 이름 변경
  2) DML(Data Maniplate Language - 개발자의 언어)
    => 데이터를 삽입, 갱신, 삭제하는 언어
    => Insert : 데이터 삽입 / Update : 데이터 갱신 / Delete : 데이터 삭제
  3) DQL(Data Query Language - 개발자의 언어)
    => 데이터를 조회하는 언어
    => DB이론에서는 DQL을 DML로 간주
    => Select : 데이터 조회
  4) TCL(Transaction Control Language - 개발자의 언어)
    => 트랜잭션을 제어하는 언어
    => DB 이론에서는 TCL을 DCL로 간주
    => Commit : 작업 완료 / Rollback : 작업 철회 / SavePoint : 저장점
  5) DCL(Data Control language - DBA의 언어)
    => 보안, 무결성, 회복, 병행제어등에 관련된 언어
    => Grant : 권한 부여 / Revoke : 권한 회수
  6) 개발자에게 중요한 순서
    => DQL -> DML -> TCL -> DDL -> DCL 
    => DCL은 개발자가 사용할 가능성이 거의 없음 
    => 중견이상에서는 DDL도 사용 가능성 X / 중소, 스타트업등 DBA를 별도로 두지 않는 경우 개발자가 DDL도 수행

2. 데이터베이스 개체
  1) Table : 실제 데이터가 저장되는 개체
  2) Sequence : 일련번호
    => auto_increment
  3) View : 자주사용하는 Select 구문을 미리 만들어 놓은 것
  4) Index : 데이터를 빠르게 찾을 수 있도록 해주는 개체
  5) Synonym : 별명(종속을 제거할 수 있음 - 위치 독립성)

  6) Stored Procudure : 자주 사용하는 SQL구문을 하나의 이름으로 묶어 둔 것
  7) Function : 자주 사용하는 코드를 하나의 이름으로 묶어 둔 것
    => SQL에서는 반드시 리턴 값이 있어야 함
  8) Trigger : DML 문장을 수행하기 전이나 수행 후에 자동으로 동작하는 개체

3. SQL 규칙
    => SQL에서는 예약어와 테이블이름 그리고 열 이름은 대소문자 구분 X
        (오라클은 테이블, 열이름에 대문자를 사용, MySQL은 소문자를 사용)
    => 문장의 끝은 ';'인데 데이터 베이스 접속 프로그램에서는 블럭을 잡고 실행하기 때문에 생략 가능
        (java에서 SQL을 입력시에는 ';'을 붙이면 안됨) 

**SELECT : 데이터 조회
1. 기본 형식(*실행 순서 기억)
  5 - SELECT 조회할 표현식 나열(열을 분리)
  1 - FROM 테이블 이름 나열
  2 - WHERE 조건 나열(행을 분리)
  3 - GROUP BY 그룹화할 표현식 나열
  4 - HAVING 그룹화 한 이후의 조건 나열
  6 - ORDER BY 정렬할 표현식 나열

    => FROM과 SELECT는 필수(나머지는 선택)

2. 테이블 구조 파악
    => DESC 테이블명;
        (DBeaver에서는 안됨 - 표로 보여줌)

3. 테이블의 전체 데이터 조회
    => SELECT *
         FROM 테이블 이름;
        ex) emp, dept, salgrade 테이블의 전체 데이터 조회
             SELECT *
             FROM EMP;

4. 테이블에서 특정 열 조회
    => SELECT 열이름 나열
    => FROM 테이블 이름 나열;
        ex) EMP 테이블에서 EMPNO와 ENAME을 조회
        SELECT EMPNO, ENAME
        FROM EMP;

5. 숫자로 된 열에 산술 연산자를 이용하여 산술 연산한 결과 조회
    => 산술 연산자 : +, -, *, / 사용가능
    => 날짜 데이터는 하루를 1로 계산해서 연산이 가능
    => NULL데이터와 연산을 하게되면 결과는 NULL
    => NVL(컬럼이나 연산식, 값이 NULL인 경우 적용할 값)이용시, NULL인 데이터를 기본값으로 변경하여 연산 가능
        (적용할 값은 컬럼의 자료형과 일치하는 데이터)
        ex1) EMP 테이블에서 ENAME과 SAL에 12를 곱한 결과를 조회
            - SELECT ENAME, SAL * 12 FROM EMP;
        ex2) EMP 테이블에서 ENAME과 SAL * 12 + COMM 결과를 조회
            - SELECT ENAME, SAL * 12 + COMM FROM EMP;
        ex3) EMP 테이블에서 ENAME SAL * 12 + COMM 결과를 조회(COMM이 NULL이면 0으로 계산)
            - SELECT ENAME, SAL * 12 + NVL(COMM,0) FROM EMP;

6. 열 이름에 ALIAS 설정
    => 열 이름에 별명을 부여하는 것
    => 열 이름 다음에 빈칸을 두고 별명을 기재(중간에 AS를 삽입해도 됨)
    => 별명에 공백이나 영문 대문자가 있으면 " "로 감싸야 함
    => SELECT 절에 작성하기 때문에 이 별명은 ORDER BY에서만 사용 가능
    => 연산식이나 함수의 결과를 조회 할 때 많이 사용
        ex) SAL * 12 + COMM을 연봉이라는 열 이름으로 조회
            - SELECT ENAME, SAL * 12 + NVL(COMM, 0) 연봉 FROM EMP; 
            - SELECT ENAME, SAL * 12 + NVL(COMM, 0) AS 연봉 FROM EMP;

7. 열 결합 연산자 - ||
    => 2개 이상의 열이나 표현식을 하나의 열로 묶어서 조회할 때 사용하는 연산자
    => 오라클 만을 이용해서 보고서를 만들 때 주로 이용
        ex) EMP테이블에서 ENAME의 업무는 JOB입니다. 로 조회하기
            SELECT ENAME || '의 업무는 ' || JOB || '입니다.' FROM EMP;
    => 개발자들은 2개의 컬럼 출력시, 직접 결합하는 형태를 많이 사용하기에 이 연산자를 거의 사용하지 않음

8. 중복 제거
    => SELECT 절에서 맨 앞에 DISTINCT 추가시 중복을 제거하고 조회
    => DISTINCT 뒤에 2개 이상의 열 이름이 오면 모든 열의 값이 일치하는 경우 제거
        (하나라도 중복되지 않은 값이 있으면 조회가 됨)
        ex1) EMP 테이블에서 JOB열의 중복을 제거하고 조회
            - 중복 미제거 : SELECT JOB FROM EMP;
            - 중복 제거 : SELECT DISTINCT JOB FROM EMP;
        ex2) EMP 테이블에서 JOB과 DEPTNO 모두 같은 데이터의 중복을 제거하고 조회
            - SELECT DISTINCT JOB, DEPTNO FROM EMP;
    => DISTINCT는 맨 앞에 1번만 나와야 하고, 뒤에 나오는 모든 열에 영향을 미침

**프로그래밍이 수행되는 과정
 데이터 수집 -> 데이터 가공 -> 처리 -> 결과 출력 -> 결과를 저장

**WHERE
    => SELECT 구문에서 행단위로 분리하기 위한 절
    => FROM 다음에 위치해야 하고 생략 가능

1. 연산자
연산자의 의미 - = : 같다, > : 보다 크다, >= : 보다 크거나 같다, < : 보다 작다, <= : 보다 작거나 같다,

                     <>, !=, ^= : 같지 않다
                     NOT  Column_name = : 같지 않다
                     NOT  Column_name > : 보다 크지 않다

ex1) EMP 테이블에서 SAL이 3000이상인 사원의 EMPNO, ENAME, SAL을 조회
      SELECT EMPNO, ENAME, SAL
      FROM EMP
      WHERE SAL >= 3000

2. 날짜
    => 날짜도 숫자 데이터처럼 크기 비교가 가능
    => 날짜 및 시간 표현 : to_date('날짜문자열', '날짜서식')
    => yyyy : 년도 4자리, mm : 월 2자리, dd : 일 2자리, hh : 시간 2자리, hh24 : 24시간제, mi : 분, ss : 초
    => 날짜끼리 산술 연산이 가능하고 숫자 데이터와 산술연산이 가능(하루를 1로 계산)
    ex) EMP 테이블에서 1982/01/01 이후에 입사한 사원의 ENAME, SAL 데이터를 조회
        SELECT  ENAME, SAL, HIREDATE 
        FROM  EMP
        WHERE  HIREDATE >= TO_DATE('1982/01/01', 'YYYY/MM/DD'); 

    ex2) EMP 테이블에서 1982년에 입사한 사원의 ENAME, SAL, HIREDATE 데이터를 조회
        SELECT ENAME, SAL, HIREDATE 
        FROM  EMP
        WHERE  HIREDATE >= TO_DATE('1982/01/01', 'YYYY/MM/DD') AND
                    HIREDATE <= TO_DATE('1982/12/31', 'YYYY/MM/DD'); 

3. BETWEEN AND
    => between A and B : A와 B사이 - A와 B를 포함
    => B가 A보다 크거나 같아야 함

4. IN
    => in(값을 나열) : 나열된 값 중에 포함된 데이터를 조회
    ex) EMP테이블에서 JOB이 MANAGER 또는 ANALYST인 사원의 모든 정보를 조회

**Java 문제
1. 하나의 문자열을 입력 받아서 이 문자열이 펠린드롬인지 확인하는 문제
   (펠린드롬 : 앞에서 읽으나 뒤에서 읽으나 동일한 문자열을 의미 ex - 101, 1001(O), 11001(X))
    hint. lengrh() : 문자열 길이, charAt(int idx) : idx 번째 문자를 char로 리턴

2. 배열이나 리스트를 이용해서 0-1023사이의 정수를 입력했을 때 숫자를 이진수로 변환하여 출력하기(무조건 10자리)
    ex) 7 : 0000000111, 21 : 0000010101, 1023 : 1111111111