오라클 서버 구동


- 이 두가지가 실행중이어야 클라이언트에서 접근 가능함

오라클 쓰는법
1. 콘솔로 접속
2. SQL Developer 툴 사용

SELECT SQL문

- 가장 복잡하다
- 조건절이 여러개 올수도 있고, 특정 개수만큼 출력해야할수도있고, 조인할 수도 있다

오늘 실습
- Where 조건절을 써서 특정 데이터만 검색
- Where 조건과 비교연산자
- Where 조건절이 두개 이상이면 or 이나 and같은 논리연산을 쓰게됨 (기호대신 문자형태로 or, and 를 씀)
- LIKE 연산자로 특정 단어를 포함하는 것 검색
- 게시판에서 검색을할떄 LIKE 연산자나 와일드카드 사용
- ORDER BY 로 정렬

 

실습 준비
- SQL 워크시트 클릭해서 scott 계정으로 Connection 연결하자

where 조건절

ex) Where sal > 3000
- 이런식으로 비교연산자를 써서 조건절 쓴다

오라클의 비교연산자 기호

- = : 같다
- <>, !=, ^= : 다르다
- 이건 자바와 다르므로 알기

- 비교 연산자 ( =, >, >=, <, <=, !=, ^=, <>)
- 나머지는 거의 자바와 같다

 

where 조건절에 들어가는 컬럼 타입에 따른 사용법
1. where 조건절에 들어가는 컬럼 타입이 숫자인 경우

2. where 조건절에 들어가는 컬럼 타입이 문자인 경우

3. where 조건절에 들어가는 컬럼 타입이 날짜인 경우


1. where 조건절에 들어가는 컬럼 타입이 숫자인 경우

1)

-- 1. 숫자 데이터 검색
-- Q1. 사원 테이블에서 급여를 3000 이상 받는 사원을 검색하는 SQL문 작성?
select * from emp where sal >= 3000;

- 숫자데이터는 숫자와 비교할때 숫자데이터 3000 좌우에 외따옴표나 쌍따옴표를 하지 않는다

 

2)

-- Q2. 급여가 3000인 사원을 검색하는 SQL문 작성?
select * from emp where sal = 3000;

- = 하나만 쓰기 주의 == 두개 아님!

3)

-- Q3. 급여가 3000이 아닌 사원을 검색하는 SQL문 작성?
select * from emp where sal <> 3000;
select * from emp where sal != 3000;
select * from emp where sal ^= 3000;

 

4)

-- Q4. 급여가 1500 이하인 사원의 사원번호, 사원명, 급여를 출력하는 SQL문 작성?
select empno, ename, sal from emp where sal <= 1500;

2. where 조건절에 들어가는 컬럼 타입이 문자인 경우
- 이제 문자데이터 검색
문자데이터 검색시 주의 사항 2가지
1. 문자데이터는 대, 소문자를 구분한다.
- 오라클에서 유일하게 대소문자 구분하는 것이 테이블에 저장된 문자데이터
ex) EMP 테이블의 ENAME 컬럼안의 데이터 'SMITH', 'ALLEN', 'WARD' 나 JOB 컬럼 안의 데이터 'CLERK', 'SALESMAN', 'MANAGER' 등은 대소문자를 구분함
ex) DEPT 테이블의 DNAME 컬럼안의 데이터 'ACCOUNTING', 'RESEARCH' 등은 대소문자를 구분함
2. 문자 데이터를 검색 할 때는 문자열 좌,우에 외따옴표(')를 붙여야 한다.

+ SQL Developer 단축키
- Ctrl + Shift + D : 한줄 아래로 복사

 

1)

-- Q1. 사원테이블에서 사원명이 FORD 인 사원의 정보를 검색하는 SQL문 작성
select * from emp where ename = 'ford'; -- 검색결과 없음
select * from emp where ename = FORD; -- 오류 발생
select * from emp where ename = "FORD"; -- 오류 발생
select * from emp where ename = 'FORD'; -- 정상적인 검색

 

- 문자 양옆에 외따옴표 없으면 오류 발생, 대소문자 구분하므로 제대로 쓰기

- 오라클에서 문자데이터만 대소문자 구분한다
- 나머지는 대소문자 구분안함, 변수명이나 함수명도 대소문자 구분안함 ex) sysdate 는 SYSDATE 와 같다

 

2)

-- Q2. SCOTT 이란 사원의 사원번호, 사원명, 급여를 출력하는 SQL 문 작성? 
select empno, ename, sal from emp where ename = 'SCOTT';


2. where 조건절에 들어가는 컬럼 타입이 날짜인 경우
- 이제 날짜 데이터 검색하자
- EMP 테이블의 HIREDATE 컬럼이 DATE 타입이다
- 날짜데이터도 좌우에 외따옴표로 감싸줘야함!


날짜데이터 검색시 주의사항
1. 날짜 데이터를 검색할때, 날짜 좌,우에 외따옴표(')를 붙여야 한다.
2. 날짜 데이터를 비교할때 비교 연산자를 사용한다.

 

1)

-- Q1. 1982년 1월 1일 이후에 입사한 사원을 검색하는 SQL문 작성?
select * from emp where hiredate >= 82/1/1; -- 오류 발생
select * from emp where hiredate >= '82/1/1'; -- 정상적인 검색
select * from emp where hiredate >= '1982/1/1'; -- 정상적인 검색

- 이때 이 결과를 입사일을 기준으로 오름차순 정렬해보자

 

2)

-- Q2. 1982년 1월 1일 이후에 입사한 사원을 검색하고, 입사일을 기준으로
--     오름차순 정렬하는 SQL문 작성?
select * from emp where hiredate >= '82/1/1' 
    order by hiredate asc ; -- 정상적인 검색

- 입사일 오름차순 = 입사일이 작은 순서 부터 = 입사일이 빠른 순서부터 = 먼저 입사한 순


오라클의 논리연산자
- 조건식이 2개 이상왔을때, 조건식과 조건식 사이에 논리연산자를 써야함 ex) and , or
+ 자바는 && 와 ||

오라클의 논리연산자 3가지
1. and 연산자 : 두 조건식을 모두 만족하는 데이터를 검색
2. or 연산자 : 두 조건식 중에서 한가지만 만족해도 검색
3. not 연산자 : 논리값을 반대로 바꿔주는 역할
ex) 

SELECT * FROM emp WHERE NOT deptno = 10; -- 10이 아닌것만 출력

 

+ 자바와 차이점 : 자바는 기호 && || ! 을 사용, 오라클은 문자형태로 AND OR NOT 을 사용

 

AND 연산자 예제

-- 1. and 연산자 : 두 조건식을 모두 만족하는 데이터를 검색
-- Q1. 사원테이블에서 부서번호가 10번이고, job이 MANAGER 인 사원을 검색하는
--     SQL문 작성?
select * from emp where deptno = 10 and job = 'MANAGER';


OR 연산자 예제

-- 2. or 연산자 : 두 조건식 중에서 한가지만 만족해도 검색
-- Q1. 사원테이블에서 부서번호가 10번이거나, job이 MANAGER 인 사원을 검색하는
--     SQL문 작성?
select * from emp where deptno = 10 or job = 'MANAGER';


NOT 연산자

-- 3. not 연산자 : 논리값을 반대로 바꿔주는 역할
-- Q1. 부서번호가 10이 아닌 사원을 검색하는 SQL문 작성?
select * from emp where not deptno = 10; -- 논리 연산자
select * from emp where deptno <> 10; -- 비교 연산자
select * from emp where deptno ^= 10; -- 비교 연산자
select * from emp where deptno != 10; -- 비교 연산자

 

- 즉, 기존의 반대의 결과 deptno = 10의 반대의 결과를 검색함
- 부서번호가 10 이 아닌 사원을 검색하는 방법이 여러가지 있다
- 논리 연산자로 구할수도 있고 비교 연산자로 구하는것도 가능함




연산자 응용 문제 1

-- Q1. 급여를 2000 에서 3000 사이의 급여를 받는 사원을 검색하는 SQL문 작성?
select * from emp where sal >= 2000 and sal <= 3000;

- 위처럼 일정한 값의 범위가 있을때, and 연산을 사용해서 연결해도 되고 beetween and 연산자를 사용해도 된다
A<=X<=B 에서 X를 구할때 문제 해결 방법 2가지

1. 컬럼명 BETWEEN A AND B 식으로 쓴다
2. A>= X AND B<=X


AND 연산자로 연결되는 것을 BETWEEN AND 연산자로 바꾸기
between and 연산자
- 형식 : where 컬럼명 between 작은값 and 큰값
- 일정한 값의 범위가 있을때 사용가능하다!
- 작은값이 먼저와야함

between and 연산자 문제 1

-- 형식 : where 컬럼명 between 작은값 and 큰값
-- Q1. 급여를 2000 에서 3000 사이의 급여를 받는 사원을 검색하는 SQL문 작성?
select * from emp where sal >= 2000 and sal <= 3000;

select * from emp where sal between 2000 and 3000;
select * from emp where sal between 3000 and 2000; -- 검색결과 없음

 

between and 연산자 문제 2

-- Q2. 급여가 2000 미만이거나 3000 초과인 사원을 검색하는 SQL문 작성?
select * from emp where sal < 2000 or sal > 3000;

select * from emp where sal not between 2000 and 3000; //강사님이 쓴거 
select * from emp where not sal between 2000 and 3000; //내가 쓴거

 

- select * from emp where sal between 2000 and 3000; 의 반대를 구하는 것이므로 not 써야한다

- 이때 not 은 where 뒤에 써도 되고, 컬럼 뒤에 써도 된다


between and 연산자 문제 3

-- Q3. 1987년도에 입사한 사원을 검색하는 SQL문 작성?
select * from emp where hiredate >= '87/1/1' and hiredate <= '87/12/31';

select * from emp where hiredate between '87/1/1' and '87/12/31';


- and 연산자로 연결되는 것을 between and 로 바꾸었다
- 후엔 or연산자로 연결되는걸 in 연산자로 바꿀 것

 



연산자 응용 문제 2

-- Q2. 커미션이 300이거나 500이거나 1400인 사원을 검색하는 SQL문 작성?
select * from emp where comm = 300 or comm = 500 or comm = 1400;


OR 연산자로 연결되는 것을 IN 연산자로 바꾸기

IN 연산자
- 커미션이 300이거나 500이거나 1400인 사원을 검색하는 SQL문 검색할때 or 연산자를 사용하고 있다

IN 연산자 형식

- 형식 : where 컬럼명 in (데이터1, 데이터2, ..)
- 괄호 안 값들 순서는 상관없음

IN 연산자 문제 1

-- Q1. 커미션이 300이거나 500이거나 1400인 사원을 검색하는 SQL문 작성?
select * from emp where comm = 300 or comm = 500 or comm = 1400;

select * from emp where comm in (300, 500, 1400);


IN 연산자 문제 2

-- Q2. 커미션이 300, 500, 1400이 아닌 사원을 검색하는 SQL문 작성?
select * from emp where comm != 300 and comm != 500 and comm != 1400;

select * from emp where comm not in (300, 500, 1400);

- not 을 붙임으로서 반대의 결과를검색함

- 커미션이 300,500,1400 아닌 사원 검색

 

주의

- comm 이 null인 사원들은 검색되지 않는다! 값이 존재하는 사원중 300, 500, 1400 이 아닌 사원만 출력됨
- null 값은 검색안됨, null 제외한 나머지 값들만 검색함
- null 검색법은 따로있다


연산자 응용 문제 3

-- Q3. 사원번호가 7521이거나 7654이거나 7844인 사원을 검색하는 SQL문 작성?
select * from emp where empno = 7521 or empno = 7654 or empno = 7844;


OR 연산자로 연결되는 것을 IN 연산자로 바꾸기
IN 연산자 문제 3

-- Q3. 사원번호가 7521 이거나 7844인 사원을 검색하는 SQL문 작성?
select * from emp where empno = 7521 or empno = 7844;

select * from emp where empno in (7521, 7844);


검색 관련 연산자
- 게시판 목록 페이지 상단이나 하단을 보면 검색기능이 있다

- 이런게 있으면 사용자가 쉽게 검색 가능 
- 작성자명, 제목, 내용, 제목+내용 등으로 검색 가능하다
- 이런걸 LIKE 연산자와 와일드카드( % , _ )를 이용해 구현한다

 

LIKE 연산자와 와일드 카드

- 검색기능을 구현할때 사용함.
- 형식 : where 컬럼명 like pattern


LIKE 연산자
- 형식 : WHERE 검색할컬럼명 LIKE 패턴지정
- 패턴을 만들때 와일드카드를 써야함 %와 _가 있다

와일드 카드

1. '%' : 문자가 없거나, 하나 이상의 문자가 어떤 값이 와도 상관없다 (이걸 주로씀)
2. '_' : 하나의 문자에 어떤 값이 와도 상관없다
- '_' 하나는 딱 한글자, 한칸만을 의미

 

LIKE 연산자와 와일드카드 예시
- 사원명이 저장된 컬럼 ENAME 

- 사원명이 F로 시작하는 사원을 검색하라

SELECT * FROM EMP WHERE ENAME LIKE 'F%';

 

- 문자데이터이므로 외따옴표로 감싸져있고 대소문자 구분
- % 는 문자가 없거나 하나 이상의 문자가 와도 되므로, 'F' 여도 검색되고 'Faith' 여도 검색된다

LIKE 연산자와 와일드카드 예제 1

-- Q1. 사원테이블에서 사원명이 F로 시작하는 사원을 검색하는 SQL문을 작성?
select * from emp where ename = 'FORD'; -- FORD 사원만 검색됨

select * from emp where ename like 'F%';

- %는 문자가 없거나, 하나 이상의 문자 이므로, WHERE ename like 'F%' 는 'F'여도 되고 'FO' 여도 되고 'FORD' 여도 됨
- 문자 데이터이므로 좌우에 외따옴표 붙이기


LIKE 연산자와 와일드카드 예제 2

-- Q2. 사원테이블에서 사원명이 N으로 끝나는 사원을 검색하는 SQL문을 작성?
select * from emp where ename like '%N';

- 문자 길이 달라도 N으로 끝나므로 검색됨

 

LIKE 연산자와 와일드카드 예제 3

-- Q3. 사원테이블에서 사원명이 A를 포함하는 사원을 검색하는 SQL문을 작성?
select * from emp where ename like '%A%';

- A가 시작문자든, 끝문자든, 중간에 있든, A만 있든 다 검색된다.
- where 제목컬럼명 like '%검색어%' 가 가장 많이 쓰는 형식이다 

- 웹에서 제목으로 검색할때 제목의 컬럼명이 where 뒤에 오고 검색어를 포함하는 제목인 글을 찾음
+ 웹에서 내용으로 검색할땐 컬럼명 자리에 내용컬럼이 들어가야함

언더바 (_) 와일드카드를 써야만 하는 경우
- 언더바(_) 와일드 카드 : 하나의 문자에 어떤 값이 와도 상관없다

- 특정한 자리에 해당 문자가 와야할때 주로 사용

 

LIKE 연산자와 와일드카드 예제 4
언더바 (_) 와일드카드 예제 1

-- Q1. 사원 이름의 두번째 글자가 A인 사원을 검색하는 SQL문을 작성?
select * from emp where ename like '_A%';

 

- 언더바 _ 하나가 한글자 한칸을 의미하는것

- 언더바 _ 에 어떤값이 와도 상관없지만 한글자는 와야함

- TA 도 검색됨

- %가 오면 의미가 달라짐


LIKE 연산자와 와일드카드 예제 5
언더바 (_) 와일드카드 예제 2

-- Q2. 사원 이름의 세번째 글자가 A인 사원을 검색하는 SQL문을 작성?
select * from emp where ename like '__A%';

 

- _를 2개 썼다


LIKE 연산자와 와일드카드 예제 6

-- Q3. 사원명에 A가 포함되어 있지 않은 사원을 검색하는 SQL문을 작성?
select * from emp where ename not like '%A%';

 

- A가 포함된 사원을 검색하는 결과에서 not을 써서 A가 포함되지 않은 사원을 검색
- like앞에 not을 써주면 된다


NULL 값 검색
- 값이 비어있는 NULL 값을 가진 데이터는 검색되지 않았다
- 또한 비교연산자로 NULL을 검색할 수 없다

SELECT * FROM EMP WHERE COMM = NULL; -- (X) 검색결과 없음


- EMP 테이블에서, PRESIDENT KING의 MGR은 NULL

- EMP 테이블에서, SALESMAN 인 4명만 COMM이 NULL이 아니고 나머지는 다 NULL

 

NULL 값 검색 예제 1

- IS NULL 연산자를 써야한다

-- Q1. MGR 컬럼에 NULL 값인 데이터를 검색
select * from emp where mgr = null; -- 검색 안됨
select * from emp where mgr = ''; -- 검색 안됨

select * from emp where mgr is null;


NULL 값 검색 예제 2

-- Q2. MGR 컬럼에 NULL 값이 아닌 데이터를 검색
select * from emp where mgr is not null;

 

- NULL 값이 아닌 데이터 검색할땐 IS NOT NULL 사용


NULL 값 검색 예제 3

-- Q3. COMM 컬럼에 NULL 값인 데이터를 검색
select * from emp where comm is null;


NULL 값 검색 예제 4

-- Q4. COMM 컬럼에 NULL 값이 아닌 데이터를 검색
select * from emp where comm is not null;


데이터 정렬 : ORDER BY 절
- 데이터를 먼저 검색하고 마지막으로 정렬을 한다!

 

where 조건절과 order by 절 같이 쓸때 주의

- where 조건절로 조건맞는 데이터 먼저 검색 후, 마지막에 order by로 정렬해야함

ORDER BY 절
- ORDER BY 컬럼명 : 해당 컬럼명 기준으로 정렬
- 컬럼명 뒤에 asc, desc 를 붙여 오름차순, 내림차순 설정

오름차순 vs 내림차순

  오름차순 내림차순
숫자 데이터 작은 값부터 정렬 (1,2,3..) 큰 값부터 정렬 (3,2,1..)
문자 데이터 사전 순서로 정렬 (a,b,c..)  사전 반대 순서로 정렬 (z,y,x..)
날짜 데이터 빠른 날짜 순서로 정렬
(작은 연도부터 정렬, 즉 과거부터 정렬)
늦은 날짜 순서로 정렬 
(큰 연도부터 정렬, 즉 최신순 정렬)
NULL 가장 마지막에 NULL 값이 나온다 가장 먼저 NULL 값이 나온다

+ 게시판은 주로 내림차순 정렬이다 최근글부터 나와야하므로

오름차순 정렬
ex)

select * from emp order by sal asc;

- 급여가 작은 순부터 정렬

내림차순 정렬
ex)

select * from emp order by sal desc;

- 급여가 큰 순부터 정렬

 

정렬 정리
- 형식 : order by 컬럼명 정렬방식(asc or desc)
- 정렬방식 : 오름차순(ascending), 내림차순(descending)

숫자 데이터 정렬 예제 1

-- 1. 숫자 데이터 정렬
-- Q1. 사원 테이블에서 급여를 기준으로 오름차순 정렬
select ename, sal from emp order by sal asc;
-- 정렬방식(asc, desc)이 생략되면, 기본 정렬방식 은 오름차순으로 정렬함.
select ename, sal from emp order by sal;

 

- 오름차순 = 작은수부터 = 낮은급여부터 높은급여까지 정렬
- 이때 이 asc는 생략 가능하다, 즉 기본 디폴트 방식이 asc로 되어있으므로 생략 가능


숫자 데이터 정렬 예제 2

-- Q2. 사원 테이블에서 급여를 기준으로 내림차순 정렬
select ename, sal from emp order by sal desc;



문자 데이터 정렬 예제 1

-- 2. 문자 데이터 정렬
-- Q1. 사원테이블에서 사원명을 기준으로 오름차순 정렬 : 사전순 정렬
select ename from emp order by ename asc;
select ename from emp order by ename; -- 정렬방식(asc) 생략가능


문자 데이터 정렬 예제 2

-- Q2. 사원테이블에서 사원명을 기준으로 내림차순 정렬 : 사전역순 정렬
select ename from emp order by ename desc;


문자 데이터 정렬 예제 1

-- 3. 날짜 데이터 정렬
-- Q1. 사원 테이블에서 입사일을 기준으로 오름차순 정렬 : 빠른 날짜 순으로 정렬
select hiredate from emp order by hiredate asc;

 

- 빠른년도 순 = 년도 숫자가 작은거 = 이른날짜 = 옛날 -> 현재 순으로


문자 데이터 정렬 예제 2

-- Q2. 사원 테이블에서 입사일을 기준으로 내림차순 정렬 : 늦은 날짜 순으로 정렬
select hiredate from emp order by hiredate desc;

 

- 늦은 날짜 순이란 = 최신순


NULL 값이 포함된 데이터 정렬
NULL 정렬
1. 오름차순 정렬 시 NULL 값이 가장 마지막에 출력
2. 내림차순 정렬시 NULL 값이 가장 먼저 출력
- 즉 NULL 값이 가장 큰 값이라고 생각하면 된다

 

NULL 값이 포함된 데이터 정렬 예제 1

-- Q1. MGR 컬럼을 기준으로 오름차순 정렬 : NULL 값이 가장 마지막에 출력
select ename, mgr from emp order by mgr asc;

 

- 오름차순 정렬하면 NULL 값이 가장 마지막에 출력된다


NULL 값이 포함된 데이터 정렬 예제 2

-- Q2. MGR 컬럼을 기준으로 내림차순 정렬 : NULL 값이 가장 먼저 출력
select ename, mgr from emp order by mgr desc;


NULL 값이 포함된 데이터 정렬 예제 3

-- Q3. COMM 컬럼을 기준으로 오름차순 정렬 : NULL 값이 가장 마지막에 출력
select ename, comm from emp order by comm asc;


NULL 값이 포함된 데이터 정렬 예제 4

-- Q4. COMM 컬럼을 기준으로 내림차순 정렬 : NULL 값이 가장 먼저 출력
select ename, COMM from emp order by COMM desc;


여러번 정렬하기

1. 한번 정렬했을때, 동일한 결과가 나오는 데이터가 있을 경우에는 한번 더 정렬을 해야한다
2. 두번째 정렬 조건은 한번 정렬했을때 동일한 결과가 나온 데이터들만 두번째 정렬 조건을 적용받는다.
3. 댓글 게시판을 만드는 경우에 주로 사용한다


ex) 급여를 기준으로 내림차순 정렬시, 1번 정렬했을때 같은 결과가 나오는 경우가 있다

- 3000, 1250 이 급여인 사원이 2명씩 있따, 이럴때 한번 더 정렬을 할 수 있다

- "동일한 데이터가 나온 경우에만" 두번째 정렬조건의 적용을 받음!
- 나머지는 두번째 정렬조건의 적용을 안받음

- 그러므로 두번째 정렬을 하면 FORD, SCOTT, WARD, MARTIN 데이터만 적용을 받는다


같은 결과가 나오면 한번 더 정렬하는 경우 활용 : 게시판
- 게시판 글을 내림차순하면 최근글이 위로 가게 된다

- 그 글에 댓글들과 대댓글 달때 한번더 정렬해줘야하는 경우에 주로 사용

- 그 댓글들과 대댓글은 부모 그룹번호 id가 같기때문에 댓글들끼리 그걸 한번더 정렬해줘서 순서를 정해야함
- 즉 첫번째로는 글을 정렬하고 두번째로는 그 글의 댓글과 대댓글들을 정렬 한다

여러번 정렬하기 예시

-- Q. 사원 테이블에서 급여를 기준으로 내림차순 정렬을 한다. 이때 동일한 급여를
--    받는 사원들은 사원명을 기준으로 오름차순 정렬해서 출력하는 SQL문을 작성
select ename, sal from emp order by sal desc, ename asc;

 

- 급여로 1차 정렬을하고 같은 데이터가 있는경우에만!(3000이 2명, 1250이 2명) 2차로 정렬을 해준다
- 이때 , 로 이어서 두번째 정렬을 해줌
- , 뒤에 기준컬럼을 써주고 정렬방법을 써주면됨 

- "동일한 데이터가 나온 경우에만" 두번째 정렬조건의 적용을 받음!
- 나머지는 두번째 정렬조건의 적용을 안받음

- 그러므로 두번째 정렬을 하면 FORD, SCOTT, WARD, MARTIN 데이터만 적용을 받는다


- 여기서 두번의 정렬후에도 정렬이 안되어 동일한 데이터가 또 나오면 또 다른 컬럼으로 3번째 정렬 가능

 

정렬 문제 1 : 한번 정렬, 오름차순 정렬

-- 정렬 문제
-- Q1. 사원 테이블에서 입사일을 기준으로 오름차순으로 정렬하여 출력하되,
--    사원번호, 사원명, 직급, 입사일 컬럼을 출력하는 SQL문을 작성
select empno, ename, job, hiredate from emp order by hiredate asc;

 

정렬 문제 2 : 한번 정렬, 내림차순 정렬

-- Q2. 사원 테이블에서 사원번호를 기준으로 내림차순으로 정렬하여 사원번호와
--    사원명 컬럼을 출력하는 SQL문 작성
select empno, ename from emp order by empno desc;

 


정렬 문제 3 : 여러번 정렬

-- Q3. 부서번호가 빠른 사원부터 출력하되, 동일한 부서내의 사원을 출력할 경우에는
--    최근에 입사한 사원부터 사원번호, 입사일, 사원명, 급여순으로 출력하는
--    SQL문을 작성
select empno, hiredate, ename, sal from emp order by deptno asc, hiredate desc;


과제
Q1. 사원테이블(EMP)에서 입사일(HIREDATE)을 4자리 연도로 출력되도록 SQL문을 작성하세요? (ex. 1980/01/01)

- 입사일이 80/12/17 로 저장되어있는데 이걸 1980/12/17 로 출력해야함

-- 과제1. 사원테이블(EMP)에서 입사일(HIREDATE)을 4자리 연도로 출력 되도록 SQL문을 작성하세요? (ex. 1980/01/01)
select empno, ename, job, mgr, TO_CHAR(hiredate,'YYYY/MM/DD'), sal, comm, deptno from emp;


Q2. 사원테이블(EMP)에서 MGR컬럼의 값이 null 인 데이터의 MGR의 값을 CEO 로 출력하는 SQL문을 작성 하세요?

-- 과제2. 사원테이블(EMP)에서 MGR컬럼의  값이  null 인 데이터의 MGR의 값을  CEO 로  출력하는 SQL문을 작성 하세요?
select empno, ename, job, nvl(TO_CHAR(mgr), 'CEO') as "MANAGER", sal, comm, deptno from emp;

-  MGR 컬럼이 NULL 일때 이걸 CEO로 바꿔서 출력
- nvl 함수 , null 값을 검색하는 조건식도 쓰기

- 배운것만으로 해결 불가 나중에 찾아보면서 과제 하기

 

과제 풀이

https://laker99.tistory.com/50

https://laker99.tistory.com/51


+ 최대공약수
- 24를 1씩 감소시키면서 60과 24 둘다 나눠떨어질때 그게 최대공약수
- 무한루프 돌려서 그 i로 60과 24 나눠서 둘다 0 나머지면 최대공약수, i 를 1씩 감소시키기

윗부분 나중에


오라클 수업 2주간 할 것들
1. Oracle SQL문 
2, SQL로 프로그램 만드는 PL/SQL 의 저장프로시저 라는걸배울것(실무에서 많이 씀) , Trigger 
3. 데이터 모델링
- 요구사항에 따라 논리적으로 모델링할것

- 직접 테이블 create 해서 안만든다

- 모델링 하는 툴을 가지고 요구사항 분석을 하고 거기에 따라 사용자가 어떤 요구하냐에 따라 요구사항 분석하고 그 결과로 모델링을함
- 논리적 모델링 -> 물리적 모델링 -> 배포 하면 테이블이 자동으로 만들어짐


SQL Developer 툴로 실습
- SQL 실행 위해선 콘솔창 작업 불편
- 그래픽 툴 중에 SQL Developer 이란 툴을 사용할 것
- 오라클은 이미 서버 구동되었기떄문에 클라이언트가 접근가능함
- sys, system, scott, hr 계정으로 접근가능 우리는 scott계정으로 실습할것

 

SQL Developer 다운
- SQL Developer 툴을 다운
- 최신버전은 oracle.com 으로 들어가야함, 또는 네이버 클라우드에 올린것 다운
- C드라이버에 넣고 압축풀면 sqldeveloper 폴더 나옴
- 그 안의 sqldeveloper 프로그램 바탕화면엔 바로가기 만듬 
- Sqldeveloper는 설치하는 프로그램이 아니라 압축만 풀면됨

- SQL Developer 임포트 :아니오
- 먼저 sql developer가 클라이언트용 프로그램이므로 서버로 접속하기위해, 오라클 데이터베이스의 커넥션 만들어야함

 

오라클 DB 커넥션 생성
1. 시스템 관리를 위해 system 계정에 대한 커넥션 생성해야함 (비번 oracle)
2. 실습을 위해 scott 계정에 대한 커넥션 생성해야함 (비번 tiger)

 

1. system 계정에 대한 커넥션 생성

- 좌측의 + 버튼 누르면 새로운 커넥션 생성가능

- 어떤 계정에 대한 커넥션인지 구분하기위해 계정명과 동일하게 만들자
- 접속이름도 system으로 하자
- 호스트 이름은 오라클 DB가 설치된 IP주소, 자기 컴에 오라클 있으면 localhost 로 지정
- SID : 전역 데이터베이스 명 , 여기선 xe
- 이후 접속 테스트 테스트 버튼 눌러서하자
- 성공적이면 좌측하단 성공 이라고 뜬다
- 그다음 접속 누르면 좌측에 system 계정에 대한 커넥션이 생성되어있음

2. scott 계정에 대한 커넥션 생성
- 두번째로는 scott계정에대한 커넥션을 만들자

- 같은 방법으로 scott계정 connection 만들기

- 커넥션 생성시 그 계정 소유의 테이블등도 볼수있다 ex) 우리가 만들었던 Board 테이블

- 해당 계정에 대한 커넥션 생성시 이렇게 테이블 정보 볼수있다

- 오라클은 계정단위로 모든것들이 이루어짐


- 만약 scott계정 설정 수정하고싶으면, 해당 커넥션에 오른마우스 -> 속성 메뉴

 

오라클의 DBA 계정
- sys 와 system계정
- sys계정은 DB 를 설치하거나 복구할때 주로 사용
- 나머지 관리적인것들은 다 system으로 처리
오라클의 실습계정

- scott 와 hr 계정
- scott계정은 이미 활성화되었다, 현재 이 계정으로 접속가능

hr계정 활성화

c:\> sqlplus  system/oracle

SQL> alter user hr account unlock;
SQL> alter user hr identified by 1234;
SQL> conn  hr/1234

- hr 계정도 락이 걸려있어서 언락을 해야함, scott 계정과는 다른 방법으로 언락
- 명령 프롬프트든 SQL Developer든 DBA계정인 system계정들어가서 작업을 해야함

 

SQL Developer에서 생성한 Connection 으로 연결하기 (.sql 파일 생성)

- SQL 워크시트 누르면 어떤 커넥션으로 연결할건지 물어봄 -> scott

- 여기다 -- 2022.07.19(화) 입력해보자, 그리고 폰트를 조절 하자

+ SQL Developer에서 글자 크기 설정 방법
- 도구 - 환경설정 - 코드 편집기 - 글꼴

Connection 연결한 sql 파일 저장하는 방법

- 디스켓모양 클릭
- 위치설정은 C드라이브 하위에 폴더 ;OraclePractice' 를 만들어서 저장했다
- C:\OraclePractice 안에 2022_07_19_01.sql을 만듬!

scott 계정에서 제공되는 테이블
- DEPT, EMP, SALGRADE, BONUS
- DEPT 테이블은 3개의 컬럼, 4개의 로우 있음

DEPT 3개의 컬럼
1. DEPTNO : 부서번호
2. DNAME : 부서이름 no 10번은 'Accounting', 20번은 'Research' 등
3. LOC : 지역

 

오라클 기본 명령어 : 테이블 목록 확인 명령어
- scott 계정으로 커넥션 연결한 2022_07_19_01.sql 파일에서 테이블 목록을 확인해보자

-- 테이블 목록
select * from tab;

 

- scott계정 소유의 테이블 목록을 보여달라는 명령

 

+ 공개 동의어

- 여기서 tab 이란 건 sys.tab 인데 줄여서 쓰는것
- sys는 DB 계정명이고 tab은 공개 동의어 이름이다, 공용 동의어 라고도 함
- 원래소유자.tab; 으로 쓰는걸 짧게 tab으로만 쓰는것임
- 원래 소유자는 sys계정이고 뒤에 나와있는 tab은 sys계정 소유의 테이블 이름인데, 공개되었기때문에 공개 동의어

 

SQL Developer 에서 SQL 명령어 실행시키는 방법

- 실행하는법은 그 줄에 커서 올려놓고 위쪽 초록색 화살표버튼
- 단축키는 해당 줄에 커서 위치시키고 Ctrl + Enter

- 그래픽 화면이 작업하기 수월하지만 기본적인 이런 SQL문은 알고있어야함

+ mysql 에선 show tables; 사용


scott 기본 제공 테이블 

- DEPT, EMP, SALGRADE, BONUS
- DEPT : 부서테이블 , 3개 컬럼과 4개 데이터(로우)로 구성
- EMP : 사원테이블, 8개의 컬럼과 14개의 데이터(로우) 로 구성
- 당분간 이 두개 테이블로 실습할것이라서 이 두 개 테이블에 대해 설명할것

EMP 테이블 구조
EMPNO : 사원번호
ENAME : 사원이름
JOB : 담당 업무,직책
MGR : 자기 직속상관의 사원번호
HIREDATE : 입사일
SAL : 급여
COMM : 커미션
DEPTNO : 부서번호

 

오라클 기본 명령어 : 테이블 구조 (스키마) 확인 명령어

- 테이블 구조를 볼때는 desc 명령 사용

-- DEPT 테이블 구조
describe dept;

 

- 또는

desc dept;

 

- describe 명령 사용시 이렇게 테이블 dept 의 구조가 나타난다, 3개의 컬럼이 있다
- VARCHAR2(14)는 14바이트까지, 영문 14자까지 저장가능
- NUMBER(2) 는 숫자 두자리까지 가능
- DEPTNO에 지금은 NOT NULL만 표시되어있지만, 실제론 기본키로 되어있다
- 즉, 이 부서를 식별하는 번호값이 DEPTNO이다

오라클 기본 명령어 : 테이블안의 데이터 검색 명령어

-- DEPT 데이터 검색
select * from DEPT;
SELECT * FROM DEPT;

+ SQL문은 대소문자 구분없다
- 안에 들은 영문 데이터는 대소문자를 구분함, 이거뺴곤 다 대소문자 구분안한다
- 이 DEPTNO는 Primary 키라는 기본키 제약조건이 설정되어있어서 중복되지 않는다


- 테이블 DEPT 의 구조와 데이터를 확인했다

- 이젠 테이블 EMP 의 구조와 데이터 확인해보기


테이블 EMP 구조 (스키마) 확인

dsec emp;

<제약 조건>

- NOT NULL : 널값 허용불가

<자료형>
- NUMBER(4) : 네자리 숫자 까지 가능
- DATE : 년/월/일 정보만 저장되어있음
- NUMBER(7,2) : 숫자값이 들어있는 자료형인데, 7은 전체 7자리까지 할당받게되고 뒤에 2는 소숫점자리 두자리까지 저장하겠다 라는 것
-> 결과적으로 정수값은 5자리, 소숫점아래는 2자리 까지 저장하겠다는 의미
<컬럼>
- COMM 은 영업사원들에만 해당, 커미션 관련
 - 부서 번호는 10,20,30,40 있지만, 각 사원은 10번, 20번, 30번 부서에 소속되어있음

테이블 EMP 데이터 검색

-- EMP 데이터 검색
select * from emp;

컬럼 설명

- EMPNO : Primary Key, 사원번호 4자리
- ENAME : 사원 이름
- JOB : 직무 명
- MGR :  직속상관의 사원번호 4자리가 저장되어있음
ex) SMITH 사원의 직속상사는 사원번호가 7902 -> 7902 사원은 FORD 이다
- KING이란 사원은 PRESIDENT (사장) 이라서 자기 직속상관이 null이다
- HIRDDATE는 DATE 타입이므로 년/월/일 로 저장되어있음
- SAL은 달 급여, 사장이 가장 높은 급여를 받고 있다
- COMM : 영업활동을 하고 돌려받는 돈 JOB이 SALESMAN으로 된 4명만 커미션비를 받고있음 
- DEPTNO : 10,20,30번 부서에 각각 소속되어있다, 40번부서는 존재하지만 아무도 소속되어있지 않음
- DEPTNO는 Foreign Key 설정되어있다
+ 부모테이블의 부모키 값만 참조할수있는게 Foreign key

- 이 두 테이블로 DEPT, EMP 로 실습할거다

 

SQL Developer 에서 그래픽으로 테이블 구조, 데이터, 제약조건 확인

- 지금까지 처럼 select, desc 명령어로 테이블을 확인하는 대신 그래픽으로 테이블을 확인하는 방법

- 이거 누르면 구조 데이터 제약조건 등 알수있다

- 중복되지 않는 값이며, 부서 식별위한 고유한 번호값 DEPTNO

- EMP 테이블의 제약조건도 보자


- 명령어로 실행하거나, 위의 사진처럼 그래픽 프로그램으로 해당 테이블 선택시 컬럼, 자료형, 데이터, 제약조건 확인가능

SQL Developer 주석

- Ctrl + / 하거나 -- 로 사용

오라클 데이터 타입
1. 숫자 데이터

2. 문자 데이터

3. 날짜 데이터
- 지원자료형이나 크기 등 알아보자

1. 숫자 데이터

- number란 타입은 괄호열고 정수가 들어간다

1) numer(n)
ex) numer(2)이면 정수 2자리까지 저장가능하단 의미 , 최대 99, 정수만 가능
2) number(n1, n2)

- n1은 전체 자리수, n2는 소숫점에 할당된 자리수
ex) number(7,2) 에서첫자리 7은 전체 자리수, 두번째자리 2는 전체 자리수 중에서 소숫점 아래 자리

2. 문자 데이터
- 크게 3가지가 있다
1) char() : 고정길이 문자, 최대 2000바이트까지 저장가능

2) varchar2(), 가변길이 문자

- varchar2는 4000바이트까지 저장할수있음 영문기준 4000자

3) long() : 4000바이트 넘어설땐 long, 2GB까지 저장가능

- 단 long형으로 설정된 컬럼은 검색기능 지원안함

 

고정길이 문자 vs 가변길이 문자

- char에는 값의 길이값이 정해져있는 데이터만 정해두므로 안쓰면 낭비

- varchar2는 가변길이 문자타입이라서 20바이트 지정해도 데이터 양이 5바이트면 5바이트만 사용
- 지정된크기만큼 저장할수있지만 데이터 크기만큼만 씀. 공간 낭비 막아줌 주로 문자 저장할떈 이거 쓴다

 

ex) char(20)

- char(20) 은 1개 컬럼에 20 바이트 할당을 딱 해둠,

- 만약 seoul 을 써서 5바이트를 쓰면 15바이트는 남았지만 남아있다고 해서 남은공간 쓰진 못함, 낭비가 됨.

- 그래서 값의 길이값이 정해져있는 우편번호,카드번호 이런경우에 char 씀
ex) varchar2(20)
- 가변길이 varchar2(20) 인 address컬럼에 저장된 값이 seoul이면 5바이트만 사용되고 나머지 15바이트는 낭비되지 않음
- 주로 문자 저장할땐 대부분 이거 씀

 

long 형 데이터 장단점
- 4000바이트 넘어서는 데이터는 long형 자료형 사용

- long형은 1개의 데이터당 2G 까지 지원 , 엄청나게 큰 데이터
- 단, long형으로 설정된 컬럼은 검색기능 지원안함
ex) char, varchar 사용시 게시판에서 제목이나 작성자명, 내용을 기준으로 검색가능, 근데 만약 long형으로 설정되어있으면 검색기능 지원하지 않음

3. 날짜 데이터

1) date : 년/월/일 정보 저장 ex) 80/12/21

2) timestamp : 년/월/일 시:분:초 정보 저장

- 좀 더 자세한 날짜 정보는 timestamp 형이다

오라클의 데이터 타입 정리
1. 숫자 데이터
- number(n) : number(2) 는 정수 2자리까지 저장
- number(n1, n2) : n1 - 전체 자리수, n2 - 소숫점에 할당된 자리수
2. 문자 데이터
- char() : 고정 길이 문자형, 최대 2000 byte 까지 저장 가능
- varchar2() : 가변 길이 문자형, 최대 4000 byte 까지 저장 가능
- long : 2GB 까지 저장 가능함, long형으로 설정된 컬럼은 검색 기능을 지원하지 않는다.
3. 날짜 데이터
- date : 년/월/일 정보 저장
- timestamp : 년/월/일 시:분:초 정보 저장

 

- 이제 SQL문 살펴보자



SQL문

- DDL , DML, DQL, DCL, TCL 등
- DCL : 권한부여, 권한 주는 Grant, 취소의 Revoke
- TCL : 트랜젝션 처리어
- DQL = SELECT SQL문

 

SELECT SQL 문 (DQL)

- SQL문 중에서 가장 복잡하고 다양하게 활용됨
- 전체 SQL문 중 50% 이상

SELECT 컬럼명들 FROM 테이블

- 여태껏 SELECT * FROM 테이블 에서 * 자리에 검색할 컬럼명을 이 자리에 쓰는것
ex)

select enum from emp;


SELECT SQL문 사용 방법
1.

select * from dept;

 

- * : ALL COLUMNS 의미함

2.

select deptno from dept;

 

- deptno값만 나옴

3.

select loc, deptno, dname from dept;

 

- 검색시 컬럼순서 바꿀수있음

 

- 테이블 emp 도 똑같이 사용해보자

select * from emp;
select empno, ename, sal from emp;

 

- 특정컬럼만 선택적으로 검색하고 있다



SELECT SQL문 확장

- 컬럼들 사이 산술적인 연산을 수행하자
- number 타입인 컬럼만 연산 가능
- '+', '-', '*', '/' 를 컬럼사이에 사용가능

SQL문에 산술 연산자 사용 ( +, -, *, /)

select sal + comm from emp;
select sal - 100 from emp;
select sal * 12 from emp;
select sal / 2 from emp;

 

- 숫자데이터가 저장된 컬럼만 산술연산 가능하다


- 사원들이 매달 받는 돈이 SAL 컬럼에 있다


NULL 값이 있을때 연산하는 방법 (nvl() 함수)

 

산술 연산자를 사용해서 EMP 테이블에서 사원들 연봉 계산
- 사원들 연봉을 계산해보자
- SAL*12하고 +COMM(커미션) 해야함 (커미션 받는 사원들은 COMM 추가 해야함)

-- Q. 사원테이블(EMP)에 소속된 사원들의 연봉을 구해보자?
--  연봉 = 급여(SAL) * 12 + 커미션(COMM)
select ename, job, sal, sal * 12, sal * 12 + comm from emp;

 

문제 상황

- 이때 COMM받는 사원은 4명뿐 이라는게 문제이다
- JOB이 SALESMAN 으로 되어있는 4명만 커미션받고 나머지 사원들은 커미션이 없는 NULL 값
- NULL값은 정해지지 않는값을 의미하고 비어있다, 문제는 NULL값인 데이터는 산술적인 연산 + 를 지원안함
- 커미션을 받는 4명만 연봉이 구해지고, 나머지는 연봉이 NULL값이 나옴


- COMM이 NULL이면 산술적인 연산이 되지 않는다

NULL값

- 정해지지않은값, 산술연산 불가능

ex) PRESIDENT 사장의 직속상사 MGR이 NULL
ex) SALESMAN이 아닌 직원의 COMM이 NULL

NULL 값을 산술연산 가능하게 만드는 방법
- NULL을 0으로 치환시켜주는 함수 NVL (nvl) 란 함수 사용해서 null 값을 + 연산에 영향을 끼치지않는 값인 0 으로 설정

 

NVL(컬럼, 변환될 값)

- NULL 값을 다른 값으로 변환해주는 오라클 지원 함수
ex) NVL(COMM, 0) : COMM 컬럼의 NULL값을 0으로 치환 하라는 의미
- NULL 값인 경우만 치환되고 NULL 값이 아닌 경우는 그대로임
+ 오라클 지원함수 NVL 은 오라클 지원함수이므로 대소문자 구분없음

 

문제 해결

select ename, job, sal, sal * 12, sal * 12 + nvl(comm,0) from emp;

- 라고 하면 제대로 구해짐, null값에 해당하는건 0으로 치환 null아닌건 그대로


별칭만들기

- 수식 전체가 컬럼명이 되므로 보기 불편
- 해당 컬럼에 별칭을 부여할수있다

별칭 부여

- 해당 컬럼 뒤에 as "별칭명" 붙이기
- 별칭을 부여할때 " " 쌍따옴표을 쓴다

- 그럼 이 별칭명이 컬럼명으로 나타남


- as 와 " " 생략하고 실행해도 된다 

-- 별칭 부여 : as "별칭명"
select ename, sal * 12 + nvl(comm,0) as "Annsal" from emp; 
select ename, sal * 12 + nvl(comm,0) "Annsal" from emp; -- as 생략 가능
select ename, sal * 12 + nvl(comm,0) Annsal from emp; -- as 와 쌍따옴표("") 생략 가능

- 위 3가지 모두 가능

- 이제 한글별칭명 으로 만들어보자

-- 한글 별칭 부여 : as "별칭명"
select ename, sal * 12 + nvl(comm,0) as "연봉" from emp; 
select ename, sal * 12 + nvl(comm,0) "연봉" from emp; -- as 생략 가능
select ename, sal * 12 + nvl(comm,0) 연봉 from emp; -- as 와 쌍따옴표("") 생략 가능
-- select ename, sal * 12 + nvl(comm,0) 연 봉 from emp; -- 별칭명에 띄어쓰기 있을땐 쌍따옴표 생략 불가

 

- 별칭명에 띄어쓰기가 있는 경우는 " " 를 생략할 수 없다

select ename, sal * 12 + nvl(comm,0) "연 봉" from emp; -- 가능
-- select ename, sal * 12 + nvl(comm,0) 연 봉 from emp; -- 별칭명에 띄어쓰기 있을 경우에는 쌍따옴표 생략 불가

Concatenation 연산자 
- 오라클에서 제공됨
- "||" 연산자임
- 컬럼과 문자열을 연결할때 사용함

-- Concatenation 연산자 : ||
-- : 컬럼과 문자열을 연결할 때 사용함.
select ename || ' is a ' || job from emp;

 

- || 를 콘케이트네이션 연산자 라고함


DISTINCT 키워드
- 중복행을 제거하고 한번만 출력해주는 역할
- 아래의 문제상황에서 사용

 

문제 상황

select deptno from emp; -- 중복행 제거 안됨

- 이거 해결법은 컬럼 앞에 distinct 키워드 사용

 

문제 해결

select distinct deptno from emp; -- 중복행 제거됨, 3개의 부서번호 출력 : 10, 20, 30


문제 1

-- Q. EMP 테이블에서 각 사원들의 job을 1번만 출력하는 SQL문을 작성하세요.
select distinct job from emp;


문제 2

-- Q. EMP 테이블에서 중복을 제거한 job의 갯수를 구하는 SQL문을 작성하세요.
select count(distinct job) from emp;

 

- COUNT 함수 쓰면 JOB의 개수를 구할수있음

- 또한 JOB 이 중복되지 않도록 컬럼 JOB 앞에 DISTINCT 를 사용


COUNT 함수

- 데이터의 개수를 구해주는 그룹함수

- dept 테이블의 데이터 개수를 구하고 있다

-- count(컬럼명) : 데이터 갯수를 구해주는 역할
select count(*) from dept; -- 4
select count(*) from emp; -- 14
select count(job) from emp; --14

select count(distinct job) from emp; -- 5

 

- * 는 전체 컬럼 기준으로 데이터 몇 개인지, 즉 총 데이터 수

윗부분 생략 (JAVA)


공부 방향

자바에 데이터베이스 연동

- java.sql.* 패키지 사용

- 데이터베이스 설치하고 기본사용법 알아야 자바로 연동가능하다

- 본격적인 오라클은 자바가 완전히 끝난다음에 오라클에 대한 내용볼것이고 가장 기본적 연동에 필요한 SQL 문 설명할것

오라클 데이터베이스 설치 (윈도우 기준)
- 오라클은 https://www.oracle.com/ 으로 가서 다운가능 

- 오라클을 설치만 한다면 학원에서만 실습가능 외부에선 안보임
- 학원에서는 강사님 컴으로 ip로 접근해서 강사님 오라클로 접근 가능

 

오라클 버전
- 최신버전받으려면 용량이 크다. 1G이상

- XE버전의 경우엔 exe 파일만 실행하면 쉽게 설치가능

- 강사님이 주신 경량화된 오라클은 실습으로 쓰기 좋은 XE 버전임, 원래는 공식사이트 Oracle.com 가서 설치해야함

- 설치한 XE버전은 제어판에서 프로그램 추가됨, 제거하고싶으면 제어판에서 제거하면됨

XE버전만 그렇다 다른 버전 Enterprise version이나 등등은 설치도 어렵고 삭제도 어렵다

오라클 설치할떄 주의해야할 사항

기본 DB 관리자 계정 비밀번호 설정

- 설치할떄 기본적으로 데이터베이스관리자 DB 관리자가 두개 만들어져있다
- 오라클이 설치되는 과정에서 자동으로 생성되는 관리자 계정 2개  sys와 system
- 내가 만들지는 않지만 비밀번호는 내가 설정해야함

sys 계정 비번 : oracle
system 계정 비번 : oracle

- 설치시 비번 oracle로 하면 sys와 system 둘다 동일하게 oracle로 설정됨

 

기본 DB 관리자 계정 (간략)

1. SYS 계정 : 설치시 기본적으로 접속가능 계정, 가장 많은 권한을 가짐

2. SYSTEM 계정 : 설치시 기본적으로 접속가능 계정, 관리하기 위한 계정
3. SCOTT 계정 : 교육용 계정, 활성화 시켜야함, 비번은 tiger

4. HR 계정 : 교육용 계정, 활성화 시켜야함, 비번은 tiger


SCOTT 계정

- 우리는 SCOTT 계정으로 실습할 것
- SCOTT 활성화시키면 테이블 4개와 데이터까지 이미 들어가있음

- SCOTT 계정은 데이터베이스 버전에따라 사용법 다름
- 우리가 쓰는 XE는 비활성화되어있고 안에 테이블 없는 상태, 나중에 활성화시킬것 작업 필요
+ HR계정은 바로 사용가능

설치 경로
- 설치 경로 기본은 C드라이브 하위 OracleEx 폴더 하위에 설치됨

오라클 설치 완료

+ 설치시 문제 생기면 제어판 들어가서 프로그램 제거로 들어가서 목록에 오라클이 나타남, 필요없을때도 지우면됨
- 설치 완료!

 

오라클 서버 구동 방법, 중지 방법


- 구동은 오라클 설치시 자동 구동된다

필요하지 않을때 중지하는법
- 내 PC 오른쪽마우스 눌러서 [관리] -> [컴퓨터 관리]-> [서비스 및 응용 프로그램] -> [서비스] 메뉴 에서 부팅할때 실행할 서비스, 실행하지 않을 서비스들 목록을 볼 수 있고 수정 가능
- Oracle로 시작하는 5개 중에서 OracleServiceXE와 OracleXETNSListener 구동되어있어야 나중에 클라이언트가 DB에 접근가능함
- 현재는 설치시 자동으로 구동되기때문에 클라이언트가 접속가능함
- 시작유형이 자동이라 되어있으므로 부팅될때 자동으로 구동되는것임, 단 부팅시간 많이 걸림

자동실행 막기
- 오라클 안쓸때는 이걸 수동으로 바꾸면 부팅할때 자동 실행되지 않음
- 오른마우스 해서 중지 누르면됨
- 또는 시작 유형 변경할때 오른버튼 속성으로 들어가서 시작유형을 바꿀수있다(ex) 자동-> 수동)

클라이언트에서 오라클 DB 접속
- 클라이언트가 접속을 하도록 해보자
- 아무 프로그램 설치안하고 기본적인 접속가능하다, 가장 기본적인 접속 방법은 명령프롬프트로 접속
- 현재는 sys와 system 계정에만 들어갈수있다 다른계정은 락이 걸려있으므로 못감

명령 프롬프트 창에서 오라클 DB 접속하기

sqlplus system/oracle
// sqlplus 계정명/비번

- sqlplus 계정명/비번 을 입력하면 오라클의 해당 계정에 접근 가능

- sqlplus 명령이 들어가있는 bin 디렉토리까지 path가 자동으로 잡혀있으므로 바로 쓰면된다

- 오라클은 설치시 경로를 다 잡아준다, bin까지 path를 가장 앞쪽에 잡아놓기 때문에 아무위치에서나 sqlplus로 오라클 접속 가능
+ 자바는 설치시 path 안잡아 주므로 우리가 잡아야한다

 

- 이후 저 코드를 치면 SQL> 로 바뀜 

 

접속한 계정명 확인

show user

- 현재 접속한 계정명을 알려줌

 

접속 빠져나오기

exit;
// quit;

- 빠져나올땐 exit; 나 quit; 으로 빠져나올 수 있다, Disconnected 됨

sqlplus 만 입력시
- sqlplus 명령만입력하면 user-name 물어봄 이때 여기에 system이라 입력하고 비번 입력
- 계정명과 비번 맞으면 인증받아서 로그인하게 됨

 

SYS 계정 접근 하는 방법

- 같은 방법으로 sys계정으로 접속시도시 접속이 안된다
- ERROR 이유 : sys는 오라클에서 가장 많은 권한 가진 유저라서 이렇게 쉽게 접속 불가

- 접속하기 위해 권한을 부여해야함 as sysdba 를 뒤에 붙인다

sqlplus system/oracle as sysdba

- 데이터베이스 설치 복구 등 system 계정으로 하기 힘든일만 sys에서 한다

설치된 오라클 파일 구조

- 오라클은 c드라이브 하위 oraclexe 폴더 하위에 오라클이 설치되어있다

C:\oraclexe\app\oracle\product\11.2.0\server\bin

- bin 디렉토리는 명령어들이 모여있는 디렉토리, sql 명령어 실행파일들이 모여있다

ex) 지금 쓰고있는 sqlplus라는 명령어도 이 bin 디렉토리 안에 있음

ex) 여러 백업이나 복원시 쓰는 명령어도 이 bin 디렉토리에 있음

 

PATH 관련

- 오라클 설치되는 과정에서 sqlplus 명령이 들어가있는 bin 디렉토리까지 path가 자동으로 잡혀있으므로 명령어를 바로 쓰면된다
- 내PC->[설정] -> [고급 시스템 설정] -> [환경변수]

- 가장 앞쪽에 path설정된거 볼 수 있다
- path 가 C:\oraclexe\app\oracle\product\11.2.0\server\bin 로 잡혀 있음

기본 DB 관리자 계정
SYSTEM, SYS 계정

- 데이터베이스 관리자 줄여서 DBA 계정

- DB를 관리하기 위한 계정임
- 일반적인 용도로는 잘 쓰지 않음, 이 계정으로 실습을 해선 안됨
- 관리를 위한 계정이므로 두 계정으로 들어가면 기본적으로 관리하기 위한 시스템 테이블들이 여러개 만들어져있다

 

실습을 위한 DB 계정

- 실습이나 프로젝트를 위해서는 다른 일반계정이 필요함
- 일반계정 새로 생성해서 작업하든지 아니면 교육용 제공되는 SCOTT 이나 HR 계정으로 실습많이함
- SCOTT, HR 계정은 실습하기위한 테이블까지 제공되므로 실습을 쉽게할수있다

 

SCOTT 계정
- SYSTEM, SYS 계정은 관리할때만 쓰고 지금부턴 쓰지 않음. SCOTT 계정으로 실습을 할것이다
- SCOTT 계정은 DB종류에 따라 활성화 시키는 방법이 다르게 되어있다

- 다른 버전은 시스템계정으로 들어가서 스콧계정에 걸린 락을 풀어주기만해도되지만 xe버전은 활성화시키는 방법 복잡함

 

+ 테이블 보기
- 각 계정별로 기본적으로 테이블들을 가지고있다
- 테이블 목록 보려면

select * from tab;


- 하면 보여줌

+ 테이블 목록확인할땐 ; 빠뜨리면 안됨

- 단 DBA 계정들의 시스템 테이블을 건드리면안된다, 그 테이블은 관리를 위한 테이블이다
ex) sys계정에서 이 명령어 실행하면 몇천개의 시스템 테이블이 나온다

 

계정 전환하기
- 접속 된 상태에서 다른 계정으로 계정 전환하고 싶으면

connect system/oracle 
// connect 변경해야할계정명/비번

- 하면 system 계정으로 계정 전환됨
- connect 대신 conn 까지만 써도 됨

- 단, sys로 갈떄는 

connect sys/oracle as sysdba

- 까지 해야 sys계정으로 전환가능
- sys계정은 그냥 갈 수 없음


+ system은 174개정도 테이블 있다

 

SCOTT 계정 활성화 시키는 방법
+ scott.sql 파일이 필요함

c:\> sqlplus scott/tiger
c:\> sqlplus system/oracle

SQL> @c:\scott.sql

SQL> alter user scott identified by tiger; (alter user 계정명 identified by 비번;)

SQL> conn scott/tiger (scott계정으로 전환)

SQL> select * from tab; (테이블 목록, 4개의 테이블이 보임)

SQL> quit; (종료)

- 가장 먼저 sqlplus 로 system 계정으로 접속한다 비번 oracle
- 접속 되고나면 SQL> 로 바뀜
- 이때 scott.sql 파일을 불러와야함
+ 이 파일을 만약 C드라이브에 저장했으면 @c:\scott.sql 해줌

@ 명령어
- @는 sqlplus 명령어 중 하나임
- @는 확장자가 sql로 되어있는 파일을 실행시켜주는 명령임
- @라는 sqlplus 명령어로 실행시켜라는 의미

scott.sql 파일

- SCOTT 계정 소유의 4개의 테이블을 생성하고 실습을 하기위한 데이터를 Insert시키는 내용이 이 파일안에 있다

- 백업을 해둔 이 파일을 실행하면 4개의 클래스 생성되고 데이터 insert됨

- scott.sql 파일 안에 보면 4개의 테이블 생성하는게 보인다

 

scott.sql 파일 부분
CREATE TABLE DEPT //부서테이블 생성
CREATE TABLE EMP //사원테이블 생성
INSERT INTO DEPT VALUES('','','','') // DEPT 테이블에 데이터 4개를 insert 시킴
이 INSERT 문이 4개있고
그 다음은 
CREATE TABLE BONUS
CREATE TABLE SALGRADE
그리고 SALGRADE안에 데이터를 INSERT 하고 있다


SCOTT 계정 활성화 후 테이블 목록 확인
- DEPT EMP BONUS SALGRADE 4개의 테이블이 만들어져있다
ex) select * from dept; 하면 내부 데이터 보임

SCOTT 계정 활성화 이후

- 이젠 scott계정으로 sqlplus 해서 바로 접속 가능하다
- 현재 3개의 계정(SYS, SYSTEM, SCOTT) 으로 접속가능

파일 시스템 vs DB 서버

파일 시스템

- 파일 단위로 데이터를 관리
- 지금껏 개인들은 파일시스템을 써왔음
- 개인들은 파일로 관리함, 파일이 많아지면 폴더안에 저장함

 

DB 서버
- DB서버는 모든 유저가 사용해야하기때문에 기존 파일시스템을 쓰면 여러 문제가 발생함

- 데이터를 효율적으로 관리하기 위해서 사용함

 

파일 시스템의 문제

- 파일시스템은 1차적으로 중복문제가 발생함

ex) 자료실 기능 upload 폴더 안에 lay.jpg 가 저장되면 동일이름 파일 저장못하는 문제
- 데이터 무결성 문제도 발생, 보안성 문제도 발생

 

-> 데이터 안전관리 위해서 데이터베이스 관리 시스템 (DBMS) 이란걸 쓰게됨


DBMS(DataBase Management System)

- 데이터베이스 관리 시스템
- DBMS 쓰면데이터 효율적이고 안전하게 관리 가능하다

 

RDBMS

- 관계형 데이터베이스 관리 시스템 (Relational DataBase Management System)

- DBMS 중에 우리가 주로 쓰는 많은 DBMS는 RDBMS
- 가장 일반적인 형태의 DBMS  
- 표를 작성해서 데이터를 관리하는 데이터베이스 관리 시스템

- 대표적인 RDBMS 는 Oracle, Sybase, Infomix, MYSQL, Acess, SQL Server
- 우리가 알고있는 많은 데이터베이스들은 거의 관계형 데이터베이스로 되어있다
- 쉽게 작성,확장 가능하고 데이터 관리도 용의함
- RDBMS 는 스키마(표) 가 있고 형식에 맞는 정형데이터만 저장 가능

+ 그 외에도 계층형, 네트워크 형 등 있음

 

+ NOSQL
- 빅데이터 처리할때는 RDBMS 가 아닌 NOSQL을 쓴다 
- Not Only SQL , 빅데이터 저장하기 위한 저장소역할을 하는데 종류가 여러개있다
ex) 몽고DB. 카산드라 등 
+ RDBMS 는 스키마(표) 가 있고 형식에 맞는 정형데이터만 저장 가능
- 그에 비해 NOSQL은 정형이 아님 집어넣으면 다 들어감

 

RDBMS 특징
- 관계형 데이터베이스는 표를 작성한다
- 표제목 = 컬럼, 필드 란 용어를 씀
- 한개의 표는 표제목에 해당되는 컬럼이 있고, 로우(row)가 있다

 

ex) DEPT는 부서정보 가진 테이블

DEPTNO  DNAME LOC
10 ACCOUNTING NEWYORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON

- 3개의 컬럼과 4개의 로우로 구성되어있다
- 첫번째 컬럼은 부서번호 DEPTNO가 저장되어있음 
- 두번째 컬럼은 부서명 DNAME
- 세번째 컬럼은 부서위치지역LOC

테이블 목록 확인
- select * from tab; 하면 테이블 전체 목록, select * from DEPT 하면 DEPT 테이블 목록 확인 가능
- select문은 SQL 문임 데이터 검색,질의할때 사용, ;를 반드시 찍어야
- SQL문은 대소문자를 구분하지 않는다

SQL(Structured Query Language)
- 데이터베이스에 질의하는 명령어
- 여러 데이터를 검색, 조회, 입력, 수정하기위한 명령어를 SQL 이라고 함
- SQL은 기능에 따라 DML, DCL, DDL 등 나눠짐

- 지금은 자바와 연동하기위한 4,5개 SQL문만 공부할것



DDL SQL문
- 데이터 정의어 (Data Definition Language)
- CREATE, ALTER, DROP, RENAME, TRUNCATE 가 있다
- CREATE : 테이블을 생성하는 역할
+ 오라클은 전역 데이터 베이스 하나만 나눠서 쓰기때문에 따로 데이터베이스 안만들어도됨
+ mysql은 사용자별로 데이터베이스따로 만듬
+ 그때 CREATE는 데이터베이스 만드는것, 오라클인 여기선 그냥 테이블 생성
- ALTER : 테이블 구조 변경
- DROP : 테이블 삭제
- RENAME : 테이블 이름 변경
- TRUNCATE : 한번에 데이터 모두 삭제

 

DDL (데이터 정의어) 의 CREATE 명령어
- CREATE 명령어를 사용해서 테이블 한개 생성 가장 먼저 해보자

 

DML (데이터 조작어)
- DDL CREATE 로 테이블이 만들어지고 나면 생성된 테이블에 데이터 입력할땐 INSERT 명령어 써야, 수정은 UPDATE 삭제는 DELETE
- 데이터가 조작이 일어남 그래서 INSERT UPDATE DELETE 를 DML 이라 부림

 

SELECT 명령어

- SELECT 는 검색을 할떄 사용하는 것
- SELECT 는 아무리 써도 데이터 조작 일어나지 않음 (정처기에선 DML로 분류됨)

- 전체 SQL 문에서 50%이상이 SELECT 가 차지, 가장 복잡함

- 조건들을 만족하는 데이터 검색, 검색된 자료들 정렬, 데이터 전체검색, 테이블 나눠져있을땐 조인을 해야하고, 조건에 맞는 데이터를 10개씩 잘라 출력하기 등 가장 많은 기능가진게 SELECT 임

 

CRUD
- CREATE TABLE 같은건 콘솔창에서도 해도되고 그래픽프로그램에서도 해도되고 아무곳에서 해도 된다
- 하지만, DML SQL문들은 자바같은 프로그램가지고 직접 코딩을 해야함, 이런걸 CRUD(create read update delete) 작업이라고 함, CRUD SQL문들은 프로그램 상에서 직접 구동해야한다
- Select Insert Update Delete 는 프로그램 상에서 직접 적어서 구동해야

TCL / DCL
- 트랜지션에 관련된 TCL이나 권한에 관련된 데이터제어어 DCL 등도 있다


CREATE 명령어
- 테이블을 생성할때 사용되는 명령어

create table 생성할테이블명 (컬럼명 데이터타입, 컬럼명 데이터타입, ...);

 

- 데이터타입은 크게 3가지 (숫자,문자,날짜) 있다
+ 데이터타입은 데이터베이스 종류따라 다름
ex) 오라클은 숫자는 number 타입 , 문자는 varchar2 타입, mysql 은 숫자는 int 타입, 문자는 varchar 타입

 

테이블 생성

create table member01(
	id  varchar2(20), //20바이트만큼 공간할당하라, 즉 크기임
	name  varchar2(20), // 이름저장위한 varchar2에 20바이트 공간할당해라
	address varchar2(50), //주소저장위한 varchar2에 20바이트 공간 생성해라
	phone  varchar2(20));


- 하면 member01 테이블 만들어짐

+ 중간에 잘못입력하고 엔터쳤다면 방향키를 이용해 그거 수정하고 엔터치면 됨

 

오라클의 데이터 타입
- 숫자는 number 타입을 씀 문자는 varchar2 를 주로 쓰고, 문자는 date 나 timestamp 를 사용한다

 

테이블 목록 보기

select * from tab;

- member01 생성됨을 알수있다

 

테이블의 스키마(구조) 보기
- describe 명령 사용, 아래 둘 다 가능

describe member01
desc member01

- describe 명령을 사용해서 해당 테이블의 컬럼명들과 데이터 타입을 볼 수 있다

 

SCOTT 의 DEPT 테이블 구조를 보면서 컬럼 보기

- 컬럼 DEPTNO 에 NOT NULL 되어있고, 타입은 NUMBER(2) , 두 자리까지 저장가능하단 의미 즉 99까지 저장가능하다, 두자리 정수만 저장가능하단 의미
- 컬럼 DNAME는 VARCHAR2(14) , 14바이트까지 저장가능 문자라는 의미
- 컬럼 LOC 는 VARCHAR2(13), 13바이트까지 저장가능한 문자데이터다

 

오라클의 자료형
- 오라클에서 자료형은 크게 3가지 타입인 숫자, 문자 날짜 로 나뉜다
- 다른 RDBMS도 마찬가지지만 데이터베이스마다 자료형이 다름

oracle mysql
number int
varchar2 varchar


- DDL CREATE로 테이블(표) member01 을 만들어봤다

+ 강의에는 CREATE(데이터베이스 생성) 이라 되어있지만 오라클에선 테이블 생성임


DML

- 만들어진 표에대해 데이터 입력 INSERT, 수정 UPDATE, 삭제 DELETE, 검색 SELECT 을 해보자

- 실제로 데이터 조작함

- 데이터 입력 INSERT, 수정 UPDATE, 삭제 DELETE, 검색 SELECT 
- SELECT 는 아무리검색해도 데이터 조작 안일어나지만 DML에 포함

INSERT 명령어
- 데이터 입력시 사용되는 SQL 문, INSERT 는 형식이 2가지가 있다

INSERT SQL 문 형식 2가지
1. 컬럼명을 쓰는 형식, 원하는컬럼만 데이터를 입력할때 사용

insert into 테이블명(컬럼1, 컬럼2,..) values(데이터1, 데이터2,...);

- 컬럼개수와 데이터 개수가 일치해야함

- 컬럼1 자료형에 맞는 데이터1을 써야함
- 원하는 컬럼만 입력할때 쓰는 방식, 50개 컬럼이 있다면 그거 다 안쓰고 원하는 컬럼만 선택적으로 입력시 사용


2 컬럼명을 안쓰는 형식, 모든 컬럼에 데이터를 입력

insert into 테이블명 values(데이터1, 데이터2,...);

 

- 테이블에 맞는 컬럼 순대로 자료형에 맞는 값들을 모두 입력해야하는게 2번쨰 형식

DML SQL문 수행시 주의
- 문자데이터는 반드시 외따옴표(' ') 로 묶어줘야함

 

INSERT 명령어로 테이블에 데이터 삽입 (1번째 형식)

- 컬럼 순서가 바뀌어도 상관없지만 바뀐 값들 순서에 맞는 자료형으로 값을 써야함!
- 자료형이 모두 varchar2니까 데이터 삽입시 모든 데이터를 외따옴표로 값을 감싸야함
- 오라클에서 문자는 반드시 ' 외따옴표
- 영문(문자) 데이터는 대소문자 구분함
- 오라클은 대소문자 구분안하지만 유일하게 문자데이터는 대소문자 구분함! 즉 ' ' 안에 들어간건 대소문자 구분됨

 

SELECT 명령어로 테이블의 데이터 확인

- member01에 있는 모든 데이터를 검색하라는 의미이다

INSERT 명령어로 테이블에 데이터 삽입 (2번째 형식)
- 두번째 형식으로 INSERT 해보자

- 컬럼명을 안쓰지만 모든컬럼을 순서대로 맞는 자료형의 값을 써야함
- CREATE 할때 크기 설정을 20바이트로 했다면 20바이트 내의 데이터만 입력되고 20바이트가 넘는 데이터는 INSERT 되지 않는다

SELECT 명령어로 테이블의 데이터 확인

- 영문 데이터는 대소문자 구분, 문자 데이터는 ' ' 안에 !


UPDATE 명령어
- 데이터를 수정할때 사용되는 명령어

UPDATE SQL 문 형식

update 테이블명 set 컬럼1=수정할값1,
            	컬럼2=수정할값2,...
           	where 조건절;


- 수정하고 싶은 데이터만큼 늘려서 작성하면 된다

- 마지막 수정할값뒤에는 , 안쓰기

where 조건절
- 원하는 데이터만 수정하기위해서 where 조건절을 씀, 비교연산자로 조건절을 쓰게됨(> ,<, <=, >=)
- 조건절을 만족한 데이터만 수정가능하다
- where 조건절이 없으면 모든 데이터가 한꺼번에 수정됨

오라클에서의 비교연산자

= : 같다
<> , !=, ^= : 다르다

- 자바랑 다름을 주의
- 보통은 where 조건절에 비교연산자를 쓰는게 일반적

UPDATE 명령어로 데이터 수정
- 'toto'란 사람의  주소를 '인천시' 였는데 '제주도' 로 바꾸자

update member01 set Address = '제주시'

- 하면 모든 데이터가 '제주시'로 바뀌므로 where 조건절써서 id값이 'toto'인 회원만 이라는 조건달기

update member01 set Address = '제주시' where ID = 'toto';


SELECT 명령어로 조건에 맞는 데이터만 검색

- SELECT문도 WHERE조건절 써서 id값이 'toto'인 회원만 검색하기 가능
- WHERE 조건절은 INSERT 를 제외한 나머지 명령어에 쓸 수 있음 DELETE, UPDATE 시 사용 가능



DELETE 명령어
- 데이터를 삭제할때 사용되는 명령어

delete from 테이블명 where 조건절;


- DELETE FROM 테이블명 까지 쓰면 테이블 안의 모든 데이터를 삭제함
- DELETE 문에 WHERE써서 원하는 조건만 삭제

 

DELETE 명령어로 특정 데이터 지우기 1
- id값이 'toto'인 데이터를 지우자

+ 데이터가 삭제되었는지 SELECT 문으로 확인

DELETE 명령어로 특정 데이터 지우기 2

- id값이 'test'인 데이터도 지우자



자바 - 오라클 연동
- 이클립스를 사용해서 자바에서 오라클로 연동해보자
- 자바 - 오라클은 그냥 연동이 안됨 자바는 오라클을 모르므로 접속을 어떻게 할지 모른다

- 자바는 오라클에 대한 정보를 가지고있지 않으므로 오라클 사 에서 만든 드라이브를 자바에게 알려줘야함

- 자바 - 오라클 사이 중간에 드라이브가 필요하다

JDBC Driver

- 중간 연동을 위해서는 JDBC Driver 가 필요함, 이 드라이버가 있어야만 자바는 접속정보를 받을 수있음
- 이 드라이버는 데이터베이스 회사에서 제공함(Oracle사)
- Oracle용 JDBC Driver를 오라클 홈페이지에서 구하거나 설치시 제공되는걸 사용
- 이 JDBC Driver 이름이 ojdbc6.jar 이다, 오라클 설치될떄 JDBC Driver 인 ojdbc6.jar 도 같이 설치됐다
- 자바 연동 방법 : 이 드라이버 파일 ojdbc6 를 자바가 설치된곳에 저장한다, 그럼 이 드라이버가 이클립스 상에서 보임
+ 만약 mysql 과 연동할땐 mysql용 드라이버를 구해야함 (데이터베이스 만든회사에서 드라이버를 제공)

 

++
운영체제는 그래픽카드 모름, 그래픽카드 회사에서 드라이버를 만들어서 알려줌, 그거처럼 여기서도 마찬가지

자바 - 오라클 연동 방법
1. 가장 먼저 JDBC Driver를 구해야함
- 오라클이 설치된곳에 드라이버 여러개 있다. 그 중 현재 ojdbc6.jar 를 쓸 것

- c:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 안에 ojdbc5, ojdbc6, ojdbc6_g 있음


2. 이 드라이버를 자바가 설치된곳 jre/lib/ext 폴더 아래에 드라이버 ojdbc6.jar 를 넣는다

- ojdbc6.jar를 복사해서 자바가 설치된 c:\Program Files\java\jre1.8.0_231\lib\ext 안에 넣는다

- lib 폴더 하위에 저장해야만 따로 클래스 path 를 잡아주지 않아도 이 드라이버 파일이 이클립스에서 보인다
- 다른곳에 넣으면 클래스 path를 따로 잡아줘야함
+ 현재 오라클용 JDBC Driver 는 클라우드 폴더에도 있고, 홈페이지에서도 구할수있고, 오라클 설치된곳에 가도 있다

 

3. 이클립스에서 JDBC Driver 인 ojdbc6.jar 가 보이는지 확인한다

- 이클립스에서 ojdbc6.jar가 보인다


4. 자바 - 오라클 연동 테스트 
- 자바 - 오라클 연동 테스트를 위한 두개의 테스트 파일 있다

- JDBC_Connect01.java 와 JDBC_Connect02.java
- 연동테스트를 성공해야만 나중에 SQL문으로 데이터를 처리 가능

 

자바 - 오라클 연동 테스트 : 예제 1
- JDBC 드라이버가 로딩이 되는가만 테스트하는 코드임
- JDBC_Connect01.java

package p2022_07_14;

import java.sql.*;

public class JDBC_Connect01 {

	public static void main(String[] args) {

		/** ORACLE JDBC Driver Test ***************************/
		String driver = "oracle.jdbc.driver.OracleDriver";
		/******************************************************/

		/** My-SQL JDBC Driver Test **************************/
		//	String driver ="com.mysql.jdbc.Driver";
		/*****************************************************/

		try {
			Class.forName(driver);	//JDBC Driver Loading
			System.out.println("JDBC Driver Loading 성공~!!");	

		} catch (Exception e) {
			System.out.println("JDBC Driver Loading 실패~!!");
			e.printStackTrace();
		}
	}
}

코드 하나씩 살펴보기 1

String driver = "oracle.jdbc.driver.OracleDriver";

- 오라클 JDBC Driver 경로를 변수 driver 에 저장

- oracle.jdbc.driver 까지가 패키지명, OracleDriver 가 클래스명

- 가져왔던 ojdbc6.jar 의 압축을 풀면 oracle.jdbc.driver 라는 패키지가 있고, 그 안에 클래스 OracleDriver.class 가 있다

 

코드 하나씩 살펴보기 2

Class.forName(driver);

- 클래스 이름이 Class 이다, java.lang 안의 Class 클래스
- forName() 은 정적메소드, 메소드 매개변수로 driver 변수로 저장되었던 JDBC Driver 를 로딩함
- JDBC Driver 가 로딩 안되면, 예외발생시 catch로 간다
- JDBC Driver 가 로딩 된다면, 성공 메세지 뿌림

- 자바 - 오라클 연동 코드에서 예외처리를 반드시 해야함, try-catch-finally를 써서 주로 예외처리를 한다
- Class.forName() 은 try안에 예외발생할 가능성있는 문장 

 

자바 - 오라클 연동 테스트 : 예제 2

- JDBC 드라이버 로딩 테스트만 했던 이전 예제와 달리, JDBC Driver 로딩도 하고 DB 접속도 한다
- JDBC_Connect02.java

package p2022_07_14;

import java.sql.*;

public class JDBC_Connect02 {

	public static void main(String[] args) {

		/** ORACLE JDBC Driver Test *****************************************/
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		/*******************************************************************/

		/** My-SQL JDBC Driver *********************************************/
		//	String driver ="com.mysql.jdbc.Driver";
		//	String url = "jdbc:mysql://localhost/academy";
		/*******************************************************************/

		Connection con = null;

		try {

			Class.forName(driver);

			/** ORACLE에서 Connection 객체 ***********************************/
			con = DriverManager.getConnection(url, "scott", "tiger");
			/*******************************************************************/

			/** My-SQL에서 Connection 객체 ***********************************/
			//	  con = DriverManager.getConnection(url, "totoro", "1234" );
			/*******************************************************************/

			System.out.println("데이터베이스 연결 성공~!!");

		} catch (Exception e) {
			System.out.println("데이터베이스 연결 실패~!!");
			e.printStackTrace();
		} finally {
			try {
				if (con != null)
					con.close();
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
	}
}

 

코드 하나씩 살펴보기 1

		/** ORACLE JDBC Driver Test *****************************************/
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@localhost:1521:xe";

<driver 변수>

- String driver = "oracle.jdbc.driver.OracleDriver"; 그대로 수정안해도 된다

<url 변수>

1. localhost는 현재 자바와 오라클이 같은 ip를 가지고 있으므로 local로 접속하는것이다
- 만약, 오라클이 원격으로 떨어져있으면 오라클 설치된 컴의 ip주소 나 도메인명을 써야함

- 현재 localhost 자리에 타인의 컴 ip 주소를 쓰면 이클립스에서 자바 프로그램으로 타인의오라클 DB 에 접속 가능 (타인의 컴퓨터 방화벽이 풀어있어야함)

2. 1521 은 포트번호, 여기도 소켓통신하므로 IP주소와 포트번호를 가지고 찾아가서 해당 소켓을 연결함

- IP주소와 포트번호까지 일치되어야만 소켓을 연결해서 통신가능

3. 변수 url 에는 우리가 사용하게 될 데이터베이스의 정보를 설정한다

- xe 는 우리가 사용하게 될 오라클의 전역 데이터베이스 이름이다
- 지금 버전에 맞게, 맨 마지막의 orcl 대신 xe로 수정

오라클 버전 별 데이터베이스 이름
- XE 버전은 기본값이 xe, 전역 데이터베이스 이름이 xe 이다

 

코드 하나씩 살펴보기 2 (JDBC Driver 로딩)

			Class.forName(driver);

- Class.forName() 메소드로 오라클용 JDBC 드라이버를 메모리상으로 로딩, 이 로딩을 가장 먼저 해야한다

-  예외처리 필수인 코드, 안하면 오류 발생 (db연동과 입출력은 예외처리 필수)

- 클래스명이 Class, 정적메소드인 forName()

+ try-catch-finally 반드시 예외처리 해야하는 형식임

 

코드 하나씩 살펴보기 3 (Connection 객체 생성)

con = DriverManager.getConnection(url, "scott", "tiger");

- DB 접속 코드
- java.sql 의 클래스인 DriverManager 클래스를 통해서 getConnection() 정적메소드를 호출함
- 이 메소드는 메소드 오버로딩되어있고, 지금은 매개변수 3개짜리 쓰고있다

java.sql.DriverManger 클래스

- 드라이버를 관리하는 클래스임

- getConnection() 메소드 메소드 오버로딩 되어있는거 볼수있다
- 그 중 static Connection getConnection(String url, String user, String passward) 사용

1) 첫번째 매개변수 url 은 데이터베이스 url 정보, 오라클에선 xe 전역 데이터베이스를 쓰므로 xe 만 작성

2) 두번째 매개변수 "scott" 는 전역 데이터 들어가기위한 유저계정, 현재 scott 계정 사용

3) 세번째 매개변수 "tiger" 즉 그 계정의 패스워드

- 이 세가지 매개변수 정보가 일치하면 Connection 객체가 생성된다


DB 연동시 공통적으로 들어갈 기본적인 내용

1. JDBC Driver 로딩

2. Connection 객체 생성

- 이 두 내용은 DB 연동시 반드시 공통적으로 들어간다

 

- 현재 JDBC_Connect02.java 실행해서 성공나오면 기본적인 연동을위한 준비가 다 된것
- DB 연동하는 방법은 순서와 기본형식틀이 정해져있다

- 지금 예제에선 연결하는 것만 했음
- 접속이 되면 우리가 배웠던 SQL 을 try문 써서 수행한다

 

 catch 와 finally 에 들어갈 내용
1. 위 예제의 catch문 에서 오류출력하는 3가지 중 한가지인 e.printStarctTrace() 를 사용
2. 위 예제의 finallly문에서 생성된 객체를 닫고있다, 이때 finally에서 그냥 끊으면 예외발생하므로 그냥 끊으면 안됨
- 이 finally문 안에서 또 try 써서 Connection 객체가 null 값이 아니라면, 즉 Connection 객체가 생성되었다면 con.close()로 데이터베이스와의 연결을 끊게됨

- DB접속하기위한 기본적인 테스트 끝났다
- JDBC 드라이버 로딩, Connection 객체 생성 이 두개를 반드시 성공해야 나머지 sql 문 수행가능



자바연동 예제

- 예1 폴더
- 생성할 테이블 customer

create table customer( no number(4)  primary key, 
       name varchar2(20),
       email varchar2(20),
       tel varchar2(20)  );

 

- DDL인 이 작업을 가장 먼저 해야한다

- DDL SQL 문은 여러 곳에서 사용가능. 콘솔창에서 해도되고 , 다른 툴로 해도되고, 이클립스에서 해도됨

- no 컬럼 : 4자리 정수 저장하는 정수형, primary key 이므로 반드시 값을 입력해야하고 중복된 값을 저장할 수 없다

- primary key : 중복된값 저장불가, 값 입력하지 않은 null 값을 허용 안함
+ 이런걸 제약조건이라고 한다, no 컬럼에 아무값이나 입력하지 못하도록함

- varchar2(20)인 name,email,tel 컬럼 생성

 

+ 제약조건
- primary key, not null, unique key, foreign key 등을 제약조건이라고 함

- 제약조건 위반된 값을 못 넣게함

- 제약조건은 컬럼 단위로 제약조건 설정하는것임

- 이후 데이터 입력/검색/수정/삭제 하기 위한 java 파일들이 있다. 각 파일에서 4가지의 SQL문을 수행하고있음

 

테이블 생성
- customer 테이블을 이클립스에서 DB연동 해서 DDL create로 테이블 만들어보자

이클립스로 DB 연동하는 방법

- Window-> Show View -> Other -> Data Management 폴더 하위 Data Source Explorer 선택 후 Open 버튼누르기

- 그럼 Data Source Explorer 창이 나타남

- 거기서 Database Connections 폴더 선택 -> 오른마우스해서 new선택 

- mysql orcle sql server 등등 여러 데이터베이스와 이클립스를 연결시킬수있다

- 이 중에서 Oracle을 선택후 아래쪽에 Connection 이름명을 New Oracle(scott) 이라고 계정명을 붙여서 써주자

- 나중에 커넥션많아지면 어떤 계정으로 커넥션 연결됐는지 구분힘드므로 계정명 설정

- Next

- 우측 New Driver Definition 메뉴 클릭시 탭이 3개인 창 새로운창이 뜬다
- 3개의 탭에서 일일히 설정해야함

1. 첫번째 탭은 용하게될 데이터베이스 네임값과 타입을 선택함, 여기서 데이터베이스 종류를 선택함
- 우리가 설치한 오라클 버전으로 Oracle Thin Driver 선택, 시스템버전은11

2. 두번째 탭 JAR List에서 이전 jar파일 clear All하고 Add JAR/Zip.. 눌러서 오라클용 JDBC 드라이버 가져오기
- ojdbc6.jar 는 오라클 설치된곳또는 자바 설치된곳에 있으므로 거기 찾아가서 ojdbc6.jar 가져오기


- 한번 경로 설정해두면 SQL문 결과를바로확인하는등 아주 편하게 쓸 수 있음

 


3, 세번째 탭 Properties란 탭 들어가서 DB 관련 내용을 수정해야함
- Connection URL 부분은 jdbc:oracle:thin:@localhost:1521:xe 로 수정
- Database Name 부분은 xe로 수정
- passward 는 tiger
- UserID는 scott

- 다음으로 OK 버튼 눌러서 넘어가면 그 다음 Save password 체크

- Test Connection 버튼 눌렀을떄 Ping succeeded 메세지 나와야 연결 설정 잘 된것
-> Finish

 

- Finsh 후에 Data Source Exploer에 xe가 뜬다

- 만약 뭐 수정하고싶으면 New Oracle(scott) 에 오른마우스 -> Properties하면 아까 설정했던 그 화면이 나타남

- 좌측 하단에 현재 접속이되었는지 상태 나타남
- (Connected) 는 현재 접속된 상태
- 연결 끊고싶으면 현재 커넥션인 New Oracle(scott)에 오른마우스 - Disconnect 누르면 됨

- 다시 연결할땐 커넥션 더블클릭 또는 오른마우스 - Connect

이클립스에서 DB 접속해서 SQL문 사용하는 방법
1. .sql 파일 생성

- src 폴더 하위에 SQL이란 폴더를 만들고 그 하위에 myOracle.sql 파일을 추가하자
확장자가 sql 인 파일 만드는 방법
- 폴더누르고 오른버튼 -> new에 Other 눌러서 -> SQL Development 폴더 안의 SQL File 누르기
- 이렇게해야 확장자가 sql인 파일 만들어줌


-  파일명은 MyOracle 로 했다

2 MyOracle.sql 에서 Connection profile을 선택

- 첫번째는 타입, 우리가 사용하는 데이터베이스 종류 Oracle_11선택 
- 두번째는 커넥션 이름 선택, New Oracle(scott) 선택한다
- 세번쨰로 데이터베이스 이름은 xe 선택
- 여기까지 하고 좌측 상단 디스켓모양 눌러서 저장

- 이클립스에서 오라클로 연결 완료, 여기서 작업을 다 할 수 있다
- '--' 가 주석이다

 

SQL 문 실행하는 방법 2가지

1. 블럭을 잡아서 오른버튼눌러서 실행하는 명령인 Execute Selected Text 클릭
2. 블럭잡고 Alt+ X 단축키 누르기

 

3. SQL문 실행 : 테이블 목록 확인

select * from tab; -- 테이블 목록(현재 계정 소유의 테이블 목록을 보여달라는 것)

- 으로 해당 계정의 테이블 목록 확인 가능
- 실행시 아래쪽에 검색된 내용 보여줌
- Result1 탭에 scott 계정 테이블 소유 목록을 보여줌



4. SQL문 실행 : 테이블 생성

이클립스에서 DB 접속해서 자바 - 오라클 연결하는 예제
- 네이버 클라우더의 '예1' 폴더 안의 테이블 구조를 가져오자

create table customer( no number(4)  primary key, 
       name varchar2(20),
       email varchar2(20),
       tel varchar2(20)  );

- 위 create 문을 MyOracle.sql 로 가져와서, 블럭잡고 Alt + X 단축키로 실행
- 그 후 select * from tab; 으로 보면 customer 테이블이 보임
+ 명령프롬프트에서 desc 로 테이블 구조 확인 가능

desc customer


- MyOracle.sql 전체 코드

select * from tab; -- 테이블 목록
select * from member01;

--예1.
-- primary key(기본키) : 반드시 중복되지 않는 값을 저장 해야한다는 의미
create table customer( no number(4)  primary key, 
       name varchar2(20),
       email varchar2(20),
       tel varchar2(20)  );

 

- 데이터 원하는 형태로 쉽게 제어하기위해서 테이블 만들때 primary key 로 설정된 컬럼이 한개 필요함

- DB 작업 끝났다
- 나머지는 자바 프로그램으로 insert, select 등 해서 수정, 삭제, 삽입 등 자바에서 처리
- 내일은 예1 폴더의 파일들을 가져와서 연동시킬거 JDBC_Delete, JDBC_Update 등의 파일을 살펴볼 것

+ Recent posts