Javascript : 클라이언트 스크립트 (브라우저에서 실행), HTML문서내에 포함되어서 실행

vs

Jsp(Java) : 서버 스크립트 (JVM에서 실행)

 

- JAVA란? 객체 지향 언어이다.

OOP(Object Oriented Programming) : 부품인 객체를 먼저 만들고, 이것들을 조합해서 전체 프로그램을 완성!!

 

- JAVA의 특징

1. Virtual Machine - 운영체제 (리눅스, 윈도우, 맥os)의 영향을 받지 않는다.

> 자바 프로그램 하나만 잘 만들어 놓으면 OS가 달라도 해당 OS의 Virtual Machine이 있다면 프로그램이 돌아감

2. Garbage Collection - 개발자는 메모리를 관리하지 않는다.

3. OOP - 객체지향 언어로 개발과 유지보수를 효율적으로 진행 할 수 있다.

 

- JDK : 개발자를 위한 버전, JRE가 자동으로 포함 (개발자라면? JDK 설치)

- JRE : 실제 동작을 하는데 필요한 JVM과 각종 라이브러리, 파일을 포함 (실행만 할 거라면? JRE 설치)

- JVM : 실제 구동되는 환경, 가상머신이기 때문에 어느 운영체제나 호환이 가능

대표사진 삭제

사진 설명을 입력하세요.

 

 

제어판 - 프로그램 및 기능 - java 11 제거 (지난번에 깔았던 거)

 

내 컴퓨터에서 오른쪽 마우스 클릭 후 속성 - 고급 시스템 설정 - 환경변수에서

 

java~~~ 삭제

path에서 c:\app부터 시작하게끔 앞에 지우기

 

cmd 창에서 java 입력

'java'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는

배치 파일이 아닙니다. (이렇게 나오면 다 삭제된 거OK)

 

editplus 보통문서 - 도구 기본설정 - 파일에서 저장시 백업 파일 생성 체크 해제

(나중에 파일이 수백개,수천개가 된다...)

 

** java 환경 setting

1.jdk(java development kit) download : Java SE (Java SE 8u221)

https://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html

밑으로 내려보면, Java SE 8 Documentation 다운로드

2.java se 이후 Java EE & GlassFish Server 공부~

3.java se deverlopment kit 8 설치 (껐다 켰을 경우, java 업데이트 뜨는데 절대 하지 말것!!!)

 

JAVA SE(Stanard Edition) : JAVA Application 개발 > 일반적인 애플리케이션 개발

JAVA EE(Enterprise Edition) : 기업 솔루션 개발 > 가장 핵심

 

4. https://www.eclipse.org/

접속 후, 화면 위쪽 다운로드 클릭 - 다운로드 패키지 클릭

Eclipse IDE for Enterprise Java Developers 다운로드

5.C:\Program Files\Java\jdk1.8.0_221\bin으로 들어가서 java, javac(java compiler)를 주로 사용

(bin 실행파일이 위치한 곳)

6.환경변수에서 새로 만들기 : 다른 경로에서 javac를 호출하더라도 실행 가능하도록 설정해 주는 것

- 방법 1

: 위쪽 사용자 변수에서 path > 편집 > 새로만들기 > C:\Program Files\Java\jdk1.8.0_221\bin

(java와 javac의 실행파일이 위치한 곳)

- 방법 2 (추천!!)

변수 이름 : JAVA_HOME

변수 값 : C:\Program Files\Java\jdk1.8.0_221 (직접 쓰지 말고, 해당 경로 복사하기!!)

 

변수 이름 : CLASSPATH

변수 값 : .

 

** PATH 편집 누르면 --? JAVA_NOME 추가해주기

변수 이름 : PATH

값 : %JAVA_HOME%\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\app\SIRENA\product\18.0.0\dbhomeXE\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common

 

7.설정 확인

cmd 창에서 java -version 으로 확인

java version "1.8.0_221"

Java(TM) SE Runtime Environment (build 1.8.0_221-b11)

Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

8.설정 확인

cmd 창에서 javac -version 으로 확인

 

9.메모장 켜서

public class HelloJava

{

public static void main(String args[])

{

System.out.println("Hello Java !!!!");

}

}

 

입력 후 저장 (ctrl + s)

 

D:\javadata\java에 메모장 저장 파일명 : HelloJava.java

(파일명은 반드시 class이름 설정한 것과 반드시 똑같이 저장해야 함!!!!! 복붙하기~)

 

10.cmd창에서 d:드라이브로 이동 후 dir로 저장 파일 확인

11.컴파일 : 프로그래머가 작성한 소스코드를 컴퓨터가 이해할 수 있는 말(기계어)로 바꾸는 행위

cmd창에서 javac 입력 Usage: javac <options> <source files>

12.javac HelloJava.java(확장자 포함) 입력

13.dir 입력하면 class파일 하나 더 생성으로 2개 파일 생겨남

14.실행 : java 입력하면 사용법 확인 사용법: java [-options] class [args...]

15.java HelloJava (확장자 제외)입력하면 java HelloJava !!!! 출력

16."안녕 자바" 추가

public class HelloJava

{

public static void main(String args[])

{

System.out.println("Hello Java !!!!");

System.out.println("안녕 자바 !!!!");

}

}

 

* 파일이 바뀌면??

javac HelloJava.java 로 컴파일을 다시 해야 한다 (매번)!!!!

 

다시 java HelloJava 입력하면

Hello Java !!!! 안녕 자바 !!!! (출력 ok)

 

17.System.out.print("안녕하세요~~~"); 추가

 

public class HelloJava

{

public static void main(String args[])

{

System.out.println("Hello Java !!!!");

System.out.print("안녕하세요~~~");

System.out.println("안녕 자바 !!!!");

}

}

 

print는 한줄이 안 떨어지고 쭉 붙여서 출력!!!

 

* 암기~~~ Main Method 외우기!!!! Java는 대소문자 중요!!!!

 

public class class이름

{

public static void main(String args[])

{

System.out.println("~~~~~~~~~~~~~~~"); println 은 줄변경

System.out.print("~~~~~~~~~"); print는 줄변경이 안되고 쭉~~ 이어져 나온다.

}

}

 

 

Q. compile 이란 ? 프로그래머가 작성한 소스코드를 컴퓨터가 이해할 수 있는 말(기계어)로 바꾸는 행위 (번역)

 

coding -----------------------------------------> run (JVM = Java Virtual Machine)

byte code

*.java ----------------> *.class ----------------> Hello Java !!!!

compile run

javac ClasName.java java ClassName

 

 

(설명)

소스코드를 작성하면 컴파일러는 자바 소스코드를 이용하여 클래스 파일을 생성한다.

컴파일 된 클래스 파일은 JVM이 인식할 수 있는 파일이다.

JVM은 클래스 파일의 바이너리 코드를 해석하여 프로그램을 수행한다.

 

* API 바로가기 만들기

D:\javadata\java\API\javaseAPI >> index.html (바탕화면에 바로가기 만들기)

 

1. 변수(variable) >> data type, 명명규칙, 접근제어자....... (19.10.15.)

 

2. 연산자 (operator) (19.10.16.)

 

3. 제어문 (19.10.17.~18.)

3-1. 조건문

if, if ~ else, if ~ else if ~ else (oracle case when then 이랑 비슷, 범위비교가능)

switch ~ case (oracle decode와 비슷 equal 비교만 가능)

3-2. 반복문

for

while

do ~ while

 

4. method (기능, 함수)

 

5. class (변수와 method의 집합), array (배열)

 

6. package (비슷한 기능을 갖는 class의 집합)

6-1. 사용자정의 package

6-2. system package

 

 

 

 

 

cmd 창 열기 > sqlplus 접속 > /as sysdba 입력 > alter system set deferred_segment_creation = false;

- 오라클 11g 부터는 테이블이 생성되었다 하더라도 데이터가 들어오기 전까지는 segment를 생성하지 않는다.

- 오라클 export는 segment 단위로 이루어지기 때문에 segment가 생성되어 있지 않다면 export의 대상이 되지 않는다. (row가 0인 테이블은 export 되지 않는다.)

deferred_segment_creation = true; 데이터가 들어올 때까지 segment를 생성하지 x

deferred_segment_creation = false; create 시점에 segment를 생성

업무파악 > 개념적 데이터 모델링 > 논리적 데이터 모델링 > 물리적 데이터 모델링

(표 작성) (sql 코드 작성)

ERD : Entity Relationship Diagram

UI : User Interface (사용자가 보는 화면)

(1) 식별자란 ?

identifier(식별자) : 그 대상을 제외한 누구도 해당 값을 가질 수 없는 키로 설정!! 유일값

- 하나의 Entity(table)는 반드시 하나의 유일한 식별자가 존재해야 한다.

(2) 식별, 비식별

실선 : 식별관계 - 부모 테이블의 PK가 자식테이블의 FK/PK가 되는 경우

점선 : 비식별관계 - 부모 테이블의 PK가 자식테이블의 일반속성이 되는 경우

(3) ERD

O : Optional(선택) - 0개가 될 수 있다.

| : Mandatory - 1개가 될 수 있다.

* 사원을 기준으로

한명의 사원은 반드시 하나의 부서에 소속되어야 한다.

* 부서를 기준으로

하나의 부서는 여러명의 사원으로 구성될 수 있다.

 

* 게시판 작성 시, 스크립트 꼭 만들어 놓기!!!!

중간에 잘못 됐을 때 cmd창에서 @ + 해당파일드래그 : 처음부터 다시 스크립트 돌려서 오류 수정 가능

(*sql developer에서 하지 말고, 되도록이면 cmd창에서 하기)

스크립트로 한번에 돌리면 logtime으로 정렬했을 때, 뒤죽박죽이 된다. 같은 시간이 되기 때문에 !!!!

(1) sysdate 복습

ex) 3일전, 3시간 전, 시간까지 나타내라

select sysdate, sysdate -3, to_char(sysdate - 3/24,'yy.mm.dd hh24:mi:ss')

from dual;

(2) Reboard 게시판

문1 s10 궁구미 8번글의 첫번째 답글을 다시오. (작성시간 - 2일전)

update reboard

set step = step +1

where gcode = 8 and step > 0;

insert all

into board (seq, userid, username, email, subject, content, hit, logtime, bcode)

values (BOARD_SEQ.nextval,'merry','사사사','ccc@naver.com','Re :s10 궁구미','궁구미궁구미',0,sysdate-2,4)

into reboard (rseq, seq, gcode, depth, step, pseq, reply)

values (reboard_rseq_seq.nextval,board_seq.nextval,8,1,1,8,0)

select * from dual;

update reboard

set reply = reply +1

where seq = 8;

Q. 답변 최신글이 위로 올라가게 하려면??? 1,2,3 순으로 !!!!!

1.update reboard

set step = step +1

where gcode = (원글의 gcode) and step > (원글의 step)

2.insert

3.update reboard

set reply = reply +1

where seq = (원글 seq);

문2 s10 궁구미 8번글의 두번째 답글을 다시오. (작성시간 - 1일전)

update reboard

set step = step +1

where gcode = 8 and step > 0;

insert all

into board (seq, userid, username, email, subject, content, hit, logtime, bcode)

values (BOARD_SEQ.nextval,'merry','사사사','ccc@naver.com','Re :s10 궁구미','궁구미궁구미',0,sysdate-1,4)

into reboard (rseq, seq, gcode, depth, step, pseq, reply)

values (reboard_rseq_seq.nextval,board_seq.nextval,8,1,1,8,0)

select * from dual;

update reboard

set reply = reply +1

where seq = 8;

Q. 8번(원글) - 두번째 답글 - 첫번째 답글 순으로 출력되야 함!!

select *

from board b, reboard r

where b.seq = r.seq

and gcode = 8

order by step;

문3 s10 궁구미 13번글의 첫번째 답글을 다시오. (작성시간 : 오늘)

update reboard

set step = step +1

where gcode = 13 and step > 0;

insert all

into board

values (BOARD_SEQ.nextval,'merry','사사사','ccc@naver.com','Re :s10 궁구미','궁구미궁구미',0,sysdate,4)

into reboard

values (reboard_rseq_seq.nextval,board_seq.nextval,13,1,1,13,0)

select * from dual;

update reboard

set reply = reply +1

where seq =13;

Q. 13번(원글) - 13번의 첫번째 답글 - 8번(원글) - 8번의 두번째 답글 - 8번의 첫번째 답글 순으로 출력되야 함!

select *

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by gcode desc, r.step;

문4 s10 궁구미 12번글의 첫번째 답글을 다시오. (작성시간 : 오늘)

update reboard

set step = step +1

where gcode = 8 and step > 1;

insert all

into board

values (BOARD_SEQ.nextval,'merry','사사사','ccc@naver.com','Re :s10 궁구미','궁구미궁구미',0,sysdate,4)

into reboard

values (reboard_rseq_seq.nextval,board_seq.nextval,8,2,2,12,0)

select * from dual;

update reboard

set reply = reply +1

where seq =12;

commit;

(*insert를 하기 위해서는 12번 원글의 정보를 알아야 한다!)

문5

-- page당 5개씩 출력. (변수 &pg)

-- 오늘쓴글 o : 14:25:37

-- 오늘쓴글 x : 19.10.10

-- 게시판번호 4번

(틀렸...어렵...;;)

select c.*

from (select rownum rn, a.*, decode(logtime,sysdate, to_char(logtime,'hh24:mi:ss'),to_char('YYYY/MM/DD')) as logtime

from (select *

from board b, reboard r

where b.seq = r.seq and b.bcode = 4

order by gcode desc, step) a

where rownum <=&pg*5) c

where c.rn > &pg *5-5;

(정답) CASE문으로 ~ (상대비교 가능)

1.select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step;

2.select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode,

case

when to_char(b.logtime, 'yymmdd') = to_char(sysdate, 'yymmdd')

then to_char(b.logtime, 'hh24:mi:ss')

else to_char(b.logtime, 'yy.mm.dd')

end logtime,

r.gcode, r.depth, r.step, r.pseq, r.reply

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step

(* select 뒤에 order by가 처리되기 때문에 rownum이 뒤죽박죽 된다..SELECT문으로 한 번 더 감싸서 처리!!!!)

3. select rownum rn, a.*

from (

select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode,

case

when to_char(b.logtime, 'yymmdd') = to_char(sysdate, 'yymmdd')

then to_char(b.logtime, 'hh24:mi:ss')

else to_char(b.logtime, 'yy.mm.dd')

end logtime,

r.gcode, r.depth, r.step, r.pseq, r.reply

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step

) a

where rownum <= &pg * 5

(* rownum은 크다 비교가 안되기 때문에 SELECT문으로 한 번 더 감싸서 처리!!!!)

4.select b.*

from (

select rownum rn, a.*

from (

select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode,

case

when to_char(b.logtime, 'yymmdd') = to_char(sysdate, 'yymmdd')

then to_char(b.logtime, 'hh24:mi:ss')

else to_char(b.logtime, 'yy.mm.dd')

end logtime,

r.gcode, r.depth, r.step, r.pseq, r.reply

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step

) a

where rownum <= &pg * 5

) b

where b.rn > &pg * 5 - 5;

정답) DECODE문으로 ~ (동등비교만 가능)

1.select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step;

2.select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode,

decode(to_char(b.logtime, 'yymmdd'),

to_char(sysdate, 'yymmdd'), to_char(b.logtime, 'hh24:mi:ss'),

to_char(b.logtime, 'yy.mm.dd')) logtime2,

r.gcode, r.depth, r.step, r.pseq, r.reply

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step

3. select rownum rn, a.*

from (

select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode,

decode(to_char(b.logtime, 'yymmdd'),

to_char(sysdate, 'yymmdd'), to_char(b.logtime, 'hh24:mi:ss'),

to_char(b.logtime, 'yy.mm.dd')) logtime2,

r.gcode, r.depth, r.step, r.pseq, r.reply

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step

) a

where rownum <= &pg * 5

4.select b.*

from (

select rownum rn, a.*

from (

select b.seq, b.userid, b.username, b.email, b.subject, b.content, b.hit, b.bcode,

decode(to_char(b.logtime, 'yymmdd'),

to_char(sysdate, 'yymmdd'), to_char(b.logtime, 'hh24:mi:ss'),

to_char(b.logtime, 'yy.mm.dd')) logtime2,

r.gcode, r.depth, r.step, r.pseq, r.reply

from board b, reboard r

where b.seq = r.seq

and b.bcode = 4

order by r.gcode desc, r.step

) a

where rownum <= &pg * 5

) b

where b.rn > &pg * 5 - 5;

(1) Insert all : 여러개의 테이블에서 데이터를 일괄적으로 등록하고 싶을 때 사용

(but, sequence가 생성되어 있을때는 사용할 수 없다. 하나씩 insert 해야 됨!!! )

ex) insert all

into member (userid,username,userpwd) values ('aaa','가나다',1234)

into member_detail (userid,tel1,zipcode) values ('aaa','123','14590');

(2) Comment on 주석달기 : 오라클 쿼리를 작성하다 보면 컬럼의 의미 파악이 안될 때가 있다.

이럴때, 컬럼의 의미를 쉽게 조회 할 수 있도록 사용

- Table comment 추가

comment on table 테이블명 is '설명';

ex) comment on table emp is '사원';

- Column comment 추가

comment on column 테이블명.컬럼명 is '설명';

ex) comment on column emp.empno is '사원번호';

- Table comment 삭제

comment on table 테이블명 is '';

ex) comment on table emp is '';

- Column comment 삭제

comment on column 테이블명.컬럼명 is '';

ex) comment on column emp.empno is '';

- Table commnt 확인

select *

from all_col_comments

where table_name = '테이블명';

(3) RollUp 함수 : 총 합계를 구하고자 할 때 사용 (sum, count 함수 등과 함께 사용)

: group by rollup ( ) 컬럼 순서에 따라서 결과가 달라지고,

( )를 어떻게 묶느냐에 따라서도 결과가 달라진다.

ex) 직업별로 급여 합계와 전체 급여의 합을 구하라

select job, sum(sal)

from emp

group by rollup(job);

ex) 직업, 사원번호별로 사원 수를 구하되,

직업별 사원수의 합, 전체 사원의 합을 구하라

select job, deptno, count(*)

from emp

group by rollup (job, deptno);

ex) 직업, 사원번호, 급여별로 사원 수를 구하되,

직업과 사원번호별 사원수의 합, 직업별 사원수의 합, 전체 사원의 합을 구하라

select job, deptno,sal, count(*)

from emp

group by rollup (job, deptno,sal);

* 이렇게 세세히 알기 보다, 직업별 사원수의 합만 알고 싶다면, ( )로 묶어주면 ok

select job, deptno,sal, count(*)

from emp

group by rollup (job, (deptno,sal));

(3) DB 모델링

(4) Index

(1) 문자열 인코딩 방식

Unicode (U+) : 문자열을 숫자로 표현하기 위해 문자 하나와 숫자 하나를 각각 매핑(연결)한 것

UTF-8 : 아시아 문자는 3byte로 가변 표기 (전세계 언어 모두 처리 가능)

ex) varchar2(20)는 6글자까지 처리 가능

EUC-KR : ksc5601, 아시아 문자는 2byte로 처리 (표현할 수 없는 한글이 존재)

(* 영어랑 숫자는 1byte로 처리)

(2) 데이터 타입 비교

(* 아시아 문자 입력한다고 보면,)

varchar2 4000byte 1333자 (변동사항이 있으면 안좋음, 중간에 빈 공간을 찾아 변동사항 입력 후 연결해야 함)

char 2000byte 666자 (변동사항이 있을 때 좋음, 변동사항을 입력하기 위한 공간이 있기 때문에)

(사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터 타입)

clob 4GB (주로 사용)

blob 4GB (학생증 사진,신입사원 사진 등에 사용)

long 1GB or 2GB (검색시에 성능이 떨어지기 때문에 clob을 더 선호, 잊어도 됨)

(3) 데이터베이스 설계 단계

요구사항 분석 (용도 파악) ==> 개념적 설계 (ER 다이어그램) ==> 논리적 설계 (릴레이션 스키마)

- ER 다이어그램을 테이블로 변환

-- 기본 회원 정보

create table member

( userid varchar2(16),

username varchar2(20) not null,

userpwd varchar2(20) not null,

emailid varchar2(16),

emaildomain varchar2(30),

profile varchar2(30),

joindate date default sysdate,

role number(3) default 0, (check 보다는 default값으로 설정,

처음에는 일반회원으로 가입을 시켜놓고, 추후에 등급 변경)

constraint member_userid_pk primary key(userid)

);

-- 상세 회원 정보

create table member_detail

( userid varchar2(16), (*number로 하면 010 or 02 일때, 맨 처음 0을 인식하지 못함)

tel1 varchar2(3),

tel2 varchar2(4),

tel3 varchar2(4),

zipcode varchar2(5),

address varchar2(100),

address_detail varchar2(100),

constraint member_detail_userid_fk foreign key (userid) references member (userid)

);

- 테이블 삭제 (삭제하는 순서 중요)

drop table member_detail; (참조하고 있는 테이블을 먼저 지워야 함)

drop table member; (그 이후에 참조가 되어지는 테이블을 지워야 함)

-------------------------------------------------------------------------------------------------------------------------

-- 게시판 형식

create table board_type

(btype number,

btype_name varchar2(20),

constraint board_type_btype_pk primary key(btype)

);

- 시퀀스 생성

create sequence board_type_btype_seq

increment by 1

start with 1;

-- 카테고리 목록

create table catagory_list

(ccode number,

cname varchar2(30),

constraint cataagory_list_ccode_pk primary key(ccode)

);

- 시퀀스 생성

create sequence catagory_list_ccode_seq

increment by 1

start with 1;

- 게시판 목록

create table board_list

(bcode number,

bname varchar2(30),

ccode number,

btype number,

constraint board_list_bcode_pk primary key(bcode),

constraint board_list_ccode_fk foreign key (ccode) references catagory_list (ccode),

constraint board_list_btype_fk foreign key (btype) references board_type (btype)

);

- 시퀀스 생성

create sequence board_list_bcode_seq

increment by 1

start with 1;

- 테이블 삭제 (삭제 순서 중요)

drop table board_list;

drop table board_type;

drop table category_list;

- 시퀀스 삭제 (순서 중요하지 않음)

drop sequence board_type_btype_seq;

drop sequence catagory_list_ccode_seq;

drop sequence board_list_bcode_seq;

-------------------------------------------------------------------------------------------------------------------------

-- 게시판

create table board

(seq number,

userid varchar2(16),

username varchar2(20),

email varchar2(50),

subject varchar2(100) not null,

content clob not null,

hit number default 0,

logtime date default sysdate,

bcode number,

constraint board_seq_pk primary key(seq),

constraint board_userid_fk foreign key (userid) references member (userid),

constraint board_bcode_fk foreign key(bcode) references board_list (bcode)

);

create sequence board_seq_seq

increment by 1

start with 1;

-- 댓글

create table memo

( mseq number,

seq number,

userid varchar2(16),

mcontent varchar2(200) not null,

mlogtime date default sysdate,

ipaddress varchar2(15),

constraint memo_mseq_pk primary key(mseq),

constraint memo_seq_fk foreign key (seq) references board (seq),

constraint memo_userid_fk foreign key (userid) references member (userid),

);

create sequence memo_seq_seq

increment by 1

start with 1;

-- 답변형 게시판

create table reboard

( rseq number,

seq number,

gcode number,

depth number,

step number,

pseq number,

reply number,

constraint reboard_rseq_pk primary key(rseq),

constraint reboard_seq_fk foreign key (seq) references board (seq)

);

create sequence reboard_seq_seq

increment by 1

start with 1;

- 앨범형 게시판

create table album

( aseq number,

seq number,

savefolder varchar2(8) , (*YYYY/MM/DD로 처리)

originalpicture varchar2(100),

savepicture varchar2(100),

picturemode number(1) default 0, (*정사각형을 기준으로 잡는다면 0이면 가로, 1이면 세로,

요즘엔 많이 사용 x)

constraint album_aseq_pk primary key(aseq),

constraint album_seq_fk foreign key (seq) references board (seq)

);

create sequence album_seq_seq

increment by 1

start with 1;

- 자료형 게시판

create table bbs

( bseq number,

seq number,

savefolder varchar2(8),

originalfile varchar2(100),

savefile varchar2(100),

filesize number,

constraint bbs_bseq_pk primary key(bseq),

constraint bbs_seq_fk foreign key (seq) references board (seq)

);

create sequence bbs_seq_seq

increment by 1

start with 1;

drop table memo;

drop table reboard;

drop table album;

drop table bbs;

drop table board;

drop sequence board_seq_seq ;

drop sequence memo_seq_seq;

drop sequence reboard_seq_seq;

drop sequence album_seq_seq;

drop sequence bbs_seq_seq;

-------------------------------------------------------------------------------------------------------------------------

(* 드라이브는 나눠서 사용하는 것이 좋다.)

d 드라이브 : 자료 저장만

c 드라이브 : 설치만

- 네이버에서 반디집 다운로드

- 네이버에서 에디트플러스 다운로드 에디트플러스 문서 편집기 5.2 다운로드

- 네이버에서 에버노트 다운로드

(1) TOP_N 질의 활용

문1 emp 테이블에서, 급여를 가장 많이 받는 3명을 출력하라.

select a.*

from (select *

from emp

order by sal desc) a

where rownum <=3;

문2 사원의 사번, 이름, 급여, 커미션포함급여, 부서이름, 도시를 출력하라.

-- 급여를 가장 많이 받는 순으로 정렬

-- 부서이름이 null이면 '대기발령중'으로 출력

-- 한 화면당 5명씩 출력

-- 2번째 화면의 사원번호를 출력

(틀림.... 어렵다...)

select e.empno,e.ename,e.sal,e.sal+nvl(comm,0),nvl2(dname,dname,'대기발령중'),d.loc

from emp e, dept d, (select empno,ename,sal,sal+nvl(comm,0),nvl2(dname,dname,'대기발령중'),loc

from emp natural join dept

order by 3 desc)

where e.deptno=d.deptno and rownum <= 10

order by 3 desc;

(정답 ==> 한번에 다 하려고 하지 말고, 천천히 하나하나씩 풀어가기)

( ① => ② => ③ 풀이과정 )

① select empno,ename,sal,sal+nvl(comm,0),nvl(dname,'대기발령'), d.loc

from emp e, dept d

where e.deptno = d.deptno(+) (* emp 테이블에 사원번호가 null 값이니까 출력하려면 left outer join 사용)

order by 3 desc;

select rownum, a.*

from (select empno,ename,sal,sal+nvl(comm,0),nvl(dname,'대기발령'), d.loc

from emp e, dept d

where e.deptno = d.deptno(+)

order by 3 desc) a

where rownum <= 10; (* 1번째 화면은 1등~5등 출력되니까 2번째 화면은 6등~10등까지 총 10명 출력)

cf) 출력순서

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

select b.*

from (select rownum rn, a.*

from (select empno,ename,sal,sal+nvl(comm,0),nvl(dname,'대기발령'), d.loc

from emp e, dept d

where e.deptno = d.deptno(+)

order by 3 desc) a

where rownum <= &pg*5) b (* 한 화면당 5명씩 출력)

where b.rn > &pg * 5-5; (* pg에 대한 값 입력 : 2)

(2) 치환변수 : sql문에서 '&'치환변수를 사용하면 값을 입력하도록 요구할 수 있다.

: 동일한 컬럼을 데이터만 바꿔서 검색하거나 입력하고자 할 때 사용

: 문자 or 날짜를 입력할 때는 작은따옴표(' ')를 사용

(3) RANK( ) OVER 함수 : 서브쿼리 안써도 되는!!

: rownum과 같지만 rownum은 무조건 1부터 순번을 매긴다면,

rank( )는 순위가 같을 경우 같은 순위로 처리된다.

select rank( ) over(order by sal desc) rn, ename, sal s

from emp;

select empno, sum(sal), rank() over(order by sum(sal) desc) as rank

from emp

group by empno;

(* 동점일 경우 같은 순위로 처리되기 때문에 만약 2등이 2명이라면 그 후 순위은 3등이 아닌 4등이 된다.)

이렇게 나타나는 것이 싫다면? DENSE_RANK() OVER() 함수 사용! 2명의 2등 뒤에 그 후 순위는 3등으로 출력~

select empno, sum(sal), dense_rank() over(order by sum(sal) desc) as rank

from emp

group by empno;

(* 동점일 경우라도 같은 등수로 처리되는 것이 싫다면? ROW_NUMEBER() 사용! )

select empno, sum(sal), row_number() over(order by sum(sal) desc) as rank

from emp

group by empno;

(* 전체가 아닌 부서번호별로 등수를 매기고 싶다면? rank함수 or row_number 안에 partition by 컬럼명)

select deptno,ename,job,sum(sal),rank() over(partition by deptno order by sum(sal) desc) as rank

from emp

group by deptno,ename,job;

(* 1위만 출력하고 싶다면? select문으로 한 번 더 감싸주기)

select * from

(select deptno,ename,job,sum(sal),rank() over(partition by deptno order by sum(sal) desc) as rank

from emp

group by deptno,ename,job)

where rank = 1;

(4) Entity Relationship Diagram = ERD

- 객체(Entity), 속성(Attribute), 관계(Relationship)로 구성

- 점선은 선택(may be)를 의미하고, 실선은 필수(must be)를 의미

- 양쪽을 모두 고려해야 한다. 우선, 왼쪽에서 오른쪽으로! 그후, 오른쪽에서 왼쪽 관계 따져보기!

ex) 사원과 부서 객체가 있다고 가정해보자. (M : 1 관계)

사원 입장에서 부서와의 관계 : 사원은 어느 부서든 하나의 부서에 반드시 소속되기 때문에 실선

부서 입장에서 사원과의 관계 : 신생부서일 경우 아직 사원이 없을 수도 있기 때문에 점선 or 각 부서는

여러 명의 사원을 배치

(5) PRIMARY KEY 기본키 vs FOREIGN KEY 외래키

PRIMARY KEY : UIQUE, NOT NULL

: 학번, 주민번호, 사원번호 등등

 

FOREIGN KEY : 외부 테이블의 PRIMARY KEY를 참조한다는 의미에서 외래키

: NULL값 가능

ex) EMP 테이블과 DEPT 테이블

DEPT 테이블이 부모 테이블이며, DEPTNO가 기본키

EMP 테이블이 자식 테이블이며, DEPTNO가 외래키

- 부모 테이블에 없는 값이 자식 테이블에 입력될 수 없다.

- 자식 테이블이 참조 하고 있는 값은 부모 테이블에서 삭제할 수 없다.

+ Recent posts