[210527목] 오라클 자체조인 복습, 자바와 오라클 연동하기
오라클 역시 영어독해와 같이 문제? 질문을 끊어서 파악하면 풀기 쉽다.
관계형 데이터의 무결성 유지를 위해 정규화(쪼개고), 원하는 데이터를 가져오기 위해 조인을 한다.
다이어그램(ER 다이어그램): 테이블의 관계를 알려주는 표
테이블에 대한 전체적인 INSIGHT를 알고 있어야 한다. 왜냐하면 FK의 이름이 테이블을 만든 사람에 따라 달라질 수 있기때문에 동일한 데이터를 의미하더라도 FK명이 달라, FK로 인식하기 어려운 경우도 있기 때문이다.
테이블 employees에서는 PK는 EMPLOYEE_ID이고, FK로 JOB_ID, MANAGER_ID, DEPARTMENT_ID가 있다.
[연습문제 풀이]
1번) 업무의 종류가 CLERK인 사람들중에서 근속년수가 12년인 직원들에게 상여금 10%를 지급하는 쿼리문을 작성하세요. (이름, 입사일, 근속년수, 부서명, 업무명, 급여, 특별상여)
오라클에서 substring을 사용하고자 한다면, 자바와 다르게 인덱스가 1부터 시작한다는 사실을 알아야 한다.
select substr(sysdate, 1, 2) from dual;
substr(sysdate, 1, 2) - substr(e.hire_date, 1, 2)
sysdate, hire_date 모두 날짜 테이터이므로 굳이 to_char로 변환할 필요가 없다.
select e.first_name 이름, e.hire_date 입사일, substr(sysdate, 1,2)- substr(e.hire_date,1,2) 근속년수, d.department_name 부서명, j.job_title 직책, e.salary 급여, e.salary*0.1 특별상여
from employees e, departments d, jobs j
where
e.job_id like '%CLERK%' and
e.job_id = j.job_id and
e.department_id = d.department_id and
substr(sysdate,1,2)-substr(e.hire_date,1,2) >= 12;
3번) 사원번호, 근무기간, 업무명을 조회 예) Smith는 5년 근무한 IT_PROG이다.
★조인하고자 하는 테이블에 FK가 없어 관계가 없다고 하면 그 두 테이블의 관계를 연결해주는 다른 테이블의 PK, FK를 이용해 연결한다.
몇 년 근무했는지 궁금하다면, 몇 일을 근무했는지부터 (마지막날- 첫날)로 구해준다.
근속년수 추출하기
: (js.end_date -js.start_date)/365
: 마지막 근무날짜에서 시작날짜를 빼면 근무한 일수가 나오고 그 값을 365일로 나눠주면 몇 일 근무했는지 알 수 있다.
년을 제외한 일수를 버리기 위해 FLOOR함수 혹은 TRUNC 함수를 사용해준다.
FLOOR -1.5는 -2가 되버림. 왼쪽 방향으로 가장 가까운 정수를 찾는 함수
소수점 이하의 자리를 구하기 위해 5.5-5=0.5를 구할 수 있듯이
((JS.END_DATE - js.start_date)/365 - TRUNC((JS.END_DATE -js.start_date)/365)) 해서 소수점 이하 한 자리수를 구한다.
소수점 이하는 개월 수를 의미한다. (년은 10진법, 개월은 12진법이기 때문에 정확하지 않다.)
지워져서 다시 해서 넣기
select e.first_name ||'은 '|| trunc((js.end_date- js.start_date)/365)||'년 '||
trunc(((js.end_date- js.start_date)/365 -trunc((js.end_date- js.start_date)/365))*10) || '개월 근무한 '
||js.job_id||'이다.'
from
employees e, job_history js, departments d
where
e.employee_id = js.employee_id
and
js.department_id = d.department_id;
[자체조인 복습]
▶자체조인
: 물리적으로 하나의 테이블 안에 PK, FK를 다 같이 가지고 있는 형태, 하나의 테이블 안에서 조인이 일어나는 형국이다.
컬럼명을 줄 때는 "스페이스 공백이 있는 경우", '데이터가 있는 경우'에는 ' '를 사용한다. ' '는 데이터로 인식하기 때문이다.
EMPLOYEES E1(EMPLOYEE_ID), EMPLOYEES E2(MANAGER_ID)
SELECT
E1.FIRST_NAME 직원명, E2.FIRST_NAME 매니저명
FROM
EMPLOYEES E1, EMPLOYEES E2
WHERE
E1.MANAGER_ID = E2.EMPLOYEE_ID
ORDER BY e1.employee_id;
[데이터 모델링]
▶개념적 모델링
: 어떤 컬럼이 필요한지, 데이터를 수집하는 작업(서술하듯이 이름, 나이, 생년월일 등등)
▶논리적 모델링(정규화→ JOIN → 역정규화)
: 컬럼명을 설정하고 데이터 타입을 선택(팀원들이 이해하기 쉽도록)
: 정규화로 인해 조인이 너무 많아 성능이 낮아진다면 다시 역정규화한다.
: (정규화→ JOIN → 역정규화)이 잘 이루어져있어야 물리적 모델링 시 작업이 편하다.
: Ex) name 문자열(20)
▶물리적 모델링
: 어떤 DBMS를 사용할지 결정해야 물리적 모델링을 시작할 수 있다.
: Ex) name varchar(100)
위의 작업이 끝나면 Application(프로그램)과 DB와 연결한다.
[자바 연동]
자바, 파이썬 각각 연결하는 방법이 다르다.
자바와 연결할 경우에는 JDBC(Java DataBase Connectivity), Framewoerk(다른 API, Mybatis)를 사용한다.
허용이 필요한데 연결할 수 있는 파일(ojdbc6.jar)을 제공해주면 가져다 쓴다.
자바는 OOP객체지향 언어, 오라클은 관계형, 연동이 어렵고, 딱 맞아떨어지기 어려운 경우가 있다.
오라클에서 만들어지 데이터가 자바로 건너오고 사용자에게 보여지기 위해 UI로 넘어와 보여진다.
UI에서 데이터를 처리하기 어렵기 때문에 각각의 컬럼명 NAME, AGE, JUMIN, MAJOR를 각각의 VO로 만들어주는 것이 좋다. UI는 사용자들에게 친숙한 HTML(웹)이 될 수도 있고, console이 될 수도 있다.
JDBC(Java DataBase Connectivity): 자바코드 내에 쿼리문이 문자열로 포함 → 유지보수를 어렵게 한다.
★[라이브러리(API)와 프레임워크의 차이는?]★
응용 프로그램의 흐름 주도권을 누가 가지고 있는지 즉, 누가 누구를 컨트롤하는가
▶라이브러리: 내가 코드를 컨트롤한다. 내가 라이브러리를 부른다. 가져와서 어떻게 연결할지 내가 결정하기 때문에 개발자의 역량이 중요하다.
▶프레임워크: 누군가의 규칙을 따라 코딩한다. 프레임워크가 나를 부른다. 개발 시에는 프레임워크를 사용하는 것이 좋다. 5년차 개발자와 1년차 개발자의 역량차이를 줄여줄 정도이다.
[mybatis 참고 사이트]
The MyBatis Blog
A blog about the the MyBatis data mapper framework.
blog.mybatis.org
ojdbc6_g 파일 주소
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
hr 계정이 없을 때 localhost는 내 컴퓨터에 설치되어 있는 도메인이다. 포트 1521, SDI
[파일 찾기]
oraclexe → app → oracle → product → 11.2.0 → server → jdbc → lib
이클립스에서 그동안 공부했던 파일들 안보이게 해주고,,
Delete project contents on disk (cannot be undone) 표시하지 않기, 표시하면 파일이 날라가 지워진다.
다음과 같이 날짜_Mybatis 자바 프로젝트를 생성 후 import를 통해 파일 가져오기!
워크스페이스에 존재하는 존재하는 프로젝트를 클릭해준다.
mybatis-3.2.8.jar
ojdbc6.jar
와 같은 파일 2개가 있어야 한다.
jar 파일을 현재 프로젝트에 붙이는 방법
1) lib 폴더에 직접 복붙(x)
2) 제일 처음 자바를 설치할 때! JAVA_HOME 설정한 폴더의 jre 폴더내에 ext 폴더에 붙이는 방법
(반드시 path 설정이 되어 있어야 함!)
3) build path를 이용하는 방법 (경로가 바뀌면 오류가 나므로 한번 경로가 지정되고 나면 그 경로를 수정하지 말 것)