[하위질의(SubQuery)]

: 하나의 쿼리에 다른 쿼리가 포함되는 구조, ()로처리

 

1) 단일행 서브쿼리(단일행반환) :  > , < , >=, <= , <>

     Main Query

         Sub  Query      ----->   1 개결과

 

2) 다중행 서브쿼리(여러행반환) : in, any, all

     Main Query

          Sub Query      ----->   여러개의 결과

     

       < any : 비교대상중 최대값보다 작음

       > any : 비교대상중 최소값보다 큼  

                  (ex. 과장직급의 급여를 받는 사원조회)

       =  any : in연산자와 동일

       <  all   : 비교대상중 최소값보다 작음

       >  all   : 비교대상중 최대값보다 큼

                  (ex. 모든과장들의 직급보다 급여가 많은 사원조회)

 

 

3) 상관쿼리(correlated  subquery)  

  : 메인쿼리에서 고려된 각 후보 행들에 대해 서브쿼리가 다른 결과를 반환해야하는경우

    (메인쿼리에서 처리되는 각 행들의 값에 따라 응답이 달라져야하는 경우)에 유용하다

      exists,  not exists : 존재 여부에 따라 true,false을 반환

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

        

 

 

ex1) Neena사원의 부서명을 알아내시오

select department_id from employees where first_name='Neena';

select department_name from departments where department_id=90;

 

select department_name from departments

where department_id = (select department_id

from employees

where first_name='Neena');

 

ex2) Neena사원의 부서에서 Neena사원보다 급여를 많이 받는 사원들을 구하시오

                          (90)          (17000)

 

last_name    department_id    salary

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

select last_name, department_id, salary

from employees

where department_id = (select department_id

from employees

where first_name='Neena')

and

salary > (select salary from employees where first_name='Neena');

 

[문제1] 최저급여를 받는 사원들의 이름과 급여를 구하시오

 

[문제2] 부서별 급여 합계 중 최대급여를 받는 부서의 부서명과 급여합계를 구하시오(group by)

DEPARTMENT_NAME    SUM(SALARY)

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

Sales                     304500

 

ex3) Austin과 같은 부서이면서 같은 급여를 받는 사원들의

      이름, 부서명, 급여를 구하시오(60부서, 4800달러)

select last_name, department_name, salary

from employees

left join departments using(department_id)

where department_id = (select department_id

from employees

where last_name='Austin')

and

salary = (select salary from employees where last_name='Austin');

 

ex4) 'ST_MAN' 직급보다 급여가 많은 'IT_PROG' 직급 직원들을 조회하시오

last_name   job_id   salary

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

select last_name, job_id, salary

from employees

where job_id = 'IT_PROG'

and

salary >any(select salary from employees where job_id='ST_MAN');

 

 

[문제3] 'IT_PROG' 직급 중 가장 많이 받는 사원의 급여보다 더 많은 급여를 받는 'FI_ACCOUNT' 또는 'SA_REP' 직급 직원들을 조회하시오

      조건1) 급여 순으로 내림차순 정렬하시오

      조건2) 급여는 세자리 마다 콤마(,) 찍고 화폐단위 '원’을 붙이시오

      조건3) 타이틀은 사원명, 업무ID, 급여로 표시하시오

 

사원명    업무ID    급여

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

             :

ex5) 'IT_PROG'와 같은 급여를 받는 사원들의 이름,업무ID,급여를 전부 구하시오

select last_name, job_id, salary

from employees

where salary in(select salary from employees where job_id='IT_PROG');

 

ex6) 전체직원에 대한 관리자와 직원을 구분하는 표시를 하시오(in, not in이용)

사원번호      이름       구분

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

100          King      관리자

 

방법1(in 연산자)

select employee_id as 사원번호, last_name as 이름,

case

    when employee_id in(select manager_id from employees)

        then '관리자'

        else '직원'

    end as 구분

from employees

order by 3,1;

 

★ 방법2(union, in, not in 연산자)

select employee_id as 사원번호, last_name as 이름, '관리자' as 구분

from employees

where employee_id in(select manager_id from employees)

union

select employee_id 사원번호, last_name 이름, '직원' as 구분

from employees

where employee_id not in(select manager_id from employees where manager_id is not null)

order by 3,1;

★ 방법3(상관쿼리이용)

-- 메인쿼리 한행을 읽고 해당값을 서브쿼리에서 참조하여 서브쿼리결과에 존재하면 true를 반환

 

select employee_id as 사원번호, last_name as 이름, '관리자' as 구분

from employees e

where exists(select null from employees where e.employee_id=manager_id)

union

select employee_id as 사원번호, last_name as 이름, '직원' as 구분

from employees e

where not exists(select null from employees where e.employee_id=manager_id)

order by 3,1;

 

[문제4] 자기 업무id(job_id)의 평균급여를 받는 직원들을 조회하시오

      조건1) 평균급여는 100단위 이하 절삭

급여는 세자리마다 콤마, $표시

      조건2) 사원이름(last_name), 업무id(job_id), 직무(job_title), 급여(salary) 로 표시하시오

      조건3) 급여순으로 오름차순 정렬하시오

 

ex7) group by rollup : a,b별 집계(Subtotal 구하기)

부서별, 직무ID별 급여평균구하기(동일부서에 대한 직무별 평균급여)

조건1) 반올림해서 소수 2째자리까지 구하시오

조건2) 제목은 Job_title, Department_name, Avg_sal로 표시하시오

select department_name, job_title, round(avg(salary), 2) as "Avg_sal"

from employees

join departments using(department_id)

join jobs using(job_id)

group by rollup(department_name, job_title);

 

ex8) group by cube :  a별 집계 또는 b별 집계

부서별, 직무ID별 급여평균구하기(부서를 기준으로 나타내는 평균급여)   

select department_name, job_title, round(avg(salary), 2) as "Avg_sal"

from employees

join departments using(department_id)

join jobs using(job_id)

group by cube(department_name, job_title);

 

ex9) group by grouping sets

직무별 평균급여와 전체사원의 평균급여를 함께 구하시오

select job_title, round(avg(salary), 2) as "Avg_sal"

from employees

join departments using(department_id)

join jobs using(job_id)

group by grouping sets((job_title),()); ← () All Rows의 역활

 

 

 

'JAVA 개발 공부 정보' 카테고리의 다른 글

SQL-수업4  (0) 2018.03.23
SQL-수업자료3  (0) 2018.03.20
SQL 연습  (0) 2018.03.15
Chapter04-스프링JDBC  (0) 2018.03.15
Oracle-SQL  (0) 2018.03.14

[SET operator]-집합연산자

두개 이상의 쿼리결과를 하나로 결합시키는 연산자

 

1. UNION      : 양쪽쿼리를 모두 포함(중복 결과는 1번만 포함) 합집합

2. UNION ALL  : 양쪽쿼리를 모두 포함(중복 결과도 모두 포함)

3. INTERSECT  : 양쪽쿼리 결과에 모두 포함되는 행만 표현 교집합

4. MINUS      : 쿼리1결과에 포함되고 쿼리2결과에는 포함되지 않는 행만 표현 차집합

 

오라클의 집합연산자(SET operator) UNION, INTERSECT, MINUSorder by 한다

→ 컬럼이 많으면 order by 하므로 느려진다. 수가 작은 튜플로 가공 후 사용하는게 좋다

→ UNION ALL 는 order by 하지 않고 무조건 합해준다

   order by를 하려면 두번째 쿼리에 작성해야 한다

 

 

create table employees_role as select * from employees where 1=0; ← 테이블 구조만 복사

 

select * from employees_role;

 

insert into employees_role values(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',

'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);

insert into employees_role values(101, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',

'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);

insert into employees_role values(101, 'Nee', 'Ko', 'NKOCHHAR', '515.123.4568',

'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);

 

insert into employees_role values(200, 'Neena', 'Kochhar', 'NKOCHHAR', '515.123.4568',

'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);

insert into employees_role values(200, 'Nee', 'Kochhar', 'NKOCHHAR', '515.123.4568',

'1989-09-21', 'AD_VP', 17000.00, NULL, 100, 90);

insert into employees_role values(300, 'GilDong', 'Conan', 'CONAN', '010-123-4567',

'2009-03-01', 'IT_PROG', 23000.00, NULL, 100, 90);

 

ex1) union

employee_id, last_name 같을 경우 중복제거 하시오  110 레코드

select employee_id, last_name from employees

union

select employee_id, last_name from employees_role;

 

ex2) union all

employee_id, last_name 같을경우 중복을 허용 하시오 113 레코드

select employee_id, last_name from employees

union all

select employee_id, last_name from employees_role;

 

select salary  from employees where department_id=10

union all

select salary  from employees where department_id=30 order by 1;

 

ex3) minus

employees_role 중복되는 레코드는 제거하고 employees에만 있는 사원명단을 구하시오 (, employee_id, last_name 표시) 106 레코드

 

select employee_id, last_name from employees

minus

select employee_id, last_name from employees_role;

 

ex4) intersect

     employees employees_role에서 중복되는 레코드의 사원명단을 구하시오

     (, employee_id, last_name 표시)   1 레코드

select employee_id, last_name from employees

intersect

select employee_id, last_name from employees_role;

 

[문제1] employees와 employees_role에서 레코드의 사원명단을 구하시오

조건1) 사원이름, 업무ID, 부서ID을 표시하시오

조건2) employees 에서는 부서ID가 10인사원만

       employees_role에서는 업무ID가 IT_PROG만 검색

조건3) 중복되는 레코드는 제거

 

 

ex5) SET operator과 IN operator관계

job_title이   'Stock Manager' 또는  'Programmer'인 사원들의 사원명과 job_title을 표시하시오

 

last_name       job_title

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

Kaufling        StockManager

Hunlod         Programmer

           :

 

 

 

방법1(join, in연산자 이용)

select last_name, job_title

from employees

join jobs using(job_id)

where job_title in('Stock Manager','Programmer');

 

방법2(join, union 이용)

select last_name, job_title

from employees

join jobs using(job_id)

where job_title='Stock Manager'

union

select last_name, job_title

from employees

join jobs using(job_id)

where job_title='Programmer'

order by 2;

 

ex9) 컬럼명이 다른경우의 SET operator

쿼리1과 쿼리2의 select 목록은 반드시동일(컬럼갯수,데이터타입)해야 하므로 이를 위해 Dummy Column을 사용할수 있다

 

select last_name, employee_id, hire_date

from employees

where department_id=20

union

select department_name, department_id, NULL

from departments

where department_id=20;

 

 

'JAVA 개발 공부 정보' 카테고리의 다른 글

SQL-수업5  (1) 2018.03.24
SQL-수업자료3  (0) 2018.03.20
SQL 연습  (0) 2018.03.15
Chapter04-스프링JDBC  (0) 2018.03.15
Oracle-SQL  (0) 2018.03.14

※ select (해석순서 1 → 2 → 3 → 4 → 5)

 

select [distinct] [컬럼1,컬럼2,.....][as 별명][ || 연산자][*]  --- 6

from 테이블명     --- 1

[where 조건절]    --- 2

[group by컬럼명]  --- 3

[having 조건절]   --- 4

[order by 컬럼명 asc|desc ]  --- 5

 

group by : 그룹함수(max,min,sum,avg,count..)와 같이 사용

having : 묶어놓은 그룹의 조건절

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

ex1) 사원테이블에서 급여의 평균을 구하시오

     조건)소수이하는 절삭, 세자리마다 콤마(,)

 

     사원급여평균

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

            6,461

select to_char(trunc(avg(salary),0), '99,999') as 사원급여평균 from employees;

 

ex2)부서별 급여평균을 구하시오

    조건1) 소수이하는 반올림

    조건2) 세자리마다콤마, 화페단위 \를 표시

    조건3)  부서코드        평균급여

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

                 10               \8,600

    조건4) 부서별로 오름차순정렬하시오

    조건5) 평균급여가 5000이상인 부서만 표시하시오

 

select department_id as 부서코드,

        to_char(round(avg(salary),0),'L99,999,999') as 평균급여

from employees

group by department_id    

having avg(salary)>=5000

order by department_id asc;

 

ex3) 부서별 급여평균을 구해서 사원명(last_name),부서별 급여평균을 출력하시오 - X

select last_name, avg(salary)

from employees

group by department_id;

last_name 때문에 error

group by절에 없는것을 select에 조회하면 error

 

[문제1] 업무ID별 급여의 합계를 구해서 업무ID, 급여합계를 출력하시오

 

ex4) 비효율적인 having절

10과 20 부서에서 최대급여를 받는사람의 최대급여를 구하여 정렬하시오

 

department_id     max_salary

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

 10                     4400

 20                    13000

 

select department_id, max(salary) as max_salary

from employees

group by department_id

having department_id in(10,20)

order by department_id;

전체 부서에 대해 그룹을 잡아서 최대급여를 구한후에 부서가 10 과 20인것을 추려내기 때문인것

 

 

select department_id, max(salary) as max_salary

from employees

where department_id in(10,20)

group by department_id

order by department_id;

부서번호가 10과 20인 것만 골라내서 그룹잡기 때문에 속도가 좀 빠르다

 

 

조인(join)

EMPLOYEES           DEPARTMENTS            JOIN

                                               

            +                  =              

                                               

                                               

 

 

※ 종류

1. Inner join : 같은것 끼리만 연결

2. Outer join : 한쪽을 기준(모두포함)해서 연결

                left  join : 왼쪽컬럼 모두포함

                right join : 오른쪽컬러 모두포함

3. full join : 왼쪽,오른쪽 모두 포함

4. self join : 자기자신 테이블과 연결

5. cross join : 모든 경우의 수로 연결

6. non equijoin : 범위에 속하는지 여부를 확인

7. n개 테이블 조인 : 여러개의 테이블 조인

 

※ 방법

1. 오라클 구문전용

2. Ansi 표준구문

 

ex5) inner join : 같은것끼리만 조인

사원테이블과 부서테이블에서 부서가 같을 경우 사원번호, 부서번호, 부서이름을 출력하시오

 

방법1(오라클전용구문)

select  employee_id,

        employees.department_id,

        department_name

from employees, departments

where employees.department_id = departments.department_id;  

 

방법2(오라클전용구문)

select  e.employee_id,

        e.department_id,

        d.department_name

from employees e, departments d

where e.department_id = d.department_id;

 

방법3(Ansi표준)

select employee_id, department_id, department_name

from employees

join departments using(department_id);

 

[문제2] 부서테이블(DEPARTMENTS d) 위치테이블(LOCATIONS l) 연결하여          부서가 위치한 도시를 알아내시오

 

department_id     city

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

10                Seattle

 

 

 

 

 

ex6) outer join(left) : 왼쪽 테이블은 모두 포함하여 조인

사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 107레코드

 

방법1(오라클전용구문)

select e.last_name, d.department_id, d.department_name

from employees e, departments d

where e.department_id=d.department_id(+);

 

방법2(Ansi표준)

select last_name, department_id, department_name

from employees

left join departments using(department_id);

 

ex7) outer join(right) : 오른쪽 테이블은 모두포함하여 조인

사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 122레코드

 

방법1(오라클전용구문)

select e.last_name, d.department_id, d.department_name

from employees e, departments d

where e.department_id(+)=d.department_id;

 

방법2(Ansi표준)

select last_name, department_id, department_name

from employees

right join departments using(department_id);

 

ex8) full join(right) : 왼쪽,오른쪽 테이블을 모두 포함하여 조인

사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 123레코드

 

--방법1(오라클전용구문) : 없다

--방법2(Ansi표준)

select last_name, department_id, department_name

from employees

full join departments using(department_id);

 

ex9) inner join : 두개의 컬럼이 일치 하는 경우

        부서ID와 매니저ID가  같은 사원을 연결 하시오

       (관련테이블 : departments, employees)  : 32 레코드

 

        last_name     department_id   manager_id

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

 

방법1(오라클전용구문)

select e.last_name, d.department_id, d.manager_id

from employees e, departments d

where e.department_id=d.department_id and e.manager_id=d.manager_id;

 

방법2(Ansi표준)

select last_name, department_id, manager_id

from employees

inner join departments using(department_id, manager_id);

 

ex10) 내용은 같은데 컬럼명이 다른 경우에 조인으로 연결하기

       departments(location_id) , locations2(loc_id)

 

테이블 복사

create table locations2 as select * from locations;

select * from locations2;

alter table locations2 rename column location_id to loc_id;

 

방법1(오라클전용구문)

select d.department_id, l.city

from departments d, locations2 l

where d.location_id=l.loc_id;

 

방법2(Ansi표준)

select department_id, city

from departments

join locations2 on(location_id=loc_id);

 

방법3(Ansi표준)

select department_id, city

from departments  d

join locations2  l  on(d.location_id=l.loc_id);

 

ex11) self 조인 : 자기자신의 테이블과 조인하는경우 사원과 관리자를 연결하시오

 

사원번호   사원이름      관리자

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

   101      Kochhar      King  

 

    EMPLOYEES                       EMPLOYEES

employee_id, last_name(사원이름)     last_name(관리자)

조건  employee_id = manager_id

 

select employee_id,manager_id, last_name from employees;  → e

select employee_id, last_name from employees; m

 

방법1

select  e.employee_id as 사원번호,

e.last_name as 사원이름,

m.last_name as 관리자

from employees e, employees m

where m.employee_id=e.manager_id;

 

방법2

select  e.employee_id as 사원번호,

e.last_name as 사원이름,

m.last_name as 관리자

from employees e

join employees m on(m.employee_id=e.manager_id); 

 

ex12) cross join : 모든행에 대해 가능한 모든조합을 생성하는 조인

select * from countries, locations; 575레코드

 

select * from countries cross join locations;

 

ex13) Non Equijoin (넌 이큐조인)

컬럼값이 같은 경우가 아닌 범위에 속하는지 여부를 확인 할 때

on ( 컬럼명 between 컬럼명1 and 컬럼명2)

 

create table salgrade(

salvel varchar2(2),

lowst number,

highst number); 

 

insert into salgrade values('A', 20000, 29999);

insert into salgrade values('B', 10000, 19999);

insert into salgrade values('C', 0, 9999);

commit;

 

select * from salgrade;

 

select last_name, salary, salvel

from employees

join salgrade on(salary between lowst and highst)

order by salary desc;

 

ex14) n(여러)개의 테이블은 조인

업무ID 같은 사원들의 사원이름, 업무내용, 부서이름을 출력하시오

(EMPLOYEES, JOBS, DEPARTMENTS 테이블을 조인)

 

<분석>

EMPLOYEES        JOBS      DEPARTMENTS

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

department_id      job_id      department_id

job_id

<출력>

last_name      job_title       department_name

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

select last_name, job_title, department_name

from employees

join departments using(department_id)

join jobs using(job_id);

 

[문제3] 위치ID, 부서ID를 연결해서 사원이름,도시,부서이름을 출력하시오

        (관련테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS)

조건1 : 사원이름, 도시, 부서이름로 제목을 표시하시오   

조건2 : Seattle 또는 Oxford 에서 근무하는 사원

조건3 : 도시순으로 오름차순정렬하시오

 

사원이름               부서이름

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

Hall            Oxford       Sales

 

[문제4] 부서ID, 위치ID, 국가ID를 연결해서 다음과 같이 완성하시오

        (관련테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS, COUNTRIES)

조건1 : 사원번호,사원이름,부서이름,도시,도시주소,나라명로 제목을 표시하시오

조건2 : 도시주소에  Ch 또는 Sh 또는 Rd가 포함되어 있는 데이터만 표시하시오

조건3 : 나라명, 도시별로 오름차순 정렬하시오

조건4 : 모든 사원을 포함한다

 

※ select (해석순서 1 → 2 → 3 → 4 → 5)

 

select [distinct] [컬럼1,컬럼2,.....][as 별명][ || 연산자][*]  --- 6

from 테이블명     --- 1

[where 조건절]    --- 2

[group by컬럼명]  --- 3

[having 조건절]   --- 4

[order by 컬럼명 asc|desc ]  --- 5

 

group by : 그룹함수(max,min,sum,avg,count..)와 같이 사용

having : 묶어놓은 그룹의 조건절

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

ex1) 사원테이블에서 급여의 평균을 구하시오

     조건)소수이하는 절삭, 세자리마다 콤마(,)

 

     사원급여평균

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

            6,461

select to_char(trunc(avg(salary),0), '99,999') as 사원급여평균 from employees;

 

ex2)부서별 급여평균을 구하시오

    조건1) 소수이하는 반올림

    조건2) 세자리마다콤마, 화페단위 \를 표시

    조건3)  부서코드        평균급여

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

                 10               \8,600

    조건4) 부서별로 오름차순정렬하시오

    조건5) 평균급여가 5000이상인 부서만 표시하시오

 

select department_id as 부서코드,

        to_char(round(avg(salary),0),'L99,999,999') as 평균급여

from employees

group by department_id    

having avg(salary)>=5000

order by department_id asc;

 

ex3) 부서별 급여평균을 구해서 사원명(last_name),부서별 급여평균을 출력하시오 - X

select last_name, avg(salary)

from employees

group by department_id;

last_name 때문에 error

group by절에 없는것을 select에 조회하면 error

 

[문제1] 업무ID별 급여의 합계를 구해서 업무ID, 급여합계를 출력하시오

 

ex4) 비효율적인 having절

10과 20 부서에서 최대급여를 받는사람의 최대급여를 구하여 정렬하시오

 

department_id     max_salary

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

 10                     4400

 20                    13000

 

select department_id, max(salary) as max_salary

from employees

group by department_id

having department_id in(10,20)

order by department_id;

전체 부서에 대해 그룹을 잡아서 최대급여를 구한후에 부서가 10 과 20인것을 추려내기 때문인것

 

 

select department_id, max(salary) as max_salary

from employees

where department_id in(10,20)

group by department_id

order by department_id;

부서번호가 10과 20인 것만 골라내서 그룹잡기 때문에 속도가 좀 빠르다

 

 

조인(join)

EMPLOYEES           DEPARTMENTS            JOIN

                                               

            +                  =              

                                               

                                               

 

 

※ 종류

1. Inner join : 같은것 끼리만 연결

2. Outer join : 한쪽을 기준(모두포함)해서 연결

                left  join : 왼쪽컬럼 모두포함

                right join : 오른쪽컬러 모두포함

3. full join : 왼쪽,오른쪽 모두 포함

4. self join : 자기자신 테이블과 연결

5. cross join : 모든 경우의 수로 연결

6. non equijoin : 범위에 속하는지 여부를 확인

7. n개 테이블 조인 : 여러개의 테이블 조인

 

※ 방법

1. 오라클 구문전용

2. Ansi 표준구문

 

ex5) inner join : 같은것끼리만 조인

사원테이블과 부서테이블에서 부서가 같을 경우 사원번호, 부서번호, 부서이름을 출력하시오

 

방법1(오라클전용구문)

select  employee_id,

        employees.department_id,

        department_name

from employees, departments

where employees.department_id = departments.department_id;  

 

방법2(오라클전용구문)

select  e.employee_id,

        e.department_id,

        d.department_name

from employees e, departments d

where e.department_id = d.department_id;

 

방법3(Ansi표준)

select employee_id, department_id, department_name

from employees

join departments using(department_id);

 

[문제2] 부서테이블(DEPARTMENTS d) 위치테이블(LOCATIONS l) 연결하여          부서가 위치한 도시를 알아내시오

 

department_id     city

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

10                Seattle

 

 

 

 

 

ex6) outer join(left) : 왼쪽 테이블은 모두 포함하여 조인

사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 107레코드

 

방법1(오라클전용구문)

select e.last_name, d.department_id, d.department_name

from employees e, departments d

where e.department_id=d.department_id(+);

 

방법2(Ansi표준)

select last_name, department_id, department_name

from employees

left join departments using(department_id);

 

ex7) outer join(right) : 오른쪽 테이블은 모두포함하여 조인

사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 122레코드

 

방법1(오라클전용구문)

select e.last_name, d.department_id, d.department_name

from employees e, departments d

where e.department_id(+)=d.department_id;

 

방법2(Ansi표준)

select last_name, department_id, department_name

from employees

right join departments using(department_id);

 

ex8) full join(right) : 왼쪽,오른쪽 테이블을 모두 포함하여 조인

사원테이블과 부서테이블에서 부서번호가 같은 사원을 조인하시오 123레코드

 

--방법1(오라클전용구문) : 없다

--방법2(Ansi표준)

select last_name, department_id, department_name

from employees

full join departments using(department_id);

 

ex9) inner join : 두개의 컬럼이 일치 하는 경우

        부서ID와 매니저ID가  같은 사원을 연결 하시오

       (관련테이블 : departments, employees)  : 32 레코드

 

        last_name     department_id   manager_id

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

 

방법1(오라클전용구문)

select e.last_name, d.department_id, d.manager_id

from employees e, departments d

where e.department_id=d.department_id and e.manager_id=d.manager_id;

 

방법2(Ansi표준)

select last_name, department_id, manager_id

from employees

inner join departments using(department_id, manager_id);

 

ex10) 내용은 같은데 컬럼명이 다른 경우에 조인으로 연결하기

       departments(location_id) , locations2(loc_id)

 

테이블 복사

create table locations2 as select * from locations;

select * from locations2;

alter table locations2 rename column location_id to loc_id;

 

방법1(오라클전용구문)

select d.department_id, l.city

from departments d, locations2 l

where d.location_id=l.loc_id;

 

방법2(Ansi표준)

select department_id, city

from departments

join locations2 on(location_id=loc_id);

 

방법3(Ansi표준)

select department_id, city

from departments  d

join locations2  l  on(d.location_id=l.loc_id);

 

ex11) self 조인 : 자기자신의 테이블과 조인하는경우 사원과 관리자를 연결하시오

 

사원번호   사원이름      관리자

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

   101      Kochhar      King  

 

    EMPLOYEES                       EMPLOYEES

employee_id, last_name(사원이름)     last_name(관리자)

조건  employee_id = manager_id

 

select employee_id,manager_id, last_name from employees;  → e

select employee_id, last_name from employees; m

 

방법1

select  e.employee_id as 사원번호,

e.last_name as 사원이름,

m.last_name as 관리자

from employees e, employees m

where m.employee_id=e.manager_id;

 

방법2

select  e.employee_id as 사원번호,

e.last_name as 사원이름,

m.last_name as 관리자

from employees e

join employees m on(m.employee_id=e.manager_id); 

 

ex12) cross join : 모든행에 대해 가능한 모든조합을 생성하는 조인

select * from countries, locations; 575레코드

 

select * from countries cross join locations;

 

ex13) Non Equijoin (넌 이큐조인)

컬럼값이 같은 경우가 아닌 범위에 속하는지 여부를 확인 할 때

on ( 컬럼명 between 컬럼명1 and 컬럼명2)

 

create table salgrade(

salvel varchar2(2),

lowst number,

highst number); 

 

insert into salgrade values('A', 20000, 29999);

insert into salgrade values('B', 10000, 19999);

insert into salgrade values('C', 0, 9999);

commit;

 

select * from salgrade;

 

select last_name, salary, salvel

from employees

join salgrade on(salary between lowst and highst)

order by salary desc;

 

ex14) n(여러)개의 테이블은 조인

업무ID 같은 사원들의 사원이름, 업무내용, 부서이름을 출력하시오

(EMPLOYEES, JOBS, DEPARTMENTS 테이블을 조인)

 

<분석>

EMPLOYEES        JOBS      DEPARTMENTS

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

department_id      job_id      department_id

job_id

<출력>

last_name      job_title       department_name

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

select last_name, job_title, department_name

from employees

join departments using(department_id)

join jobs using(job_id);

 

[문제3] 위치ID, 부서ID를 연결해서 사원이름,도시,부서이름을 출력하시오

        (관련테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS)

조건1 : 사원이름, 도시, 부서이름로 제목을 표시하시오   

조건2 : Seattle 또는 Oxford 에서 근무하는 사원

조건3 : 도시순으로 오름차순정렬하시오

 

사원이름               부서이름

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

Hall            Oxford       Sales

 

[문제4] 부서ID, 위치ID, 국가ID를 연결해서 다음과 같이 완성하시오

        (관련테이블 : EMPLOYEES, LOCATIONS2, DEPARTMENTS, COUNTRIES)

조건1 : 사원번호,사원이름,부서이름,도시,도시주소,나라명로 제목을 표시하시오

조건2 : 도시주소에  Ch 또는 Sh 또는 Rd가 포함되어 있는 데이터만 표시하시오

조건3 : 나라명, 도시별로 오름차순 정렬하시오

조건4 : 모든 사원을 포함한다

 

 

'JAVA 개발 공부 정보' 카테고리의 다른 글

SQL-수업5  (1) 2018.03.24
SQL-수업4  (0) 2018.03.23
SQL 연습  (0) 2018.03.15
Chapter04-스프링JDBC  (0) 2018.03.15
Oracle-SQL  (0) 2018.03.14

myBatis
ORM(Object Relational Mapping) 프레임워크는 데이터베이스와 객체와의 관계를 맵핑시켜 퍼시스턴스 로직 처리를 도와주는 프레임워크이다.
대표적으로 iBatishibernate가 있다
 
myBatisSQL쿼리문, 예외처리, 트랙잭션 관리들을 XML형식으로 관리한다
POJO(Plain Old Java Object)객체와 테이블의 컬럼들을 편리하고 빠르고 정확하게 매칭할 수 있다.
 
myBatis의 목표와 특징은 쉽고, 간단하고, 의존성이 적다는 것이다
SQL문과 자바코드를 분리함으로 인해 자바 개발자는 쿼리문을 신경 쓰지 않아도 된다.
 
myBatis는 자바오브젝트와 SQL문 사이의 자동매핑 기능을 지원하는 ORM 프레임워크이다
자바코드와 SQL를 분리하므로서 SQL문의 변경이 있을때마다 자바를 수정하지 않아도 되고 컴파일을 하지 않아도 된다
 
http://blog.mybatis.org
 
Java Project : myBatisTest
Package : user.main
Class : UserMain.java (public static void main(~~~))
Package : user.action
Interface : UserAction.java
Class : UserInsertAction.java
UserSelectAction.java
UserUpdateAction.java
UserDeleteAction.java
Package : user.dao
UserDAO.java
userMapper.xml
src : mybatis-config.xml
 
테이블 작성
 
create table usertable(
name varchar2(30) not null,
id varchar2(30) primary key,
pwd varchar2(30) not null);
 

'JAVA 개발 공부 정보' 카테고리의 다른 글

Chapter04-스프링JDBC  (0) 2018.03.15
Oracle-SQL  (0) 2018.03.14
mvnrepository  (0) 2018.03.14
Git hub! 깃허브 회원가입! 링크!  (0) 2018.03.14
JAVA-SQL  (0) 2018.03.14

http://mvnrepository.com/

spring context 검색

<!-- Spring -->
  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.10.RELEASE</version>
  </dependency>


spring-webmvc 검색


<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId> 요.


    <artifactId>spring-webmvc</artifactId>
    <version>4.3.10.RELEASE</version>
</dependency>


 jstl 검색

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

디펜던시 오류시 프로젝트 우클릭 import - install~~~ - 정보 입력
프로젝트 클린 - pom.xml 복사 붙여넣기 ->> 끝!


'JAVA 개발 공부 정보' 카테고리의 다른 글

Oracle-SQL  (0) 2018.03.14
JAVA-myBatis  (0) 2018.03.14
Git hub! 깃허브 회원가입! 링크!  (0) 2018.03.14
JAVA-SQL  (0) 2018.03.14
[JAVA] JSON - Jackson Databind  (0) 2018.02.26

★ SQL문

1. 데이타 조작어(DML : Data Manipulation Language)

    : insert, update, delete, merge

2. 데이타 정의어(DDL : Data Definition Language)

    : create, alter, drop, rename, truncate    

3. 데이타검색

    : select 

4. 트랜젝션제어

    : commit, rollback, savepoint

5. 데이타 제어어(DCL : Data Control Language)

    : grant,  revoke



※ select

[형식]

 select [distinct] [컬럼1,컬럼2,.....][as 별명][ || 연산자][*]

 from 테이블명

 [where 조건절] 


distinct : 중복제거

* : 모든

조건절 : and,or,like,in,between and,is null,is not null



ex1) employees테이블의 모든 사원의 사원번호,이름(last_name),급여 검색

select employee_id, last_name, salary from employees;


ex2)별명붙이기(as는 생략가능)

    employees테이블의 모든 사원의 사원번호,이름(last_name),급여 검색

    조건) title 사원번호, 이름 ,급여로 출력할것

select employee_id as 사원번호 , last_name as "이  름", salary as "급  여" 

from employees;



ex3) employee테이블에서 사원번호,이름,연봉을 구하시오

     조건1) 연봉 = 급여 * 12

     조건2) 제목을 사원번호, 이름, 연봉으로 출력

select employee_id as 사원번호 , last_name as "이  름", salary*12 as "연  봉"

from employees;


ex4) 연결연산자( || ) : 컬럼을 연결해서 출력

     frist_name과  last_name을 연결해서 출력하시오

       이   름

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

     Ellen   Abel

select  first_name||'  '||last_name  as  "이  름" from employees;



[문제1] 다음처럼 출력하시오

   사원번호    이  름        연 봉

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

    100      Steven King   288000달러 


[문제2]다음처럼 출력하시오 (last_name, job_id)

     Employee  Detail

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

     King  is  a  SA_REP

     King  is  a  AD_PRES



ex5) distinct(중복제거)

     employees 테이블에서 부서ID를 출력하시오

select distinct department_id from employees;


ex6) 10번부서 또는 90번부서 사원들의 이름, 입사일, 부서ID를 출력하시오

select last_name, hire_date, department_id

from employees

where department_id=10  or  department_id=90;


ex7) 급여가 2500이상 3500미만인 사원의 이름(last), 입사일, 급여를 검색하시오

select last_name, hire_date, salary

from employees

where salary>=2500  and  salary<3500;



[문제3] 급여가 2500이하 이거나 3000이상이면서 90번 부서인 

사원의 이름, 급여, 부서ID를 출력하시오.

조건1) 제목은 사원명, 월  급, 부서코드로 하시오

조건2) 급여앞에 $를 붙이시오

조건3) 사원명은 first_name과 last_name을 연결해서 출력하시오

ex8) 'King'사원의 모든 컬럼을 표시하시오

select  *  from employees  where  last_name='King';

→ 문자열 검색할 때는 대,소문자를 구분


like  : 문자를 포함

'%d' - d로 끝나는

      'a%' - a로 시작하는

      '%test% - test가 포함되어있는


      '_a%'  - 두번째 글자가 a로 시작하고 나머지는 무시

      '__a%' - 세번째 글자가 a로 시작하고 나머지는 무시


ex9) 업무ID에 MAN이 포함되어있는 사원들의 이름,업무ID,부서ID를 출력하시오

select last_name, job_id, department_id

from employees

where job_id like '%MAN%';


ex10) 업무ID가  IT로 시작하는 사원들의 이름, 업무ID, 부서ID를 출력하시오

select last_name, job_id, department_id

from employees

where job_id like 'IT%';


ex11) is null / is not null 

커미션을 받는 사원들의 이름과 급여, 커미션을 출력하시오

select last_name, salary, commission_pct

from employees

where commission_pct is not null;

커미션을 받지 않는 사원들의 이름과 급여, 커미션을 출력하시오

select last_name, salary, commission_pct

from employees

where commission_pct is null;


ex12) in연산자(or연산자의 다른표현)

업무ID가  FI_MGR이거나  FI_ACCOUNT인 사원들의 사원번호,이름,직무를 출력하시오

select employee_id, last_name, job_id

from employees

where job_id='FI_MGR' or job_id='FI_ACCOUNT';



select employee_id, last_name, job_id

from employees

where job_id in('FI_MGR', 'FI_ACCOUNT');


ex13) between연산자(and연산자의 다른 표현) : 초과,미만에서는 사용할수 없다

급여가  10000이상  20000이하인 사원의 사원번호,이름,급여를 출력하시오

select employee_id, last_name, salary

from employees

where salary>=10000 and salary<=20000;


select employee_id, last_name, salary

from employees

where salary between 10000 and 20000;



[문제4] 업무ID가 'SA_REP' 이거나 'AD_PRES' 이면서 급여가 10000를 

초과하는 사원들의 이름,업무ID,급여를 출력하시오


이름        업무ID            급  여

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

King       AD_PRES            24000원



[문제5] Employees테이블의 업무ID가 중복되지 않게 표시하는 질의를 작성하시오


  JOB_ID

-----------

AC_ACCOUNT

AC_MGR

     :



[문제6] 입사일이 2005년인 사원들의 사원번호, 이름, 입사일을 표시하시오



http://mvnrepository.com/search?q=json+databind

Jackson Databind

다운로드 또는 복사

POM.XML ====== 아래 붙여넣고 저장

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
</dependency>

WebContent - WEB-INF - mvc-config.xml ======= 안에 아래 빈 추가 후 저장

<!-- JsonView -->

<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" id="jsonView">
<property value="text/html;charset=UTF-8" name="contentType"/>

</bean>

 

<bean id="beanNameResolver"
class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0"/>
</bean>

\\\\\\\\\\\\\\\\\\\\\\\\\\

 

 <c:forEach var="userDTO" items="${list}">
  <tr>
   <td>${userDTO.name }</td>
   <td>${userDTO.id }</td>
   <td>${userDTO.pwd }</td>
  </tr>
 </c:forEach>

 

ㄴ 삭제하여 스크립트에서 생성

 

/////////////////////////////////////////

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
 $.ajax({
  type :"POST",
  url : "/Chapter06_DynamicSpringMaven/user/userSelectList.do",
  //없음 data : {"id":$('#id').val()},//{변수명:값},//넘겨야할 데이터
  dataType : "json",      
  success : function(data){
   //list:[{"name":"코난","id":"conan","pwd":"111"},{},{}]
  //alert(JSON.stringify(data));
  
  $.each(data.list, function(index,items){
   $('<tr/>').append($('<td/>',{
    align: "center",
    text : items.name
   })).append($('<td/>'),{
    align: "center",
    text : items.id
   }).append($('<td/>'),{
    align: "center",
    text : items.pwd
   }).appendTo($('#userListTable'));
  });
  
  
  }
 
 });
 
});

 

</script>

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<style type="text/css">
#menu:link {color: black; text-decoration: none;}
#menu:visited {color: blue; text-decoration: none;}
#menu:hover {color: green; text-decoration: underline;}
#menu:active {color: gray; text-decoration: none;}


</style>


</head>
<body>
*** 메인화면 ***<br>
<a href="/Chapter06_DynamicSpringMaven/user/userInsertForm.do" id="menu">1. 입력 </a><br>
<a href="/Chapter06_DynamicSpringMaven/user/userSelect.do" id="menu">2. 출력 </a><br>
<a href="/Chapter06_DynamicSpringMaven/user/userUpdateInput.do" id="menu">3. 수정 </a><br>
<a href="/Chapter06_DynamicSpringMaven/user/userDeleteInput.do" id="menu">4. 삭제 </a>

 

</body>
</html>

 

/////////////////////////////////////////

 

package com.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bean.UserDTO;
import com.dao.UserDAO;

 


//@Controller
@RequestMapping("/user")
@Component
public class UserControlloer {
 @Autowired
 private UserDAO userDAO;
 
 //http://localhost:9090/Chapter06_DynamicSpringMaven/main/index.do
 @RequestMapping(value="/index.do", method = RequestMethod.GET)  // get방식
 public String index() {
  return "/main/index";
 }
 
 
 @RequestMapping(value="/userInsertForm.do", method = RequestMethod.GET)  // get방식
 public String userInsertForm() {
  return "/user/userInsertForm";
 }
 
 @RequestMapping(value="/userInsert.do", method = RequestMethod.POST)  // post방식
 public String userInsert(@ModelAttribute UserDTO userDTO) {
  // DB
  userDAO.userInsert(userDTO);
  return "/user/userInsert";
 }
 
 
 @RequestMapping(value="/userSelect.do", method = RequestMethod.GET)  // get방식
 public String userSelect(Model model) {
  //DB
  List<UserDTO> list = userDAO.getUserList();
  model.addAttribute("list",list);
  return "/user/userSelect";
 }
 
 @RequestMapping(value="/userUpdateInput.do", method = RequestMethod.GET)  // get방식
 public String userUpdateInput() {
  return "/user/userUpdateInput";
 }
 
 
 @RequestMapping(value="/userUpdateForm.do", method = RequestMethod.GET)  // get방식
 public String userUpdateForm(@RequestParam String id, Model model) {
  //DB
  UserDTO userDTO = userDAO.getUser(id);
  
  model.addAttribute("userDTO", userDTO);
  return "/user/userUpdateForm";
 }
 
 @RequestMapping(value="/userUpdate.do", method = RequestMethod.POST)  //
 public String userUpdate(@ModelAttribute UserDTO userDTO) {
  userDAO.userUpdate(userDTO);
  return "/user/userUpdate";
 }
 
 
 @RequestMapping(value="/userDeleteInput.do", method = RequestMethod.GET)  // get방식
 public String userDeleteInput() {
  return "/user/userDeleteInput";
 }
 
 
 
 @RequestMapping(value="/userDelete.do", method = RequestMethod.GET)  //
 public String userDelete(@RequestParam String id) {
  userDAO.userDelete(id);
  return "/user/userDelete";
 }
 
 @RequestMapping(value="/checkId.do", method = RequestMethod.POST)  //
 public @ResponseBody String checkId(@RequestParam String id) {
  if(id.equals(""))
   return "empty";
  
  //DB
  
  UserDTO userDTO = userDAO.getUser(id);
  if(userDTO==null) return "non_exist";
  else return "exist";
  
  


 }
 
 

}
////////////////////////////////////

 

package com.dao;

 

import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.bean.UserDTO;

@Component
@Transactional
public class UserDAOMybatis implements UserDAO {
 @Autowired
 private SqlSession sqlSession;

 @Override
 public void userInsert(UserDTO userDTO) {
  sqlSession.insert("userSQL.userInsert",userDTO);
  
 }
 @Override
 public List<UserDTO> getUserList() {
  return sqlSession.selectList("userSQL.getUserList");
 }

 

 @Override
 public UserDTO getUser(String id) {
  return sqlSession.selectOne("userSQL.getUser", id);
 }

 @Override
 public void userUpdate(UserDTO userDTO) {
  sqlSession.update("userSQL.userUpdate",userDTO);
 }

 @Override
 public void userDelete(String id) {
  sqlSession.delete("userSQL.userDelete",id);
  
 }

 

 

}

 

 

 

 

 

 

 

 

javascript 라이브러리 중 가장 많이 사용되는 jQuery

 

jQuery 다운로드

 jQuery는 javascript 라이브러리이기 때문에 프로젝트 내에서 호출하여 사용해야 한다.

제이쿼리를 사용하기 위해서는 크게 2가지 방법이 있다.

 jQuery 라이브러리를 다운로드하여 사용하거나 CDN(Content Delivery Network)을 이용하여 링크를 걸어서 사용하는 방법이다.

 

<script type="text/javascript">
$()     ->> $제이쿼리 표시 // ${} ->> EL임 헷갈리지말기!!

=====================================

<script type="text/javascript">
function checkUser(){
 if(document.userInsertForm.name.value=="")
  alert("이름을 입력하세요");
 else if(document.userInsertForm.id.value=="")
  alert("아이디를 입력하세요");
 else if(document.userInsertForm.pwd.value=="")
  alert("비밀번호를 입력하세요");
 else
  document.userInsertForm.submit();
}

</script>

 

 ================================위에 내용을 아래로 바꾸기

 </script><script type="text/javascript" src="http://code.jquery.com/jquery-3.2.1.min.js"></script>   // 기본 기능만있는 주소임
<script type="text/javascript">
$(document).ready(function(){});

</script>

=========================================================

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
 if($('#name').val()=='')
  $('#nameDiv').text("이름입력").css("color","red").css("font-size","8pt");
 if($('#id').val()=='')
  $('#idDiv').text("아이디입력").css("color","black").css("font-size","8pt");
 if($('#pwd').val()=='')
  $('#pwdDiv').text("비번입력").css("color","black").css("font-size","8pt");
});

 

</script>


</head>
<body>
<form name="userInsertForm" action="/Chapter06_DynamicSpringMaven/user/userInsert.do" method="POST">


<table border="1" cellpadding="3" cellspacing="0">
<tr>
<td align="center"> 이름</td>
<td><input type="text" id="name" ><br>
<div id="nameDiv" ></div>
</td>
</tr>

<tr>
<td align="center"> 아이디</td>
<td><input type="text" id="id"><br>
<div id="idDiv" ></div></td>
</tr>
<tr>
<td align="center"> 비밀번호</td>
<td><input type="password" id="pwd"><br>
<div id="pwdDiv" ></div></td>
</tr>

<tr>
<td align="center"> <input type="button" value="등록" > <input type=reset value="취소" > </td>
</tr>
</table>
</form>

</body>
</html>

================================ 글씨 입력시 히든처리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>

<script type="text/javascript" src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
 if($('#name').val()=='')
  $('#nameDiv').text("이름입력").css("color","red").css("font-size","8pt");
 if($('#id').val()=='')
  $('#idDiv').text("아이디입력").css("color","black").css("font-size","8pt");
 if($('#pwd').val()=='')
  $('#pwdDiv').text("비번입력").css("color","black").css("font-size","8pt");
 
    $('#name').keyup(function(){
     if($(this).val().length==0)
      $('#nameDiv').text("이름입력").css("color","red").css("font-size","8pt");
     else
      $('#nameDiv').text("");
    });
   
    $('#id').keyup(function(){
     if($(this).val().length==0)
      $('#idDiv').text("아이디입력").css("color","red").css("font-size","8pt");
     else
      $('#idDiv').text("");
    });
  
    $('#pwd').keyup(function(){
     if($(this).val().length==0)
      $('#pwdDiv').text("비번입력").css("color","red").css("font-size","8pt");
     else
      $('#pwdDiv').text("");
    });

});

</script>


</head>
<body>
<form name="userInsertForm" action="/Chapter06_DynamicSpringMaven/user/userInsert.do" method="POST">


<table border="1" cellpadding="3" cellspacing="0">
<tr>
<td align="center"> 이름</td>
<td><input type="text" id="name" ><br>
<div id="nameDiv" ></div>
</td>
</tr>

<tr>
<td align="center"> 아이디</td>
<td><input type="text" id="id"><br>
<div id="idDiv" ></div></td>
</tr>
<tr>
<td align="center"> 비밀번호</td>
<td><input type="password" id="pwd"><br>
<div id="pwdDiv" ></div></td>
</tr>

<tr>
<td colspan=2 align="center"> <input type="button" value="등록" > <input type=reset value="취소" > </td>
</tr>
</table>
</form>

</body>
</html>

 

======================= 중복체크 추가

 

# 루트 WAC(Web Application Context) 등록
  스프링 Application의 애플리케이션 컨텍스트에는 두가지가 있다.
 
  1. ContextLoaderListener가 생성하는 Root WAC : 웹환경과 독립적인 빈 등록
      디폴트 설정 파일 /WEB-INF/applicationContext.xml 으로 설정된다
      서비스계층과 데이터 액세스 계층을 포함해서 웹환경과 직접 관련이 없는 모든 빈들을 여기에 등록한다
 
 → 만약에 사용할 이름이 다르거나 설정파일이 여러개인 경우
      contextConfigLocation 파라미터를 추가해서 설정해주면 된다

<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>/WEB-INF/config/application-config.xml</param-value>
 </context-param>
     

  2. DispatcherServlet이 생성하는 WAC : DispatcherServlet이 직접 사용하는 컨트롤러를 포함한 웹 관련 빈을 등록
      디폴트 설정 파일 /WEB-INF/서블릿이름-servlet.xml으로 설정된다
  
  → 만약에 사용할 이름이 다르거나 설정파일이 여러개인 경우
      contextConfigLocation 파라미터를 추가해서 설정해주면 된다

<servlet>
 <servlet-name>dispatcher</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcher-config.xml</param-value>
   </init-param>
</servlet>
<servlet-mapping>
   <servlet-name>dispatcher</servlet-name>
   <url-pattern>*.do</url-pattern>
</servlet-mapping>    

+ Recent posts