Web Programming/JSP2009/06/24 13:52

복사 http://blog.naver.com/mir2050/120001811295

 Struts 의 개요

1Struts

1.       Jakarta 서브 프로젝트로 개발됐습니다.

2.       Web 어플리케이션을 위한”가벼운 중량” 체제입니다.

3.       MVC 모델2의 Contoroller View의 부분을 몸체로써 제공하고 있습니다.

 

2. Struts의 목적

Java Servlet JavaServer Pages (JSP)의 기술을 이용하고 Web 어플리케이션을 구축한 데에 유용한,

오픈 소스 체제를 제공하는 것입니다.

 

3.  Struts의 주기능

1.       리퀘스트를, 어플리케이션 개발자가 제공한 적절한 Action 클래스에 할당한 컨트롤러 Servlet의 제공.

2.       JSP 커스텀·태그·라이브러리 및,대화적 폼 베이스 어플리케이션을 구축한 때에 개발자를 돕는 컨트롤러 Servlet에 있어서 통합 지원.

3.       XMLparseJava 리플렉션 API를 베이스를 둔 JavaBeans프로퍼티의 자동 설정, 메시지나 프롬프트의 국제화,등을 지원한 유틸리티 클래스의 제공.

 

4Struts의 구성요소

1.       액션,서블릿

MVC 모델2의 컨트롤러로써 작동하는,모든 HTTP 리퀘스트의 입구가 되는

컴포넌트입니다.

2.       액션·매핑

URL Struts에 있어서「액션」과의 매핑 정보를 지원하는 컴포넌트입니다.

액션·배치·파일으로부터 자동적으로 생성됩니다.

3.       액션·폼 Bean

클라이언트로부터 송신된 HTTP 리퀘스트의 폼·데이터를 격납하는 컴포넌트입니다.

 

4.       액션·클래스

비즈니스 로직을 호출하고,쓰기 위한 컴포넌트입니다.

5.        JSP

처리 결과로 된 HTTP 응답(HTML 파일)을 생성한 컴포넌트입니다.

※ Struts에 있어서「액션」이란 ...

비즈니스·로직을 실제로 처리하는 액션·클래스와 클라이언트로부터 송신된 데이터를 격납한 액션·폼 Bean

액션·클래스 실행후의 이동 정보를 나타내는 포워드 정의를 정리한 것입니다

(포워드 정의:어디로 움직일 것인가, 어느 페이지로 갈것인가의 정의)

Struts 구성 요소

5.개발자가 작성한 것

1.       액션·배치·파일

Struts에 있어서 액션의 정의를 행하는 struts-config.xml이라고 하는 XML파일입니다.

이 파일으로부터 시동시에 액션·매핑 클래스가 자동적으로 생성됩니다. 화면 이동등의 동작을 정의합니다.

<action path="/logon“ type="jp.co.argo21.ess.struts.example.action.LogonAction“ 

name="logonForm" scope="request“  validate="true“              input="/logon.jsp">

      <forward name="failure" path="/failure.jsp"/>

      <forward name="welcome" path="/orderList.do"/>

</action>

 

 

 

 

 

 

 

액션·배치·파일으로는 ,액션·폼 Bean이나 JSP의 논리명을 붙이는 일을 할 수가 있습니다.(액션·폼 Bean은 필수)

또,액션·클래스 실행후의 이동하는 곳도 코드 안에서는 설정하지 않고,이 파일의 포워드 정의를 지정합니다.

(예로는,결과가 ”welcome”의 경우,”orderList”액션에 이동한다)

이렇게 함으로써 각 컴포넌트의 유니트화가 촉진되어 집니다.

한편으로,각 컴포넌트가 약하게 결합하고 있기 때문에 ,컴파일러에 의한 체크가 각각 다르고,

실행시 에러가 발생하기 쉽다라는 문제가 있습니다.

툴에 의한 액션·배치·파일의 작성 지원이나 움직이는 곳을 메소드로 관리하는등의 수단을 검토할 필요가 있습니다.

 

2.       액션·폼 Bean

클라이언트로부터 송신된 HTTP 리퀘스트의 폼·데이터를 격납된 컴포넌트 입니다.필요에 따라서 액션 서블릿에

따라 생성됩니다. 폼·데이터의 Validation을 실행하기 위한 처리가 정의되고 있고,액션·배치·파일로 Validation

실행하도록 정의되고 있는 경우,그 처리가 액션· 서블릿에 의해서 실행해집니다.

   액션·폼 Bean은 반드시1 화면에 1개 필요해지는 것은 아니고,각 화면에서 공유한 것을 할 수 있습니다.

 

3.       액션·클래스

 비즈니스·로직을 호출하고,기술하기 위한 컴포넌트입니다.액션· 서블릿으로부터 호출됩니다.

 필요에 따라서 액션·폼 Bean으로부터 폼·데이터를 얻어내고,비즈니스·로직을 실행합니다.

 비즈니스·로직의 처리 결과를 화면에 표시한 경우는 ,액션·폼 Bean에 ,다른 액션이라고 공유하거나 한 경우는,

 상태를 보존한 스테이트 Bean을 별도 작성하고,적당한 문맥에 격납한 것이 필요해집니다.

 비즈니스·로직의 실행 후,액션·매핑에 정의된 포워드 정의의 「논리명」을 사용하고 화면 천이의 제어를 행합니다.

이것에 의해서,어디로 움직일지의 정보를 액션·클래스가 알고 있을 필요가 없어지고,화면

 이동이 변경이 된 경우에는 쉽게 보수 할 수가 있습니다.

 

 DB 조작등의 비즈니스·로직은 ,별도 Bean로 처리를 행하도록 하여, Validation이나 콘트롤러로서의 기능으로 한정하도록 설계해야 합니다.

 

4.       JSP

처리 결과로 된 HTTP 응답(HTML 파일)을 생성합니다. Struts 태그·라이브러리를 이용하고,표시를 위한 데이터를 참조하고,클라이언트에게 송신한 HTML 파일을 생성합니다.

스크립트 렛(<%~%>의 속에 java의 코드를 쓰는 것)은 가능한한 사용하지 않고,커스텀·태그로 코딩하게 해야 합니다.

 

6.유의한 점과 힌트

1.       데이터의 공유에 관하여

데이터를 여러의 비즈니스·로직으로 공유하거나 ,여러 화면에서 표시하거나 한 경우는 ,일반적으로 은 ServletContext Session이라고 한 적당한 스코프의 문맥에 격납합니다. Struts로는 ,이것 이외에도 데이터를 액션·폼 Bean의 프로퍼티에 보존한 것으로 데이터의 공유가 가능합니다.

이 방법의 이익은 ,

· 액션·폼 Bean의 인스턴스는 ,액션·클래스의 방법 perform의 인수로서 건네받기 때문에 특별한 선언 없이도 사용할 수 있다

· 액션·배치·파일의 기술만으로 ,다른 액션 클래스로부터 사용 할 수 있게 됩니다.

· 표시뿐만 아니라 입력 폼으로서 이용됩니다.

다만 ,주의해야 할 점으로서 1 액션에 대해 하나의 액션·폼 Bean밖에 이용할 수가 없다고 합니다.

이 때문에,액션·폼 Bean에 데이터를 전부 밀어 넣고 클래스를 비대화시키고 마는 위험성이 있습니다.또,데이터의 스코프가 액션·폼 Bean과 똑같이 되고 버리기 때문에 ,쓸데없은 데이터를 지원하고 유지될 가능성이 있습니다.

데이터를 어떻게 공유하는가의 지표로서는, 「어플리케이션·데이터는 ,라이프· 사이클에 따르는 적당한 스코프의 문맥에 ,스테이트 Bean으로서 보존한다.또,액션·폼 Bean은 ,액션에 대한 입력에만 사용한다.다른 액션과의 사이에서 공유하고 있는 액션·폼 Bean을 ,어플리케이션·데이터의 주고 받는것을 위해서 사용하면 안된다.」고 말할 수 있습니다.

 

2.       화면분할과 액션

Struts WEB 어플리케이션을 작성하기 위해,특히 신경을 쓰는 화면분할을 행한 필요는 없다고 생각합니다만,1 액션으로 사용할 수 있는 액션·폼 Bean은 하나이므로,이 점을 화면 설계로 유의하지 않으면 안될 것입니다.  

  또,한개의 액션으로 한개의 화면이라고 생각하면 ,한개의 화면에 대해 최저2 내지3의 컴포넌트가 필요해집니다(액션·클래스,JSP와 액션·폼 Bean).이 때문에,화면의 이동 이외에 어느 화면(액션)으로 어느 컴포넌트를 사용하고 있을까,이동시에 어떤 액션·포워드 정의를 사용하고 있는지를 설계 단계에서 명확하게 해 두는 것이 필요하게 됩니다.

 

3.       명명 규칙

Struts로는 ,대부분(거의)의 컴포넌트를 논리명으로 사용할 수 있게 되어 있습니다.그 때문에, 실제의 클래스(class)명·JSP 이름은 자유롭게 변경할 수 있습니다만 ,개발 효율의 관점에서 미리 명명 규칙을 정하고 두는 것이 중요합니다.개발 환경 규약에 규정한 것이 됩니다만 ,샘플으로는 이하의 명명 규칙을 채용했습니다.

· 액션·폼 Bean 이름=「액션 이름」+Form

· 액션 클래스(class)명=「액션 이름」+Action

· JSP 파일(file)명=「액션 이름」.jsp

또,액션 클래스의 결과인  포워드 정의는 코드에 들어가기 때문에 보수의 면에서 변경하지 않는다 것이 바람직합니다.그 때문에, 포워드 정의에 대해서도 명명 규칙을 정하고 두는 쪽이 좋을 것입니다. 또,포워드 정의는 화면 이동에 밀접하게 관계되고 있기 때문에,할 수 있으면 화면 설계의 단계에서 결정할 수 있었던 쪽이 좋을 것입니다.

 

4.       Validation의 실장 장소에 관하여

Struts Validation은 액션·폼 Bean validate 방법과 액션·클래스의 perform 방법의 2 부분으로의 실행될 것이라고 생각됩니다. 액션·폼 Bean이 화면의 입력 폼과 결부되고 있기 때문에 ,입력 데이터의 null 체크·항수 체크나 범위 체크등,이 단체(하나)로 체크가 행할 수 있는 것에 관해서는,validate 방법으로 입력 체크를 행하고, 그 밖의 예를 들면 데이터베이스에 해당한 데이터가 격납되고 있는지 아닌지의 체크등은 ,perform 방법으로 행하도록 한 것이 좋을 것입니다.

 

5.       유틸리티·클래스의 활용 Struts에는 ,커스텀·태그·라이브러리를 시작하고,

Digester」이라고 한 유틸리티·클래스(패키지)가 존재합니다. JSP를 기술한 때에 ,커스텀·태그는 강력한 툴으로 되기 때문에 이것들을 효과적에 활용한 것이 필요하다고 생각됩니다.

[출처] Struts란 |작성자 바보

저작자 표시 비영리 변경 금지
Posted by 스카이네이버
IT_BANK - Study/Oracle2009/02/26 19:00
* GROUPING SETS

query:
SELECT department_id, job_id,
             menager_id, avg(salary)
FROM    employees
GROUP BY GROUPING SETS
((department_id, job_id), (job_id,manager_id));


어느특정한것만 묶어서 grouping을 만들자
GROUP BY ROLLUP(a, (b, c), d )
이럴경우 b와 c를 그룹화 시켜버리는것이다.
즉, b와 c를 F라고 말한다면
결과를 얘기 하자면
────────────
묶은것            해석
────────────
1. a               : a
2. a, F           : a, b, c
3. a, F, d       : a, b, c, d
4. a, d           : a, d
5. F               : b, c
6. F, d           : b, c, d
7. d               : d
────────────
이런 결과가 나오는데
────────────
1. a, b
2. a, c
3. a, b, d
4. a, c, d
5. b, d
6. c, d
────────────
이그룹은 안나온다는 말이다.
무슨말인고 하니 b와 c가 따로따로 들어가는 그룹은 안나온다는 말이다.

수업중간에 들어와서리 ~_~ 두서 없이 얘기를 꺼내니깐 이상하네 TT^TT);;

* Time Zones
종류 : GMT, UTC(TimeStamp사용)

GMT는 쉽게 전세계지도를 24개로 쪼갠후
그 기준(0)을 영국으로 잡고(이것을 Greenwich라고함)  -, + 시간 계산을 한것

 - CURRENT_DATE ( 영국의 Greenwich를 기준으로 )
    : 해당 세션의 시간대의 현재 시간과 날짜
 - CURRENT_TIMESTAMP
    : 세션 시간대의 현재날짜와 소수점이하 초 단위 시간을 표시
 - LOCALTIMESTAMP
    : 세션 시간대의 현재 날짜와 시간을 TIMESTAMP데이터 유형의 값으로 표시

※ Greenwich기준으로 시간을 표시하는게 중요한것이 서버 시간의 기준을 해야 하기 때문에

query:
ALTER SESSION SET TIME_ZONE = '-5:0';
SELECT CURRENT_TIMestaMP, LOCALTIMESTAMP
FROM DUAL;

저기 -5들어간것이 우리나라가 Greenwich기준으로 +9:00시간 이므로
+9시키면 한국의 현제 시간을 출력 가능.

- EXTRACT

SELECT EXTRACT
year, month, day, hour, min등 각각 갖고 올수 있다.

query : 문자값을 TIMESTAMP값으로 변환
SELECT TO_TIMESTAMP ('2000-12-01 11:00:00',
                                        YYYY-MM-DD HH:MI:SS')
FROM DUAL;

※ 참고로 알고 가자면 DATA TYPE을 하고 있는것이다.
    알고 가자 ㅋ_ㅋ 자료"형"을 공부하고 있는것이다.
    그러니 엉뚱한 곳에 끼워 넣을라고 하지 말자.
    현제 DATA를 넣고 뺀시간등을 세계적으로 동일하게 표시하자는 생각하에 쓰는 것일뿐 더이상의 의미를 두지 말자
    전세계적으로 기준적인 시간을 두고 그 시간을 출력 해내는것이다.
    한국은 GMT +9이고 다른 나라는 그나라 만의 GMT +, - 시간일테니..
    이게 더 어렵나 ㅋ_ㅋ).. 대충 pass~

쌍비교( 이것, 저것 과 그것, 요것을 비교하는것이고)
비쌍( 비교하는 것을 2개이상 두는것 즉, 이것 저것비교하고 또, 따로 그것, 요것을 비교하는것 )

Scalar Subquerise
조건에 의해서 나온 출력 결과 중에서 임의로 정한 기준으로 order by한것
저작자 표시 비영리 변경 금지
Posted by 스카이네이버
IT_BANK - Study/Oracle2009/02/25 19:00
View의 수정은 변경이 아니다. Replace
즉 view를 지웠다가 다시 그리는것.

※ 참고( query문 )
오라클 : CREATE OR REPLACE ~~
MS SQL에서는 이렇게 쓰지 않고Alter View라고 쓴다.

Creating a Complex View
뷰의 열이름의 지정은 열이 함수나 표현식으로 부터 파생된 경우 반드시 필요

단순 뷰를 통해 DML작업(insert, update등) 수행가능 (View를 통해서 insert가 가능하다)
단, view를 통해서 볼수 있는 column에만 insert가능하다.
ex) where department id = 20
      라고 선언해놓으면 department id가 20인것만 수정이 가능. department id가 10이거나 30인
      녀석들은 수정이 불가( MS SQL에서는 가능하다. 눈에는 보이지 않지만 table에서 확인가능 )

* Sequence( MS SQL에서는 아덴티티라고함 - 자동으로 column에 지정되기 때문에 insert할수 없음
                   다만 명령어가 있는데 뭔지 모르겠;; 그걸로 강제로 한번 입력은 가능하다.
                   자동화 되있다고 보면 되고 일반적으로 insert불가 )
 - 고유 번호 자동생생
 - 공유 가능한 객체임
 - 기본키 값을 생성하여 사용
 - 응용 프로그램 코드 대체
 - 메모리에 캐시하여 엑세스 효율을 높임

 - rollback이 안되는건 기본이다 ㅡㅡ++ (insert순간에 전기가 나가거나.. os가 다운 됐거나.. 망한거지뭐..ㅋ)

오라클은 sequence라는 객체를 만들어서 쓰기 때문에 위에 설명한것처럼 공유가 가능하다.

* index
 - 포인터(주소)를 사용 하여 행 검색속도를 높이기 위해 사용
 - 데이터 위치르 ㄹ빠르게 찾는 신속한 경로엑세스 방법 디스크 I/O를 줄임
 - 인덱스는 테이블과 독립되어 존재
 - oracle server에 의해 자동으로 유지 관리 됨.


Query :
CREATE INDEX index
ON table(column[, column]...);

생성해야 할때
 - 광범위한 값이 포함된 경우( 중복된 데이터가 없다라고 보면됨 )
 - null값이 많이 포함된 경우
 - 조건절 또는 join에 자주 사용되는 열
 - 검색되는 행이 2%~4%미만인 경우

생성하지 말아야 할때
 - 조건으로 자주사용되는 않은 경우
 - 2%~4%이상을 검색하는 경우
 - 자주 갱신되는 경우
 - 인덱스화된 열이 표현식의 일부로 참조되는 경우

※ 100개중에서 2~4개의 값을 갖어 올때 쓴다. 근데 100개중에 90개를 갖고 온다고 하면 뭐니 이게~ 풀스캔하지 ㅋㅋ
※ site에 로그인을 할때 로그인의 정보는...index~ 이리 쓰면 되겠지?

지우기~
DROP INDEX index
─────────────────────────────────────────────────────────

SQL Volum.I END
─────────────────────────────────────────────────────────


─────────────────────────────────────────────────────────

SQL Volum.II START
─────────────────────────────────────────────────────────

롤이란?
사용자에게 부여할 수 있는 관련 권한을 하나로 묶어 명명한 그룹으로서 롤을 사용하면 권한
취소 및 유지 관리를 쉽게 수행 가능

ROLL (역할)

시스템 권한만 해도 120여가지나 된다.따라서 이 많은 권한들을 사용자마다 일일이 부여하기란 쉽지가 않으므로

권한들을 미리 정의해 놓은 집합을 만들어 놓고, 이 집합을 권한 대신 부여하면 능률적이다.

이때 이 권한의 집합을 ROLL 이라고 한다.



* ALTER TABLE문 : ALTER TABLE문을 사용하여 열을 추가, 수정 또는 삭제할 수 있음

ALTER TABLE dept80
ADD              (job_id VARCHAR2(9));
table altered

<ex>
alter table test1
add Constraint Constraint_name PrimaryKey(id)

alter table test2
add constraint FK_id foreign key(e_id) references test1(id)

alter table test2
add constraint imp_dt_fk foreign key (department_id) references departments on delete cascade
<ex/>

* 테이블 삭제
 - 테이블의 모든 데이터 및 구조를 삭제
 - 보류 중인 트랜잭션을 모두 커밋
 - 인덱스를 모두 삭제
 - DROP TABLE문은 롤백할 수 없음.

Query :
DROP TABLE dept80;
table dropped
저작자 표시 비영리 변경 금지
Posted by 스카이네이버
IT_BANK - Study/Oracle2009/02/17 17:21
* NULLVALUE( NVL )
  - null값을 다른 값을 대처하여 정수처리

* COALESCE 함수
  - COALSECE 함수는 목록에서 null이 아닌 첫번째 표현식을 반환함.
  - null이 아닌값을 반환. (null이 아닌 값을 만나면 반환)
    # COALESCE ( expr1, expr2, expr3... exprn )
       expr1 = null, expr2 = true, expr..
       이럴경우 expr2값을 반환 - true를 반환.
       expr3은 신경도 안쓰고 expr2값을 반환하고 끝~
    # select coalesec(  exp1, expr2, expr3... exprn )
       expr1 = true, expr2 = true, expr..
       expr1값을 반환하고 끝~
    # SELECT last_name,
      COALESCE( commission_pct, salary, 10) comm

      FROM employees
      ORDER bY commission_pct;
      : commission_pct와 salary값이 null이면 정수 10을 반환.

조건 표현식
SQL문 안에서 IF-THEN-ELSE 논리를 사용할 수 있도록 해줌
두 가지 방법을 사용 (CASE, DECODE)

* DECODE는 CASE함수에서 WHEN과 THEN이 없는 것이다.
   그리고 ","가 있으며, sele가 빠져있음.


4장 : 그룹함수

GROUP BY절을 사용하면 HAVING절을 사용

그룹 함수 : 행 집합에 작용하여 그룹에서 하나의 결과를 생성
종류 : AVG, COUNT, MAX, MIN, STDDEV(표준편차), SUM, VARIANCE(분산)

SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)
FROM employees
WHeRE job_id LIKE '%REP%';

※ 여기서 중요한것은 avg는 null갑이 있어선 안되겠다. 이럴때 nvl을 쓰면 되겠찌 ^ㅡ^)? ㅋㅋ
avg(NVL(salary, 0 )) 요로코롬 하면 되것지용 뇨뇨 (~'ㅡ')~

해석 : AVG(salary) : salary컬럼의 평균
         , MAX(salary) : salary컬럼의 최대값
         , MIN(salary) : salary컬럼의 최소값
         , SUM(salary) : salary컬럼의 합계( 이녀석은 null포함되도 상관없겠지 ^^? )

* MIN, MAX함수는 모든 데이터 유형에 대해 사용 할 수 있음.
  - 문자(문자열의 가장 긴값, 작은값), 숫자(정수로 큰값, 작은값), 날짜(최근의 날짜, 최초의 날짜)등
     data의 모든형에 사용가능.

* AVG, SUM, VARIANCE, STDDEV함수는 ONLY 숫자 데이터 유형에서만 사용 가능.( 날짜는 숫자와 다르다는것을 알자 )

* data종류 : 문자, 숫자, 날짜(날짜 같은 경우는 문자로도 가능하지만 숫자로는 절대 하지 않는다!! 하면 안.된.다.)
  - 예로 99년 12월 01일 이라고 하면 DDMMYY라고 했을때... 앞에 01?? 말이돼? 돼? 숫자 표현에 있어서 가장 앞자리가
     0이 나온다니 ㅡㅡ 어쩔꺼야? 어쩔꺼야? ㅋㅋㅋ 고로 안쓴다.!!

* COUNT : 테이블의 행 수를 반환, null을 포함하지 않는다.(null을 포함하지 않는다는건 컬럼명을 넣을경우 생략가능)
                (null을 포함한다면.. 한 행이 전부 null값이여야지.. 그럼 존재하나 마나인 값인거지)


SELECT COUNT(*)
FROM emplyees
WHERE department_id = 50;

  - 3가지 형식
    # COUNT(*) : 데이터의 총 행의 갯수.. 고로 null값을처리 못함 NOTNULL인것이다.
    # COUNT(expr): 컬럼의 null은 생략가능
      : expr에 대해 null이 아닌 값의 수를 반환.
    # COUNT(DISTINCT expr) : expr에 대해 중복되지 않는 null이 아닌 값의 수를 반환.(null을 보함하지 않고 중복되지 않은)


* GROUP BY : 테이블 행을 그룹으로 나눈 후 그룹 함수를 사용하여 각 그룹에 대한 요약 정보를 반환
  - where 절을 사용하면 그룹으로 나누기 전에 행을 제외시킬 수 있음.
  - group by 절에 열을 포함시켜야함( 열을 포함시키지 않을경우 출력값은? 출력할게 없는데 뭘 출력해.. ㅋㅋ )
  - group by 절에 열 별칭을 사용할 수 있음.
  - 9i : 기본적으로행은 group by 목록에 포함된 열의 오름차순으로 정렬되는는 order by 절을 사용하면 이 순서 무시
     10g : 9i에서는 자동 오름차순 정렬이 되지만 10g에서는 order by로 정렬을 해줘야 한다.
  - select 목록의 열 중 그룹 함수에 없는 열은 모두 group by 절에 포함되어야 한다.

SELECT department_id, AVG(salary)
FROM deployees
GROUP BY department_id;

여기서 department_id는 여러개가 나오지만 avg(salary)부분은 한행만 나오겠지? 그럼? 바로 Error빵빵~ 터지는 거지
고로 GROUP BY department_id;

  - GROUP By열을 SElECT 목록에 포함시키지 않아도 됨.

SELECT AVG(salary)
FROM employees
GROUP BY department_id;

  - 여러 열을 기준으로 그룹화가능.

SELECT department_id dept_id, job_id, SUM(salary)
FROM employees
GROUP By department_id, job_id

해석 : department_id를 갖고 먼저 그룹화 시킨후
         그 그룹속에서 job_id를 갖고 그룹화를 시킨다.( 큰 그룹안에 작은 그룹을 만드는 것 )
         department_id내에 job_id가 2종류가 있다면
         출력결과물은 2행이 되겠다.(결과물을 보여주기 힘들어서 참;; 설명이 난해함..TT^TT)

  - 잘못된 질의

SELECT department_id, COUNT(last_name)
FROM employees;

해석 : department_id의 결과값은 행만큼 나오지만(다수) COUNT(last_name)의 결과물은 하나이기 때문에
         뒤에 GRUOP BY department_id를 넣어주어야 한다. 위에 설명한거~


SELECT department_id, AVG(salary)
FROM employees;
WHERE AVG(salary) > 8000 // 이행을 사용하지 않고 HAVING을 사용( HAVING avg(salary) > 8000 )
GROUP BY department_id;

해석 : WHERE가 시작되면서 싱글 그룹이 하나 더 생겨버린다.

  - HAVING절 사용

SELECT department_id, MAX(salary)
FROM employees
GRUOP By department_id
HAVING MAX(salary) > 10000;

해석 :department_id를 그룹을 만들고 한 그룹에서의 최대값을 뽑아놓은 값에서 10000이 넘는 값을 출력.

SELECT job_id, SUM(salary) PAYROLL // 여기의 SUM(salary)를 3차처리
FROM employees
WHERE job_id NOT LIKE '%REP%' // 1차 처리
GROUP By job_id // 그리고 2차 처리
HAVING SUM(salary) > 13000 // 그리고 4차 처리
ORDER By SUM(salary);

  - 그룹 함수 중첩

최고 평균 급여를 표시
SELECT MAX(AVG(salary)) // 부서별 평균이 1차 출력 그 출력결과에 따라서 MAX값을 출력
FROM employess
GROUP BY department_id;

※ GROUP BY가 있을경우 그다음에 ORDER BY(정렬)가 와야 한다.
    정렬한후가 아니라 GROUP BY한후에 정렬하는 것이다.


5장 : JOIN

 ■ 등가 조인 및 비등가 조인을 사용하여 여러 테이블의 데이터를 액세스하는 SELECT문 작성
 ■ 포괄 조인을 사용하여 일반적으로 조인 조건을 만족하지 않는 데이터 보기
 ■ 자체 조인을 사용하여 테이블 자체 조인
 ■ 여러테이블에서 데이터 얻기

 * 카티시안 곱(Cartesian Product)
  - 다음경우에 생성됨

    # 조인 조건을 생략한 경우

    # 조인 조건이 부적합한 경우

    # 첫번째 테이블의 모든 행이 두번째 테이블의 모든 행에 조인된 경우

      ( 즉, 1번 테이블 행수(30개) * 2번테이블 행수(80개) = 2400개의 행이 출력 )

    # 카티시안 곱이 생성되지 않도록 하려면 WHERE절에 항상 유효한 조인 조건을 포함시킬것


 - 오라클 구문의 사용하여 테이블 조인

SELECT table1.column, table2,column
FROM table1, table2
WHERE table1.column1 = table2.column2; // 두테이블의 column값이 같은것
 ※ 컬럼명이 다르다면 위처럼 table명을적고 "."을 통해서 명명해주는데 서로 컬럼값이 같더라도 table명을 일반적으로 작성

  - 테이블 별칭 사용

    # 테이블 별칭을 사용하여 질의를
단순화
    # 테이블 접두어를 사용하여 성능을 개선


  - 비등가 조인으로 레코드 검색

  - 포괄 조인 구문
    # 포괄 조인을 사용하여 조인 조건을 만족하지 않는 행도 볼수 있음
    # 포괄 조인 연산자는 더하기 기호(+) 임

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
저작자 표시 비영리 변경 금지
Posted by 스카이네이버