desc dept
dname varchar2(14) //<-- char로 전환
alter table dept modify (dname char(14));

select concat(dname, deptno) from dept;

alter table dept modify (dname varchar2(14));

varchar2 //가변형
ex) 민번, 우편번호
char //고정형
ex) 급여, 수당, 설명


select count(*), count(empno), count(comm) from emp;

select count(comm), sum(comm), avg(comm), count(*), avg(NVL(comm,0)) from emp;

select min(ename), max(ename) from emp;

select sum(sal), avg(sal), stddev(sal), variance(sal) from emp;

select deptno, max(sal), min(sal) from emp group by deptno;

select job, avg(sal, max(sal), min(sal) from emp group by job;


select stddev(100*sal/(select max(sal) from emp)) from emp;

select deptno, job, sum(sal), count(*) from emp group by deptno, job;
//그룹함수를 사용한 select문에 나오는 컬럼은 group by의 조건문에 나와야 한다.

select deptno, avg(sal), sum(sal) from emp group by deptno having avg(sal)>=2500;
//급여평균 2500 이상 부서번호, 급여평균, 합계

select job, count(*) from emp group by job having count(*)>=4;
//업무인원이 4명이상인 업무와 쪽수

select job, max(sal), min(sal) from emp where deptno in (10, 20) group by  job having max(sal)>=2000 order by max(sal);
//부서가 10 20 이고 최대 급여가 2000 이상인 업무별 최대 최소 급여
//그룹함수조건이 아닌경우 where절에 기술!!!!!

select 'smith중 i는 '||instr('smith','i')||'번째에 있습니다.' from dual;

select deptno, ename, sal, decode(deptno,10,sal*1.1,20,sal*1.2,30,sal) "Sal Up" from emp;

select deptno, ename, job, case when sal>=2500 then 1200 when sal>=1500 then 1000 else 1500 end Bouns from emp;
//급여 1500이상 1000 , 2500 이상 1200 , 그외 1500
//주의 순서 바꾸지 말것
select ename, case when sal>=2500 then 1200 when sal>=1500 then 1000 else 1500 end Bouns1, case when sal>=1500 then 1000 when sal>=2500 then 1200 else 1500 end Bouns2 from emp;

select ename, case when sal<1000 then '거지' when sal<2000 then '서민' when sal<3000 then '중산층' else '갑부' end from emp;




select
case when sal<1000 then '거지'
when a.sal<2000 then '서민'
when a.sal<3000 then '중산층'
else '갑부' end living
from emp;




select ename, LEVEL, empno, mgr from emp START WITH mgr is NULL CONNECT BY PRIOR empno=mgr;
//LEVEL을 이용해 조직도를 나타냄


select deptno, to_char(hiredate,'yy'), avg(sal) from emp group by deptno, to_char(hiredate,'yy') not having to_char(hiredate,'yy')='82';

select avg(sal), max(sal), min(sal) from emp group by job having lower(job)=lower('salesman');

select count(empno) "C_INWON", count(comm) "C_COMM", avg(comm) "A_COMM", 3 "N_COMM", count(deptno) "C_DEPT", 3 "C_DIS" from emp;
//N????

select deptno, avg(sal), min(sal), max(sal), sum(sal) from emp group by deptno;

select deptno, count(empno), avg(sal), min(sal), max(sal), sum(sal) from emp group by deptno order by sum(sal) desc;

select count(empno), min(sal), max(sal), sum(sal) from emp group by deptno order by sum(sal) desc;

select deptno, job, count(empno), avg(sal), sum(sal) from emp group by deptno, job;

select deptno, job, count(empno), avg(sal), sum(sal) from emp group by job, deptno;

select deptno, count(empno), sum(sal) from emp group by deptno having count(empno)>4;

select deptno, avg(sal), sum(sal) from emp group by deptno having max(sal)>2900;

select job, avg(sal), sum(sal) from emp group by job having avg(sal)>=3000;

select job, sum(sal) "PAYROLL" from emp where not job='SALESMAN' group by job having sum(sal)>5000 order by sum(sal) desc;

select max(avg(sal)), max(sum(sal)), min(min(sal)), max(max(sal)) from emp group by deptno;


1. EMP 테이블에서 모든 SALESMAN에 대하여 급여의  평균, 최고액, 최저액, 합계를 구하여 출력하라.
select avg(sal), max(sal), min(sal), sum(sal) from emp where job='SALESMAN';
2. EMP 테이블의 이름의 오름차순 정렬상 첫번째에 위치하는 이름, 마지막에 위치하는 이름을 구하고, 입사일의 가장 오래된 사람, 가장 최근에 입사한 사람을 구하고 최대 급여와 최소 급여를 구하여라.
select min(ename), max(ename), min(hiredate), max(hiredate), max(sal), min(sal) from emp;
3. EMP 테이블에 등록되어 있는 인원수, 보너스에 NULL이 아닌 인원수, 보너스의 평균, 등록 되어있는 부서의 수를 구하여 출력하라.
select sum(count(*)), sum(count(comm)), sum(avg(comm)), count(count(deptno)) from emp group by deptno;
4. 부서별로 인원수, 평균급여, 최저급여, 최고급여를 구하여라.
select count(*), avg(sal), min(sal), max(sal) from emp group by deptno;
5. 4번 문제를 급여의 합이 많은 순서로 출력하라.
select count(*), avg(sal), min(sal), max(sal) from emp group by deptno order by sum(sal);
6. 부서별로 그룹지어 부서번호, 인원수, 급여의 평균, 급여의 편차, 급여의 분산을 구하여라.
select deptno, count(*), avg(sal), stddev(sal), variance(sal) from emp group by deptno;
7. 업무별, 부서별로 그룹하여 결과를 부서번호, 업무, 인원수, 급여의 평균, 급여의 편차, 급여의 합을 출력하라.
select deptno, job, count(*), avg(sal), stddev(sal), sum(sal) from emp group by deptno,job;
8. EMP테이블에서 부서인원이 4명 이상인 부서의 부서번호, 인원수, 급여의 합을 출력하라.
select deptno, count(*), sum(sal) from emp group by deptno having count(*)>=4 ;
9. EMP 테이블에서 업무가 PRESIDENT가 아닌 업무의 부서별 급여의 합계와 평균을 구하라.
select deptno, sum(sal), avg(sal) from emp where job!='PRESIDENT' group by deptno;
10. EMP 테이블에서 급여가 2900 이상인 부서에 대하여 부서번호, 평균급여, 최대급여, 최소급여를 구하여라.
select deptno, avg(sal), max(sal), min(sal) from emp group by deptno having avg(sal)>=2900;
11. EMP 테이블에서 전체 급여가 5000을 초과하는 각 업무에 대해 업무와 급여 합계를 출력하라. 단, SALESMAN은 제외하고 급여 합계를 내림차순으로 정렬하라.
select job, sum(sal) from emp where lower(job)!=lower('SALESMAN') group by job having sum(sal)>5000;
12. 부서별 평균 중 최대 평균 급여, 부서별 급여의 합 중 최대 급여, 부서별 급여의 최소 급여,  부서별 급여의 최대 급여를 출력하라.
select max(avg(sal)), max(sum(sal)), min(min(sal)), max(max(sal)) from emp group by deptno;
13.다음의 결과를 작성하는 SELECT문을 작성하라.
select to_char(hiredate,'YY') as "H_YEAR", count(*), min(sal), max(sal), avg(sal), sum(sal) from emp group by to_char(hiredate,'YY');
14.아래의 급여의 합계를 출력하는 SELECT 문장을 작성하라.
select job, decode(deptno,10,sum(sal),20,NULL,30,NULL) "DEPTNO 10", decode(deptno,10,NULL,20,sum(sal),30,NULL) "DEPTNO 20", decode(deptno,10,NULL,20,NULL,30,sum(sal)) "DEPTNO 30", sum(sal) "TOTAL" from emp group by job, deptno;
//분리 되어 출력
select job, decode(deptno,10,sum(sal),20,NULL,30,NULL) "DEPTNO 10", decode(deptno,10,NULL,20,sum(sal),30,NULL) "DEPTNO 20", decode(deptno,10,NULL,20,NULL,30,sum(sal)) "DEPTNO 30", sum(sal) "TOTAL" from emp group by job;
//출력불가
select job, sum(sal*(deptno-20)*(deptno-30)/200) "DEPTNO 10", sum(sal*(deptno-10)*(deptno-30)/(-100)) "DEPTNO 20", sum(sal*(deptno-10)*(deptno-20)/200) "DEPTNO 30", sum(sal) "TOTAL" from emp group by job;
//먼가 부족
select job, sum(decode(deptno,10,sal,20,0,30,0)) "DEPT 10", sum(decode(deptno,10,0,20,sal,30,0)) "DEPT 20", sum(decode(deptno,10,0,20,0,30,sal)) "DEPT 30", sum(sal) "TOTAL"  from emp group by  job;
//좀더 쉬운 풀이**

15. 아래의 인원수의 합계를 출력하는 SELECT 문장을 작성하라.
select to_char(hiredate,'YYYY'), count(*) "TOTAL" from emp group by rollup(to_char(hiredate,'YYYY'));
//이건 원하시는 답이 아닐듯
select count(*) "TOTAL",
count(NULLIF(to_char(hiredate,'YYYY'), '1981')*NULLIF(to_char(hiredate,'YYYY'), '1982')*NULLIF(to_char(hiredate,'YYYY'), '1987')*1) "1980",
count(NULLIF(to_char(hiredate,'YYYY'), '1980')*NULLIF(to_char(hiredate,'YYYY'), '1982')*NULLIF(to_char(hiredate,'YYYY'), '1987')*1) "1981",
count(NULLIF(to_char(hiredate,'YYYY'), '1980')*NULLIF(to_char(hiredate,'YYYY'), '1981')*NULLIF(to_char(hiredate,'YYYY'), '1987')*1) "1982",
count(NULLIF(to_char(hiredate,'YYYY'), '1980')*NULLIF(to_char(hiredate,'YYYY'), '1981')*NULLIF(to_char(hiredate,'YYYY'), '1982')*1) "1987" from emp;
//돌려 풀기
select sum(count(*)) "TOTAL", sum(decode(to_char(hiredate,'YYYY'),1980,count(*),1981,NULL,1982,NULL,1987,NULL)) "1980",
sum(decode(to_char(hiredate,'YYYY'),1980,NULL,1981,count(*),1982,NULL,1987,NULL)) "1981",
sum(decode(to_char(hiredate,'YYYY'),1980,NULL,1981,NULL,1982,count(*),1987,NULL)) "1982",
sum(decode(to_char(hiredate,'YYYY'),1980,NULL,1981,NULL,1982,NULL,1987,count(*))) "1987"
from emp group by to_char(hiredate,'YYYY');
//억지완성
select count(*), count(decode(to_char(hiredate,'yy'),'80',job)) "1980", count(decode(to_char(hiredate,'yy'),'81',job)) "1981", count(decode(to_char(hiredate,'yy'),'82',job)) "1982", count(decode(to_char(hiredate,'yy'),'87',job)) "1987" from emp;
//가시나답변**

AND

input -> 함수 -> output

단일행함수
문자함수
숫자함수
날짜함수
변환함수
기타

복수행함수(그룹함수)


select lower(ename), upper(ename), initcap(ename) from emp;

SELECT
lower(ename), //소문자화
upper(ename), //대문자화
initcap(ename) //첫자만 대문자
FROM emp;


SELECT empno, ename, sal FROM emp WHERE lower(ename)='scott';

SELECT empno, ename, sal
FROM emp
WHERE lower(ename)='scott';

SELECT empno, ename, sal
FROM emp
WHERE ename=upper('scott');

SELECT empno, ename, sal
FROM emp
WHERE initcap(ename)=initcap('scott');

//양항을 함수를 써서 일치 시키는것이 좋다.


SELECT ename||mgr from emp;

SELECT concat(ename,mgr) from emp;
//단 두개만 가능
SELECT concat('dear ',ename) from emp;

SELECT to_number(concat('10',sal))+1 from emp;
//10을 문자화 하여 월급앞에 붙인후 숫자로 변환후 1을 더함

SELECT * from emp where length(ename)>5;
//이름의 길이가 5자 이상인 사람만

SELECT ename, instr(ename,'A') from emp;

SELECT ename, instr(ename,'L'4,1) from emp;
// 4<- 찾는 시작위치
// 1<- 찾는문자 반복순서
// instr(ename,'A') 은 instr(ename,'A',1,1) 과 동일

select LPAD(sal,10,'*') from emp;
select RPAD(sal,10,'*') from emp;
// 10 칸중 sal이 차지하는 칸을 제외한 나머지를 *으로 채워라

select LPAD(sal,6,' ') from emp;

select LTRIM('MILLER','MI') from dual;
//MI만 삭제되어 나옴
select LTRIM('MILLER','IL') from dual;
//효과없음
select RTRIM(sal,'0') from emp;

select trim(leading 'M' from ename) from emp;

select trim(trailing 'N' from ename) from emp;

select trim(both 'S' from ename) from emp;

SELECT
trasrate(sal,'1234567890','일이삼사오육칠팔구영'),
replace(job, 'SALE', 'ORDER')
FROM emp;
//tras 는 1:1
//repl 는 All:All

select CHR(65)||CHR(97) from dual;
//Aa
select job||CHR(13)||ename from ename;
//13 <-엔터


select round(456.789,0), round(456.789,2), round(456.789,-2) from dual;
//457 456.79 500
//반올림

select trunc(456.789,0), trunc(456.789,2), trunc(456.789,-2) from dual;
//456 456.78 400
//버림

NVL(expr1,expr2)
//expr1이 NULL이 아니면 expr1, NULL이면 expr2
NVL2(expr1,expr2,expr3)
//expr1이 NULL이 아니면 expr2, NULL이면 expr3을 출력
nullit(expr1,expr2)
//expr1=expr2이면 NULL을 출력, expr1<>expr2 이면 expr1

select NVL2(comm,sal+comm,sal) from emp;

select comm+sal as "plus", NVL(comm,0)+sal as "NVL", NVL2(comm,sal+comm,sal) as "NVL2" from emp;
800 800
1900 1900 1900
NULL과 덧셈은 NULL

select CHR(ASCII(A)) from dual;
//???항목명 길이..


select sysdate as "Current Date" from dual;

select add_months(sysdate, 10) from dual;

select sysdate, hiredate, months_between(sysdate, hiredate) from emp;

select next_day(sysdate,'월요일'), (last_day(sysdate)-sysdate) from dual;
//돌아오는 월요일
//30(날짜)-12(날짜)=18

select (sysdate-(7*3)) "3주전", (sysdate-(7*2)) "2주전", (sysdate+(7*3)) "3주후" from dual;

//7 일주일의 날수 * 주수 연산..


select hiredate, round(hiredate, 'Month'), round(hiredate,'Year'), trunc(hiredate, 'Month'), trunc(hiredate,'Year') from emp;
//7월인경우 year에 round를 쓰면 1년 PLUS
//7월인경우 year에 trunc를 쓰면 연도는 그대로

//1983-12-25 round month 적용하면 1984-01-01로 나옴

select TO_CHAR(sysdate, 'yyyy"년" mm"월" dd"일"') from dual;
// ''안에 "" 사용하는것에 주의
TO_CHAR //숫자or날짜 -> 문자
TO_NUMBER //문자형숫자 -> 숫자
TO_DATE //문자형식 날짜 -> 날짜

select to_char(sal, '$999,999.00') from emp;
//$999,999.00형식에 맞춰서 sal을 넣어서 표현하라
//9만 사용가능

select to_char(sal*12,'9,999') from emp;
//형식을 넘을때(overflow) #으로 표시됨

select to_char(sal*12,'L9,999') from emp;
//L은 지역통화표시

select TO_CHAR(hiredate,'fmdd month yyyy') from emp;
//fm 을 쓰면 앞에 0이 나오지 않도록 함 01-> 1


TO_DATE('03-02-01', 'mm-dd-yy')
//문자를 날짜형식에 맞춰서 내보냄

select (TO_DATE('03-02-01', 'YY-MM-dd'))-(TO_DATE('03-02-01', 'mm-dd-yy')) from dual;




ex01:
select sysdate as "Current Date" from dual;

select ename, length(ename), job from emp where length(ename)>=6;

select ename, job, sal, comm, sal+comm from emp;

문제01) EMP 테이블에서 SCOTT 의 정보를 사원번호, 성명, 담당업무(소문자로), 부서번호를 출력하여라.
select empno, ename, lower(job), deptno from emp where lower(ename)=lower('scott');

문제02) EMP 테이블에서 SCOTT  의 정보를 사원번호, 성명, 담당업무, 부서번호를 출력하여라.
select empno, ename, job, deptno from emp where upper(ename)=upper('scott');

문제03) DEPT 테이블에서 첫 글자만 대문자로 변환하여 모든 정보를 출력하여라.
select initcap(*) from dept;//불가
select initcap(dname), initcap(loc) from dept;

문제04) 두개의 SELECT 문이 있다. 결과의 차이점을 설명하여라.
select empno, ename, job, concat(empno,ename) e_name, concat(ename,empno) e_empno, concat(ename,job) e_job from emp where deptno='10';

select deptno no,danem,loc, concat(ddptno,dname) d_name, concat(dname,deptno) d_deptno, concat(dname,loc) d_loc from dept;

문제05) EMP 테이블에서 이름의 첫글자가 'K' 보다 크고 'Y' 보다 작은 사원의 정보를 사원번호, 이름, 업무, 급여, 부서번호를 출력하여라. 단 이름순으로 정렬하여라.
select * from emp where ASCII(UPPER(substr(ename,1,1)))>ASCII('K') and ASCII(UPPER(substr(ename,1,1)))<ASCII('Y') ORDER BY ename;

문제06) EMP 테이블에서 20번 부서 중 이름의 길이 및 급여의 자릿수를 사원번호, 이름, 이름의 자릿수, 급여, 급여의 자릿수를 출력하여라.
SELECT empno, ename, Length(ename) "L_ENAME", sal, Length(sal) "L_SAL" from emp where deptno='20';

문제07) EMP 테이블에서 이름 중 첫번째 'L'자의 위치와 두번째 'L'자의 위치를 출력하여라.
SELECT ename, instr(ename,'L',1,1) "E_L1", instr(ename,'L',1,2) "E_L2" from emp;

문제08) 문제없음

문제09) 아래의 결과를 출력하여라.
SELECT ename, LPAD(ename,15,'*') "L_ENAME", sal, LPAD(sal,10,'*') "L_SAL" from emp;

문제10) 아래의 결과를 출력하여라.
SELECT ename, RPAD(ename,15,'*') "R_ENAME", sal, RPAD(sal,10,'*') "R_SAL" from emp;

문제11) EMP 테이블에서 10번 부서에 대하여 담당 업무 중 좌측에 'A'를 삭제하고 급여 중 좌측의 1을 삭제하여 출력하여라.
select ename, job, CASE WHEN deptno='10' THEN LTRIM(job,'A') ELSE job END "LT_A", sal, LTRIM(sal,'1') "LT_1" from emp;

문제12) EMP 테이블에서 10번 부서에 대하여 담당 업무중 우측에서 'T'를 삭제하고 급여 중 우측의 0 을 삭제하여 출력하여라.
select ename, job, RTRIM(job,'K') "R_T", sal, RTRIM(sal,'0') "RT_0" from emp where deptno='10';

문제13) EMP 테이블에서 성명을 소문자로 바꾸어 출력하여라.
select empno, ename, lower(ename) "U-LOWER", sal, translate(sal,'1234567890','일이삼사오육칠팔구영') "N_H" from emp;

문제14) EMP 테이블에서 JOB 에 'A'를 '$'로 바꾸어 출력하여라.
select ename, job, replace(job,'A','$')"replace_J", sal from emp;

문제15) 다음의 결과를 분석하여라.
select round(4567.678) "ROUND_1", round(4567.678,0) "ROUND_2", round(4567.678,2) "ROUND_3", round(4567.678,-2) "ROUND_4" from dual;

문제16) 다음의 결과를 분석하여라.
select trunc(4567.678) "TRUNC_1", trunc(4567.678,0) "TRUNC_2", trunc(4567.678,2) "TRUNC_3", trunc(4567.678,-2) "TRUNC_4" from dual;

문제17) EMP 테이블에서 급여를 30으로 나눈 나머지를 구하여 출력하여라.
select sal, mod(sal,30) from emp;

문제18) EMP 테이블에서 20번 부서 중 이름과 담당업무를 연결하여 출력하여라. 단 담당업무를 한 줄 아래로 출력하여라.
select empno, ename, job, ename||CHR(10)||job "ENAME_JOB" from emp where deptno='20';

문제19) EMP 테이블에서 현재까지 근무일 수가 몇주 몇일 인가를 출력하여라. 단 근무일 수가 많은 사람 순으로 출력하여라.
select ename, hiredate, sysdate, (sysdate-hiredate+1) "Total Days", trunc((sysdate-hiredate+1)/7) "WEEKS", TRUNC(MOD((sysdate-hiredate+1),7)) "DAYS" from emp ORDER BY hiredate;

문제20) EMP 테이블에서 10번 부서 중 현재까지의 근무 월수를 계산하여 출력하여라.
select ename, hiredate, sysdate, months_between(sysdate,hiredate) "M_BETWEEN", trunc(months_between(sysdate,hiredate)) "T_BETWEEN" from emp;

문제21) EMP 테이블에서 10번 부서 중 입사 일자로부터 5개월이 지난 후 날짜를 계산하여 출력하여라.
select ename, hiredate, add_months(hiredate,5) "A_MONTH" from emp where deptno='10';

문제22) EMP 테이블에서 10번 부서 중 입사 일자로부터 돌아오는 금요일을 계산하여 출력하여라.
select ename, hiredate, NEXT_DAY(hiredate,'금요일') "N_DAY", NEXT_DAY(hiredate,'금요일') "N_6", NEXT_DAY(hiredate,'토요일') "N_7" from emp where deptno='10';
//??

문제23) EMP 테이블에서 입사한 달의 근무 일수를 계산하여 출력하여라. 단 토요일과 일요일도 근무 일수에 포함한다.
select empno, ename, hiredate, last_day(hiredate) "L_LAST", (last_day(hiredate)-hiredate+1)  "L_DAY" from emp;
//첫날도 근무일수에 산입해야하므로 +1을 해줌

문제24) EMP 테이블에서 10번 부서 중 입사한 달의  ROUND과 TRUNC 함수를 비교합니다.
select ename, hiredate, round(hiredate,'month') "M_ROUND", trunc(hiredate,'month') "M_TRUNC", round(hiredate,'year') "Y_ROUND", trunc(hiredate,'year') "Y_TRUNC" from emp where deptno='10';

문제25) EMP 테이블에서 10번 부서 중 입사 일자를 '1 MAY 1981'와 1998 년 1 월 1 일'의 형태로 출력하여라.
select ename, hiredate, initcap(to_char(hiredate,'dd month YYYY')) "T_HIREDATE", to_char(hiredate,'YYYY" 년 " MM" 월 " DD" 일"') "T_KOR" from emp where deptno='10';

문제26) EMP 테이블에서 부서 20 중 급여 앞에 $를 삽입하고 3 자리마다 ,를 출력하여라.
select empno, ename, job, sal, to_char(sal,'$999,999') from emp where deptno='20';

문제27) February 22, 1981 에 입사한 사원의 정보를 이름, 업무, 입사일자를 출력하여라.
select ename, job, initcap(to_char(hiredate, 'month dd, YYYY')) "T_HIRE" from emp where hiredate=to_date('February 22 1981', 'month dd YYYY');

문제28) EMP 테이블에서 JOB이 ANALYST 이면 급여 증가는 10%이고 JOB 이 CLERK 이면 급여 증가는 15%이고, JOB 이 MANAGER 이면 급여 증가는 20%입니다. 다른 업무에 대해서는 급여의 증가가 없습니다. 사원번호, 이름, 업무. 급여, 증가된 급여를 출력하여라.
select empno, ename, job, sal, CASE when job ='ANALYST' then (sal*1.1) when job ='CLERK' then (sal*1.15) when job ='MANAGER' then (sal*1.2) ELSE sal END "D_SAL" from emp;

문제29) 다음의 결과를 출력하여라.
select a.deptno, b.dname, RPAD(RPAD(b.dname,15,' '),21,'*') "T_RPAD", RPAD(b.dname,21,'*') "R_R", b.loc from emp a, dept b where a.deptno=b.deptno ;

AND

SELECT c.loc||' '||c.dname||'  '||a.job||' '||a.ename NAME, a.sal Salary,
TO_CHAR(a.hiredate,'rrrr'), //연월일중 연도만 추출
b.job||' '||b.ename as Manager  
FROM emp a, emp b, dept c
WHERE NVL(a.mgr,a.empno)=b.empno //사장은 상사가 없으므로 자기자신으로 대체
and a.deptno=c.deptno order by a.sal;

SELECT *
FROM emp
WHERE lower(ename) like '%a%';  //이름을 소문자로 변환후 a가 들어간것을 검색
AND

두번째 일본여행(교환연수)에서 건진 물건이다.
이것 외에 절애도 있었지만 사촌여동생 선물로 주어버렸다.

겨울이야기로 유명한 하라 히데노리의 작품..
AND

select ename, deptno, sal*12 ansal  from emp where ename=(uppper(scott)) order by sal;

deptno=10 or sal>=2000 or deptno < 30 or


alter session set nls_date_format='DD-MON-YY';
alter session set nls_date_format='DD-MON-RR';
--날짜표시변경

RR형식
2006
50-99 이전세기
00-49 현재세기
1998
50-99 현재세기
00-49 다음세기

YY형식
현재세기

ex1:
select empno, ename, job, sal from emp where sal>=3000;
ex2:
select empno, ename, job, sal, deptno from emp where job='MANAGER';
ex3:
select empno, ename, job, sal, hiredate, deptno from emp where hiredate>'01-jan-82';
ex4:
select ename, job, sal, deptno from emp where sal>1250 and sal<=1500;
ex5:
select empno, ename, job, sal, hiredate from emp where empno=7902 or empno=7788 or empno=7566;
select empno, ename, job, sal, hiredate from emp where empno IN (7902, 7788, 7566);
ex6:
select empno, ename, job, sal, hiredate, deptno from emp where hiredate like '82%';
select empno, ename, job, sal, hiredate, deptno from emp where TO_CHAR(hiredate,'rr')='82';
ex7:
select empno, ename, job, sal, comm, deptno from emp where comm is Null;
ex8:
select empno, ename, job, sal, hiredate, deptno from emp where sal>=1100 and job='MANAGER';
ex9:
select empno, ename, job, sal, hiredate, deptno from emp where sal>=1100 or job='MANAGER';
ex10:
select empno, ename, job, sal, deptno from emp where NOT job IN('MANAGER','CLERK','ANALYST');
ex11:
select empno, ename, job, sal from emp where sal>=1500 or job='MANAGER';
ex12:
select empno, ename, job, sal from emp where job='PRESIDENT' or (sal>=1500 and job='SALESMAN');

select empno, ename, job, sal from emp where ename like 'S%'; 처음에 S가 나옴
ename like '%S'; 끝에 S가 나옴
ename like '%S%'; S가 나옴
ename like '_S%'; 두번째에 S가 나옴

select empno, ename, job, sal, hiredate, deptno from emp where substr(hiredate,1,2)=82;

select empno, ename, job, sal, hiredate, deptno from emp where hiredate between '82-01-01' and '82-12-31';
A 가 B보다 작아야함
날짜 형식 RR-MM-DD

ex13:
select hiredate, empno, ename, job, sal, deptno from emp order by hiredate;
ex14:
select hiredate, empno, ename, job, sal, deptno from emp order by hiredate DESC;
ex15:
select deptno, sal, empno, ename, job from emp order by sal DESC;
ex16:
select deptno, job, sal, empno, hiredate from emp order by deptno, job, sal;

연습문제

1. WHERE 절에 HIREDATE 의 비교를 '23-JAN-82' 가 아닌 '23-jan-82'로 기술하면 결과는?

SQL> SELECT * FROM emp WHERE hiredate = '23-JAN-82';

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

SQL> SELECT * FROM emp WHERE hiredate = '23-jan-82';

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

차이없음


2.EMP 테이블에서 급여가 3000 이상인 사원의 정보를 사원번호, 이름, 담당업무, 급여를 출력하는 SELECT 문장을 작성하시오.
select empno, ename, job, sal from emp where sal>= 3000;

SQL> select empno, ename, job, sal from emp where sal>= 3000;

    EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
     7788 SCOTT      ANALYST         3000
     7839 KING       PRESIDENT       5000
     7902 FORD       ANALYST         3000


3.EMP 테이블에서 사원번호가 7788인 사원의 이름과 부서번호를 출력하는 SELECT 문장을 작성하시오.

SQL> select ename, deptno from emp where empno=7788;

ENAME          DEPTNO
---------- ----------
SCOTT              20


4.EMP 테이블에서 입사일이 February 20, 1981 과 May 1, 1981 사이에 입사한 사원의 이름 업무 입사일을 출력하는 SELECT문장을 작성하시오, 단 입사일 순으로 출력하시오.

SQL> select ename, job, hiredate from emp where hiredate between '20-Feb-81' and '01-May-81' order by hiredate;

ENAME      JOB       HIREDATE
---------- --------- ---------
ALLEN      SALESMAN  20-FEB-81
WARD       SALESMAN  22-FEB-81
JONES      MANAGER   02-APR-81
BLAKE      MANAGER   01-MAY-81


5.EMP 테이블에서 부서번호가 10, 20 인 사원의 모든 정보를 출력하는 SELECT 문장을 작성하시오. 단 이름순으로 정렬하여라.

SQL> select * from emp where deptno IN(10,20) order by ename;

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
     7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
     7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
     7566 JONES      MANAGER         7839 02-APR-81       2975                    20
     7839 KING       PRESIDENT            17-NOV-81       5000                    10
     7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
     7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
     7369 SMITH      CLERK           7902 17-DEC-80        800                    20

8 개의 행이 선택되었습니다.


6.EMP 테이블에서 급여가 1500 이상이고 부서번호가 10, 30 인 사원의 이름과 급여를 출력하는 SELECT 문장을 작성하여라. 단 HEADING을 Emplyee과 Monthly Salary 로 출력하여라.

SQL> select ename as Employee, sal as "Monthly Salary" from emp where sal >= 1500 and deptno IN(10,30);

EMPLOYEE   Monthly Salary
---------- --------------
ALLEN                1600
BLAKE                2850
CLARK                2450
KING                 5000
TURNER               1500


7.EMP 테이블에서 1982년에 입사한 사원의 모든 정보를 출력하는 SELECT 문을 작성하여라.

SQL> select * from emp where hiredate like '%82';

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7934 MILLER     CLERK           7782 23-JAN-82       1300                    10


8.EMP 테이블에서 COMM 에  NULL 이 아닌 사원의 모든 정보를 출력하는 SELECT 문을 작성하여라.
select * from emp where comm IS NOT NULL;

SQL> select * from emp where comm IS NOT NULL;

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
     7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
     7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
     7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30


9.EMP 테이블에서 보너스가 급여보다 10% 많은 모든 종업원에 대하여 이름, 급여, 보너스를 출력하는 SELECT문을 작성하여라.

SQL> select ename, sal, comm from emp where comm<sal*1.1;

ENAME             SAL       COMM
---------- ---------- ----------
MARTIN           1250       1400


10.EMP 테이블에서 업무가 CLERK 이거나 Analyst 이고 급여가 1000, 3000, 5000 이 아닌 모든 사원의 정보를 출력하는 SELECT문을 작성하여라.

SQL> select * from emp where job IN('CLERK','ANALYST') and sal NOT IN (1000,3000,5000);

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7369 SMITH      CLERK           7902 17-DEC-80        800                    20
     7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
     7900 JAMES      CLERK           7698 03-DEC-81        950                    30
     7934 MILLER     CLERK           7782 23-JAN-82       1300                    10


11.EMP 테이블에서 이름에 L 이 두 자가 있고 부서가 30 이거나 또는 관리자가 7782 인 모든 사원 정보를 출력하는 SELECT 문을 작성하여라.

SQL> select * from emp where (ename like '%L%L%' and deptno=30) or mgr=7782;

    EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
     7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
     7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

AND

select distinct
a.ename||' '||a.job||' '||d.grade as 사원,
b.ename||' '||b.job as 관리자,
c.loc
from emp a, emp b, dept c, salgrade d
where b.empno=NVL(a.mgr,a.empno) and a.deptno=c.deptno and (d.losal<a.sal and a.sal<d.hisal);

d.grade를 산출하는게 포인트..

잘못된 예)
select
a.ename||' '||a.job||' '||
(select distinct d.grade from emp a, salgrade d where d.losal<a.sal and a.sal<d.hisal)
as 사원,
b.ename||''||b.job as 관리자,
c.loc
from emp a, emp b, dept c, salgrade d
where b.empno=NVL(a.mgr,a.empno) and a.deptno=c.deptno
order by a.SAL ASC;

부속질의에서 답이 여러개 반환됨


select ename from emp where sal=(select max(sal) from emp);

select ename from emp where sal=max(select sal from emp);

AND

[oracle] 명령어

DB 2006. 6. 7. 22:11
자료의 올려주신 대호님께 감사드립니다.
 
  오라클과 명령어....
  1.  DATABASE 에 대하여??
    2.  ORACLE의 구동원리, 제품, 셋업시 생성되는 사용자 그룹
             2.1  INSTALL시 유의사항 
             2.2  ORACLE의 시작
    3.  SQL과 SQL*PLUS 명령과 그 특징
    4.  SQL*PLUS 명령의 편집
  DATA  DEFINETION LANGUAGE (DDL):데이타 정의 기능
    5.  USER  관리(유저의 생성/수정/삭제/권한부여)
    6.  TABLE 관리1 (데이타 타입/제한키/)
    7.  TABLE 관리2 (테이블의  생성/수정/삭제)
  DATA MANIPULATION LANGUAGE(DML):데이타 조작기능
    8.  연산자의 종류  
    9.  SELETCT 명령어
  10.  함 수 
        10.1산술함수/10.2문자열함수/10.3날짜함수/10.4그룹함수
  11.  테이블의 조인
  12.  서브쿼리./상관쿼리
  13.  TREE구조정보표시/쿼리결과를 이용한 테이블 형성
  14.  자료의 삽입(INSERT)/삭제(DELETE)/수정(UPDATE)
  15.  Commit/Rollback 명령 익히기
  DATA CONTROL LANGUAGE(DCL):데이타제어기능
  16.  View 테이블 만들기
보고서 만들기
  17.  보고서 환경설정/머리말 꼬리말 설정
  18.  Column명령을  이용한 보고서
  19.  Break 를 이용한 보고서
  20.  Compute 를 이용한 보고서
  ORACLE SERVER관리
  21.  Oracle Sever 설치하기
  22   SQL*NET 을 이용한 외부  NETWORK 접속
  23   동의어(Synonym)의 사용
  24   테이타베이스 링크  사용
  25   자료복사하기(COPY)
  26   권한 부여
  27   ROLE를  이용한 권한 관리
  28   순차 테이블(SEQUENCE)
  데이타베이스 관리
  29   데이타베이스 Administration Tool
  30   TableSpace 관리
  31 SQL *Loader
  32   ODBC 설정
  33   Trigger의 설정
   
  PL/SQL<프로시져언어>
  34   PL/SQL 문법과 기본 개념
  35   제어문과 반복문
  36   CURSOR를 이용한 PROGRAM
  37   CURSOR for LOOP
  38   Procedure/Function 만들기
AND

#######################################
# #
# MySQL 에서 사용되는 sql문 정리 #
# #
#######################################



■ CREATE DATABASE database_name (데이타베이스이름)
데이타 베이스 이름은 문자와 숫자, '_' 를 포함하는 32 byte 이내로
작성한다. 이 명령은 새로운 데이타베이스 공간을 생성시킨다. Oracle로
말하자면 tablespace와 같은 테이블이 들어가는 저장 공간을 말한다.

■ DROP DATABASE database_name
존재하는 데이타베이스를 제거한다. 데이타베이스 상에 존재하는 테이블도
모두 삭제 되므로 매우 조심하여 작업하여야 한다. 한번 삭제되면 복구는
불가능 하므로 데이타 베이스 상의 테이블과 데이타가 모두 백업이 되었는
지 확인하고 작업한다.

■ CREATE TABLE table_name ( create_definition,... )
데이타베이스 상에 테이블을 생성시키는 명령이다. 자세한 옵션은 다음과
같다. Oracle 의 table 생성 명령과 거의 유사하며 부가적인 type 이 존재한다.

create_definition:
column_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[ PRIMARY KEY ] [reference_definition]
or PRIMARY KEY ( index_column_name,... )
or KEY [index_name] KEY( index_column_name,...)
or INDEX [index_name] ( index_column_name,...)
or UNIQUE [index_name] ( index_column_name,...)
or FOREIGN KEY index_name ( index_column_name,...) [reference_definition]
or CHECK (expr)

type:
TINYINT[(length)] [UNSIGNED] [ZEROFILL]
or SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
or MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
or INT[(length)] [UNSIGNED] [ZEROFILL]
or INTEGER[(length)] [UNSIGNED] [ZEROFILL]
or BIGINT[(length)] [UNSIGNED] [ZEROFILL]
or REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
or DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
or FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
or DECIMAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
or NUMERIC[(length,decimals)] [UNSIGNED] [ZEROFILL]
or CHAR(length) [BINARY],
or VARCHAR(length) [BINARY],
or DATE
or TIME
or TIMESTAMP
or DATETIME
or TINYBLOB
or BLOB
or MEDIUMBLOB
or LONGBLOB
or TINYTEXT
or TEXT
or MEDIUMTEXT
or ENUM(value1,value2,value3...)
or SET(value1,value2,value3...)

index_column_name:
column_name [ (length) ]

reference_definition:
REFERENCES table_name [( index_column_name,...)]
[ MATCH FULL | MATCH PARTIAL]
[ ON DELETE reference_option]
[ ON UPDATE reference_option]

reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT



■ ALTER [IGNORE] TABLE table_name alter_spec [, alter_spec ...]
존재하는 테이블을 변경 및 columnd의 추가 작업시 사용된다.

alter_specification:
ADD [COLUMN] create_definition
or CHANGE [COLUMN] old_column_name create_definition
or ALTER [COLUMN] column_name { SET DEFAULT literal | DROP DEFAULT }
or ADD INDEX [index_name] ( index_column_name,...)
or ADD UNIQUE [index_name] ( index_column_name,...)
or DROP [COLUMN] column_name
or DROP PRIMARY KEY
or DROP INDEX key_name
or RENAME AS new_table_name

■ DROP TABLE table_name [, table_name...]
존재하는 테이블을 제거할 경우 사용되는 명령이다.

■ DELETE FROM table_name WHERE where_definition
존재하는 테이블 상의 데이타를 삭제할때 사용하는 명령이다.


■ SELECT 문
존재하는 테이블 상의 데이타를 조회할때 사용하는 명령이다.
기본적인 사용법은 다음과 같다.

SELECT [STRAIGHT_JOIN] [DISTINCT | ALL] select_expression,...
[INTO OUTFILE 'file_name' ...]
[ FROM table_references
[WHERE where_definition ]
[GROUP BY column,...]
[HAVING where_definition]
[ ORDER BY column [ASC | DESC] ,..] [LIMIT [offset,] rows]
[PROCEDURE procedure_name]]


■ JOIN 문
Oracle 에서 사용하는 join 문보다 좀더 확장된 join 문을 지원한다.

table_reference, table_reference
table_reference [CROSS] JOIN table_reference
table_reference LEFT [OUTER] JOIN table_reference ON conditional-expr
table_reference LEFT [OUTER] JOIN table_reference USING (column-commalist)
table_reference NATURAL LEFT [OUTER] JOIN table_reference
{ oj table_reference LEFT OUTER JOIN table_reference ON conditional-expr }

■ INSERT 문
존재하는 테이블에 데이타를 입력할때 사용한다.

INSERT INTO table [ (column_name,...) ] VALUES (expression,...)
or INSERT INTO table [ (column_name,...) ] SELECT ...



■ REPLACE 문
이 문장은 INSERT문장과 거의 유사하게 동작한다. 같은 레코드가 있을경우
이 레코드를 삭제한후 INSERT 작업을 한다. 같은 ?코드가 없을 경우는 INSERT
와 같이 동작한다.

REPLACE INTO table [ (column_name,...) ] VALUES (expression,...)
or REPLACE INTO table [ (column_name,...) ] SELECT ...

■ LOAD DATA INFILE 문
Server 상에 위치하는 text 파일로 부터 데이타를 읽어서 테이블에 입력작업을
할 경우 사용한다. 매우 속도가 빠르다.

LOAD DATA INFILE 'text_file_name.text' [REPLACE | IGNORE]
INTO TABLE table_name
[FIELDS [TERMINATED BY ',' [OPTIONALLY] ENCLOSED BY '"' ESCAPED BY '\\'
]]
[LINES TERMINATED BY '\n']
[(Field1, Field2...)]

테이블로 부터 데이타를 읽어서 text 파일에 데이타를 저장할경우 다음과 같이
사용한다.

SELECT ...
INTO OUTFILE 'interval.txt' fields terminated by ','
enclosed by '"'
escaped by '\\' lines terminated by '\n'
FROM ...

■ UPDATE 문
테이블 상에 존재하는 데이타를 변경할 경우 사용한다.


UPDATE table SET column=expression,... WHERE where_definition

■ SHOW syntax. Get information about tables, columns...
MySQL 상의 각종 정보를 보여준다. 데이타 베이스, 테이블, column등을
확인할수 있다.

SHOW DATABASES [LIKE wild]
or SHOW TABLES [FROM database] [LIKE wild]
or SHOW COLUMNS FROM table [FROM database] [LIKE wild]
or SHOW INDEX FROM table [FROM database]
or SHOW STATUS
or SHOW VARIABLES [LIKE wild]

■ EXPLAIN syntax. Get information about a SELECT.
select 문과 이때 요구되는 테이블에 대한 정보를 준다. 일반 select 문의
처음에 EXPLAIN 을 추가하면 동작한다.

EXPLAIN SELECT select_options

■ DESCRIBE syntax
존재하는 테이블에서 column 정보를 가지고 온다.

(DESCRIBE | DESC) table [column]

■ LOCK TABLES syntax
테이블에 lock 을 설정하여 타인이 읽지 못하게 할때 사용한다.
주의할 점은 한사람이 lock 을 실행하면 이 사람이 사용하는 모든 테이블이
lock되므로 사용후 꼭 unlock를 사용하여 lock를 풀도록 한다.

LOCK TABLES table_name [AS alias] READ|WRITE [, table_name READ|WRITE]
...
UNLOCK TABLES

■ SET OPTION syntax.
현재 사용중인 세션이 사용되는 동안 지속적으로 영향을 준다. 여러 옵션이
있으므로 원본 메뉴얼을 참조하기 바란다.

SET [OPTION] SQL_VALUE_OPTION=value, ...

■ GRANT 문 ( 호환명령)
이 명령을 사용하지는 않고 단지 호환성문제 때문에 MySQL 존재한다.
이 명령은 다른 SQL 서버로 부터 MySQL로 쉽게 변환하기 위하여 만들졌다.
MySQL 에서의 특권은 MySQL 허가 테이블을 이용하여 다루어 진다.
섹션 6.2 의 특권 시스템 업무를 하는 방법을 참고 하라.

GRANT (ALL PRIVILEGES | (SELECT, INSERT, UPDATE, DELETE,
REFERENCES (column list), USAGE))
ON table TO user,... [WITH GRANT OPTION]

■ CREATE INDEX 문 (호환명령)

이 명령을 사용하지는 않고 단지 호환성문제 때문에 MySQL 존재한다.
ALTER TABLE 을 사용하여 새로운 index 를 생성할수 있다.
섹션 7.7 의 ALTER TABLE 의 문법을 보아라.
CREATE [UNIQUE] INDEX index_name ON table_name ( column_name,... )

■ DROP INDEX 문 (호환명령)
이 명령은 항성 성공할 것이다. ALTER TABLE 을 사용하여 index 를 제거할수있다.
섹션 7.7 의 ALTER TABLE 의 문법을 보아라.

DROP INDEX index_name

■ Comment 문법
한줄의 주석은 # 로 하고 주석의 내용이 여러줄일 경우는 /* */ 를 이용하여
주석을 처리할수 있다.


■ CREATE FUNCTION 문법
MySQL 의 기본 함수인 ABS(), constr() 처럼 새로운 사용자 정의 함수를 생성
하는 함수이다. 사용자정의함수의 소스는 C, C++로 작성되어야 하고 동적으로
읽혀지는것이 요구되어 진다. 예제로서 배포판에 보면 udf_example.cc 가 있
고 5개의 새로운 사용자정의함수가 작성되어 있다.

CREATE FUNCTION RETURNS [string|real|integer]
SONAME

DROP FUNCTION
AND

1. SQL 함수

제공되는 함수들은 기본적인 Query문을 더욱 강력하게 해주고 데이터 값을 조작하는데 사용된다. 여러분은 단일 행 함수를 이용하여 문자,숫자,날짜 함수에 대해 살펴볼 뿐만 아니라 형을 전환하는 함수들에 대해서도 살펴본다. 또한 복수 행 함수를 이용하여 복수의 행 조합하여 그룹 당 하나의 결과를 출력하는 그룹 함수에 대해서 살펴본다.



1.1 SQL함수의 특징 및 이점

1) 데이터에 계산을 수행할 수 있다.

2) 개별적인 데이터 항목을 수정할 수 있다.

3) 행의 그룹에 대해 결과를 조작할 수 있다.

4) 출력을 위한 날짜와 숫자 형식을 조절할 수 있다.

5) 열의 자료형을 변환할 수 있다.



1.2 단일 행 함수(Single Row Function)

이 함수는 단일 행에 대해서만 적용 가능하고 행별로 하나의 결과를 RETURN한다..

Function_name (column | expression [ ,arg1,arg2, . . . . ])


function_name 함수 명

column 데이터 베이스의 Column Name

expression 어떤 문자 스트링이거나 계산된 표현식

arg1,arg2 함수에 의해 사용될 수 있는 인수



1.2.1 단일 행 함수가 이용되는 곳

1) 데이터에 대해 계산을 수행할 경우

2) 각각의 데이터 항목을 변경할 경우

3) 출력할 날짜 형식을 변경할 경우

4) Column Data Type을 변경할 경우



1.2.2 단일 행 함수의 종류

1) 문자형 함수 : 문자를 입력 받고 문자와 숫자 값 모두를 RETURN할 수 있다.

2) 숫자형 함수 : 숫자를 입력 받고 숫자를 RETURN한다.

3) 날짜형 함수 : 날짜형에 대해 수행하고 숫자를 RETURN하는 MONTHS_BETWEEN 함수를 제외하고 모두 날짜 데이터형의 값을 RETURN한다.

4) 변환형 함수 : 어떤 데이터형의 값을 다른 데이터형으로 변환한다.

5) 일반적인 함수 : NVL, DECODE





1.2.3 단일 행 함수의 특징

1) 질의에서 RETURN되는 각각의 행에 대해 수행

2) 행별로 하나의 결과를 RETURN

3) 참조 시 사용한 데이터 형과 다른 데이터 형으로 결과를 RETURN할 수 있다,

4) 하나 이상의 인수를 필요로 한다.

5) SELECT,WHERE,ORDER BY절에서 사용할 수 있습니다.

6) 함수를 중첩할 수 있습니다.

① 단일 행 함수들은 여러 LEVEL에 걸쳐 중첩 사용이 가능하다.

② 중첩된 함수들은 가장 하위 LEVEL에서 가장 상위 LEVEL 순으로 진행된다.



1.3 문자형 함수(Character Function)

종 류
함 수
사 용 목 적

변환 함수
LOWER
알파벳 값을 소문자로 변환

UPPER
알파벳 값을 대문자로 변환

INITCAP
첫번째 글자만 대문자로 변환

문자 조작 함수
CONCAT
두 문자열을 연결(합성)

SUBSTR
문자열 중 특정 문자 또는 문자열의 일부분을 선택

LENGTH
문자열의 길이를 구함

INSTR
명명된 문자의 위치를 구함

LPAD
왼쪽 문자 자리 채움

RPAD
오른쪽 문자 자리 채움

LTRIM
왼쪽 문자를 지움

RTRIM
오른쪽 문자를 지움

TRANSLATE
특정 문자열을 대체

REPLACE
특정 문자열을 대신




1.3.1 LOWER함수

대소문자가 혼합되어 있거나 대문자인 문자열을 소문자로 변환 합니다.

Syntax
LOWER( column | expression)

사 용 예
LOWER(‘MANAGER’) → manager












문제1) EMP 테이블에서 scott의 정보를 사원번호,성명,담당업무(소문자로),부서번호를 출력하여라.

SQL> SELECT empno,ename,LOWER(job),deptno

2 FROM emp

3 WHERE LOWER(ename) = 'scott';



EMPNO ENAME LOWER(JOB DEPTNO

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

7788 SCOTT analyst 20




1.3.2 UPPER 함수

대문자가 혼합되어 있거나 소문자인 문자열을 대문자로 변환 합니다.

Syntax
UPPER( column | expression)

사 용 예
UPPER(‘manager’) → MANAGER




문제2) EMP 테이블에서 scott의 정보를 사원번호,성명,담당업무,부서번호를 출력하여라.

SQL> SELECT empno,ename,job,deptno

2 FROM emp

3 WHERE ename = UPPER('scott');



EMPNO ENAME JOB DEPTNO

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

7788 SCOTT ANALYST 20




1.3.3 INITCAP 함수

각 단어의 첫번째 문자를 대문자로 나머지 문자는 소문자로 변경합니다.

Syntax
INITCAP( column | expression)

사 용 예
INITCAP(‘ORACLE SERVER’) → Oracle Server




문제3) DEPT 테이블에서 첫 글자만 대문자로 변환하여 모든 정보를 출력하여라.

SQL> SELECT deptno,INITCAP(dname),INITCAP(loc)

2 FROM dept;



DEPTNO INITCAP(DNAME) INITCAP(LOC)

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

10 Accounting New York

20 Research Dallas

30 Sales Chicago

40 Operations Boston




1.3.4 CONCAT 함수

두 개의 문자열을 합성합니다. CONCAT는 두개의 매개변수만 사용 가능합니다.

Syntax
CONCAT( column1 | expression1, column2 | expression2)

사 용 예
INITCAP(‘ORACLE’ ,‘SERVER’) → ORACLESERVER




문제4) 두개의 SELECT문이 있다. 결과의 차이점을 설명하여라

SQL> col e_name format a15

SQL> col e_empno format a15

SQL> col e_job format a15

SQL> SELECT empno,ename,job,CONCAT(empno,ename) e_name,

2 CONCAT(ename,empno) e_empno,

3 CONCAT(ename,job) e_job

4 FROM emp

5 WHERE deptno = 10;



EMPNO ENAME JOB E_NAME E_EMPNO E_JOB

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

7839 KING PRESIDENT 7839KING KING7839 KINGPRESIDENT

7782 CLARK MANAGER 7782CLARK CLARK7782 CLARKMANAGER

7934 MILLER CLERK 7934MILLER MILLER7934 MILLERCLERK

SQL> col no format 99

SQL> col d_name format a18

SQL> col d_deptno format a18

SQL> col d_loc format a25

SQL> SELECT deptno no, dname, loc, CONCAT(deptno,dname) d_name,

2 CONCAT(dname,deptno) d_deptno, CONCAT(dname,loc) d_loc

3 FROM dept;



NO DNAME LOC D_NAME D_DEPTNO D_LOC

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

10 ACCOUNTING NEW YORK 10ACCOUNTING ACCOUNTING 10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS 20RESEARCH RESEARCH 20 RESEARCH DALLAS

30 SALES CHICAGO 30SALES SALES 30 SALES CHICAGO

40 OPERATIONS BOSTON 40OPERATIONS OPERATIONS 40 OPERATIONS BOSTON




♣ 참고

Column의 데이터 타입이 varchar2, number, char의 차이로 varchar2와 number는 가변 길이, char는 고정 길이입니다.









1.3.5 SUBSTR 함수

지정된 길이만큼의 문자열을 추출합니다.

Syntax
SUBSTR( column | expression, m [,n])

사 용 예
SUBSTR(‘000101-3234232’, 8, 1) → 3




문제5) EMP 테이블에서 이름의 첫글자가 ‘K’ 보다 크고 ‘Y’보다 적은 사원의 정보를 사원번호, 이름, 업무, 급여, 부서번호를 출력하여라. 단 이름순으로 정렬하여라.

SQL> SELECT empno,ename,job,sal,deptno

2 FROM emp

3 WHERE SUBSTR(ename,1,1) > 'K' AND SUBSTR(ename,1,1) < 'Y'

4 ORDER BY ename;



EMPNO ENAME JOB SAL DEPTNO

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

7654 MARTIN SALESMAN 1250 30

7934 MILLER CLERK 1300 10

7788 SCOTT ANALYST 3000 20

7369 SMITH CLERK 800 20

7844 TURNER SALESMAN 1500 30

7521 WARD SALESMAN 1250 30



6 rows selected.




1.3.6 LENGTH 함수

문자열의 길이를 숫자 값으로 RETURN한다.

Syntax
LENGTH( column | expression )

사 용 예
INITCAP(‘000101-3234232’) → 14




문제6) EMP 테이블에서 20번 부서 사원 정보에 대한 사원번호, 이름, 이름의 자릿수, 급여, 급여의 자릿수를 출력하여라.

SQL> SELECT empno,ename,LENGTH(ename),sal,LENGTH(sal)

2 FROM emp

3 WHERE deptno = 20;



EMPNO ENAME LENGTH(ENAME) SAL LENGTH(SAL)

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

7566 JONES 5 2975 4

7902 FORD 4 3000 4

7369 SMITH 5 800 3

7788 SCOTT 5 3000 4

7876 ADAMS 5 1100 4




1.3.7 INSTR 함수

명명된 문자의 위치를 숫자 값으로 RETURN한다.

Syntax
INSTR( column | expression, m[,n])

사 용 예
INSTR(‘MILLER’, ‘L’, 1, 2) → 4




문제7) EMP 테이블에서 이름 중 ‘L’자의 위치를 출력하여라.

SQL> SELECT ename,INSTR(ename,'L') e_null,INSTR(ename,'L',1,1) e_11,

2 INSTR(ename,'L',1,2) e_12,INSTR(ename,'L',4,1) e_41,

3 INSTR(ename,'L',4,2) e_42

4 FROM emp

5 ORDER BY ename;



ENAME E_NULL E_11 E_12 E_41 E_42

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

ADAMS 0 0 0 0 0

ALLEN 2 2 3 0 0

BLAKE 2 2 0 0 0

CLARK 2 2 0 0 0

FORD 0 0 0 0 0

JAMES 0 0 0 0 0

JONES 0 0 0 0 0

KING 0 0 0 0 0

MARTIN 0 0 0 0 0

MILLER 3 3 4 4 0

. . . . . . . . . .

14 rows selected.




문제8) 파일명을 입력을 입력받아 확장자가 없으면 .SQL을 붙여 출력하여라.

SET VERIFY OFF

SET SERVEROUTPUT ON

ACCEPT p_filename PROMPT '파일명을 입력하시오 : '

DECLARE

v_filename VARCHAR2(300) := '&p_filename';

BEGIN

IF INSTR(v_filename,'.',1,1) = 0 THEN

DBMS_OUTPUT.PUT_LINE('FILE NAME : ' || v_filename || '.SQL');

ELSIF INSTR(v_filename,'.',1,1) >= 1 THEN

DBMS_OUTPUT.PUT_LINE('FILE NAME : ' || v_filename);

END IF;

END;

/

SET VERIFY ON

SET SERVEROUTPUT OFF




1.3.8 LPAD함수

문자값을 우측부터 채웁니다.

Syntax
LPAD(column | expression, n, ’string’)

사 용 예
LPAD(‘MILLER’, 10, ‘*’) → ****MILLER




문제9) 아래 두 문장의 결과를 보고 차이점을 설명하여라.

SQL> SELECT ename,LPAD(ename,15,'*'),sal,LPAD(sal,10,'*')

2 FROM emp

3 WHERE deptno = 10;



ENAME LPAD(ENAME,15,'*') SAL LPAD(SAL,10,'*')

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

KING ***********KING 5000 ******5000

CLARK **********CLARK 2450 ******2450

MILLER *********MILLER 1300 ******1300

SQL> SELECT deptno,dname,LPAD(dname,20,'*')

2 FROM dept;



DEPTNO DNAME LPAD(DNAME,20,'*')

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

10 ACCOUNTING ******ACCOUNTING

20 RESEARCH ******RESEARCH

30 SALES ******SALES

40 OPERATIONS ******OPERATIONS




1.3.9 RPAD함수

문자값을 좌측부터 채웁니다.

Syntax
RPAD(column | expression, n, ’string’)

사 용 예
RPAD(‘MILLER’, 10, ‘*’) → MILLER****




문제10) 아래 두 문장의 결과를 보고 차이점을 설명하여라.

SQL> SELECT ename,RPAD(ename,15,'*'),sal,RPAD(sal,10,'*')

2 FROM emp

3 WHERE deptno = 10;



ENAME RPAD(ENAME,15,'*') SAL RPAD(SAL,10,'*')

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

KING KING*********** 5000 5000******

CLARK CLARK********** 2450 2450******

MILLER MILLER********* 1300 1300******

SQL> SELECT deptno,dname,RPAD(dname,20,'*')

2 FROM dept;



DEPTNO DNAME RPAD(DNAME,20,'*')

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

10 ACCOUNTING ACCOUNTING ******

20 RESEARCH RESEARCH ******

30 SALES SALES ******

40 OPERATIONS OPERATIONS ******




1.3.10 LTRIM함수

왼쪽 문자를 지우는 함수 입니다.

Syntax
LTRIM(column1 | expression1, column1 | expression1)

사 용 예
LTRIM(‘MILLER’, ‘M’) → ILLER




문제11) EMP 테이블에서 10번 부서에 대하여 담당 업무 중 좌측에 ‘A’를 삭제하고 급여 중 좌측의 1을 삭제하여 출력하여라.

SQL> SELECT ename,job,LTRIM(job,'A'),sal,LTRIM(sal,1)

2 FROM emp;



ENAME JOB LTRIM(JOB SAL LTRIM(SAL,1)

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

KING PRESIDENT PRESIDENT 5000 5000

BLAKE MANAGER MANAGER 2850 2850

CLARK MANAGER MANAGER 2450 2450

JONES MANAGER MANAGER 2975 2975

MARTIN SALESMAN SALESMAN 1250 250

ALLEN SALESMAN SALESMAN 1600 600

TURNER SALESMAN SALESMAN 1500 500

JAMES CLERK CLERK 950 950

WARD SALESMAN SALESMAN 1250 250

FORD ANALYST NALYST 3000 3000

SMITH CLERK CLERK 800 800

SCOTT ANALYST NALYST 3000 3000

ADAMS CLERK CLERK 1100 00

MILLER CLERK CLERK 1300 300



14 rows selected.




1.3.11 RTRIM함수

오른쪽 문자를 지우는 함수 입니다.

Syntax
RTRIM(column1 | expression1,column2 | expression2)

사 용 예
RTRIM(‘MILLER’, ‘R’) → MILLE


문제12) EMP 테이블에서 10번 부서에 대하여 담당 업무 중 우측에 ‘T’를 삭제하고 급여 중 우측의 0을 삭제하여 출력하여라.

SQL> SELECT ename,job,RTRIM(job,'T'),sal,RTRIM(sal,0)

2 FROM emp

3 WHERE deptno = 10;



ENAME JOB RTRIM(JOB SAL RTRIM(SAL,0)

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

KING PRESIDENT PRESIDEN 5000 5

CLARK MANAGER MANAGER 2450 245

MILLER CLERK CLERK 1300 13




1.3.11 TRANSLATE 함수

특정 문자열을 대체하는 함수 입니다. 즉 str1을 str2 문자로 대체하는 함수이다.

Syntax
TRANSLATE(column1 | expression1, ‘string1’, ‘string2’)

사 용 예
TRANSLATE(‘MILLER’, ‘L’, ‘*’) → MI**ER




문제13) EMP 테이블에서 성명을 소문자로 바꾸어 출력하여라.

SQL> var u_lower varchar2(10)

SQL> var n_h varchar2(10)

SQL> col u_lower format a10

SQL> col n_h format a10

SQL>

SQL> SELECT empno,ename,TRANSLATE(ename,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',

2 'abcdefghijklmnopqrstuvwxyz') u_lower,

3 sal,TRANSLATE(sal,'0123456789',

4 '영일이삼사오육칠팔구') n_h

5 FROM emp

6 WHERE deptno = 10;



EMPNO ENAME U_LOWER SAL N_H

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

7839 KING king 5000 오영영영

7782 CLARK clark 2450 이사오영

7934 MILLER miller 1300 일삼영영




1.3.11 REPLACE 함수

특정 문자열을 대신하는 함수 입니다.

Syntax
REPLACE(column1 | expression1, ‘string1’, ‘string2’)

사 용 예
REPLACE(‘JACK and JUE’, ‘J’, ‘BL’) → BLACK and BLUE






문제14) EMP 테이블에서 JOB에 ‘A’를 ‘$’로 바꾸어 출력하여라.

SQL> SELECT ename,job,REPLACE(job,'A','$'),sal

2 FROM emp;



ENAME JOB REPLACE(J SAL

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

KING PRESIDENT PRESIDENT 5000

BLAKE MANAGER M$N$GER 2850

CLARK MANAGER M$N$GER 2450

JONES MANAGER M$N$GER 2975

MARTIN SALESMAN S$LESM$N 1250

. . . . . . .

14 rows selected.




1.4 숫자형 함수

함 수
사 용 목 적

ROUND
숫자를 반올림

TRUNC
숫자를 절삭

MOD
나머지를 구함

POWER
거듭제곱

SQRT
제곱근

SIGN
양수, 음수,0인지를 구분

CHR
ASCII값에 해당하는 문자를 구함




1.4.1 ROUND 함수

명시된 소수점으로 반올림하는 함수입니다. 숫자를 n자리까지 반올림한다. n이 양수이면 소수 자리를, 음수이면 정수 자리를 사사오입합니다. 생략할 수 있으며 Default는 0입니다.

Syntax
ROUND(column1 | expression1, n)

사 용 예
ROUND(456.789, 2) → 456.79




문제15) 다음의 결과를 분석하여라.

SQL> SELECT ROUND(4567.678),ROUND(4567.678,0),

2 ROUND(4567.678,2),ROUND(4567.678,-2)

3 FROM dual;



ROUND(4567.678) ROUND(4567.678,0) ROUND(4567.678,2) ROUND(4567.678,-2)

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

4568 4568 4567.68 4600


Select floor(234.5) from dual -> 내림 결과 -> 234

Ceil->올림 결과->235

♣ 참고

DUAL 테이블은 SYS User가 Owner이며 모든 사용자가 사용할 수 있도록 권한을 부여하였다. Dummy라는 하나의 Column과 X값을 가지는 하나의 행을 포함합니다. DUAL 테이블은 오직 하나의 값을 출력하고자 할 때 유용합니다. 예를 들어 데이터를 가진 테이블에서 파생되지 않은 상수, 의사열, 표현식의 값인 경우 입니다. 즉 임의의 값을 알고자 할 경우 유용하게 사용할 수 있다. 위 SELECT문장에서 dual이 아닌 dept를 사용하면 결과는 어떻게 될까?



1.4.2 TRUNC 함수

명시된 숫자를 절삭하는 함수입니다. 숫자를 n자리까지 절삭한다. n이 양수이면 소수 자리를, 음수이면 정수 자리를 절삭합니다. 생략할 수 있으며 Default는 0입니다.

Syntax
TRUNC(column1 | expression1 , n)

사 용 예
TRUNC(456.789, 2) → 456.78




문제16) 다음의 결과를 분석하여라.

SQL> SELECT TRUNC(4567.678),TRUNC(4567.678,0),

2 TRUNC(4567.678,2),TRUNC(4567.678,-2)

3 FROM dual;



TRUNC(4567.678) TRUNC(4567.678,0) TRUNC(4567.678,2) TRUNC(4567.678,-2)

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

4567 4567 4567.67 4500




1.4.3 MOD 함수

숫자의 나머지를 구하는 함수입니다.

Syntax
MOD(column1 | expression1 , n)

사 용 예
MOD(10, 3) → 1




문제17) EMP 테이블에서 급여를 30으로 나눈 나머지를 구하여 출력하여라.

SQL> SELECT sal, MOD(sal,30)

2 FROM emp

3 WHERE deptno = 10;



SAL MOD(SAL,30)

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

5000 20

2450 20

1300 10




1.4.4 POWER 함수

거듭제곱을 구하는 함수 입니다.

Syntax
POWER(column1 | expression1 , n)

사 용 예
POWER(2, 3) → 8




1.4.5 SQRT 함수

제곱근을 구하는 함수 입니다.

Syntax
SQRT( column1 | expression1 )

사 용 예
SQRT(4) → 2




1.4.6 SIGN 함수

주어진 숫자가 양수인지 음수인지 또는 0인지를 구하는 함수 입니다.

Syntax
SIGN( column1 | expression1 )

사 용 예
SIGN(100) → 1




1.4.7 CHR 함수

ASCII Code값에 해당하는 문자를 구하는 함수 입니다.

Syntax
CHR( column1 | expression1 )

사 용 예
CHR(65) → A


Ascii(‘a’) 하면 문자의 아스키 코드값을 리턴.

문제18) EMP 테이블에서 20번 부서 중 이름과 담당 업무를 연결하여 출력하여라. 단 담당 업무를 한 줄 아래로 출력하여라

SQL> SELECT empno,ename,job,ename || CHR(10) || job

2 FROM emp

3 WHERE deptno = 20;



EMPNO ENAME JOB ENAME||CHR(10)||JOB

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

7566 JONES MANAGER JONES

MANAGER

7902 FORD ANALYST FORD

ANALYST

7369 SMITH CLERK SMITH

CLERK

7788 SCOTT ANALYST SCOTT

ANALYST

7876 ADAMS CLERK ADAMS

CLERK




1.5 날짜형 함수

1.5.1 오라클 날짜 형식

1) 오라클은 세기,년,월,일,시,분,초를 내부 숫자(7 Byte) 형식으로 날짜를 저장 합니다.

2) Default Date Type은 DD-MON-YY(변경 가능)입니다.

3) 오라클 날짜의 범위는 B.C 4712년 1월 1일부터 A.D 9999년 12월 31일 사이입니다.

4) SYSDATE는 오라클이 설치되어 있는 서버의 현재 날짜와 시간을 RETURN하는 함수 입니다.

Alter session set nls_date_format=’dd-mon-yy’; 로 설정한후 사용해야 한다.

1.5.2 날짜 연산

1) 날짜에서 숫자를 더하거나 빼어 날짜 결과를 출력

2) 날짜 사이의 일수를 알기 위해서 두개의 날짜를 뺍니다.

3) 시간을 24로 나누어서 시간을 날짜에 더합니다.

날 짜 연 산
결 과
설 명

Date + Number
Date
일수를 날짜에 더합니다.

Date - Number
Date
날짜에서 일수를 뺍니다.

Date - Date
일수
어떤 날짜에서 다른 날짜를 뺍니다

Date + Number / 24
Date
시간을 날짜에 더합니다.


Select sysdate from dual; -> 현재 날짜를 볼수 있음

문제19) EMP 테이블에서 현재까지 근무일 수가 몇주 몇일 인가를 출력하여라. 단 근무 일수가 많은 사람 순으로 출력하여라.

SQL> SELECT ename,hiredate,sysdate,sysdate - hiredate "Total Days",

2 TRUNC((sysdate - hiredate) / 7, 0) Weeks,

3 ROUND(MOD((sysdate - hiredate), 7), 0) DAYS

4 FROM emp

5 ORDER BY sysdate - hiredate DESC;



ENAME HIREDATE SYSDATE Total Days WEEKS DAYS

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

SMITH 17-DEC-80 01-MAR-99 6648.5677 949 6

ALLEN 20-FEB-81 01-MAR-99 6583.5677 940 4

WARD 22-FEB-81 01-MAR-99 6581.5677 940 2

JONES 02-APR-81 01-MAR-99 6542.5677 934 5

BLAKE 01-MAY-81 01-MAR-99 6513.5677 930 4

CLARK 09-JUN-81 01-MAR-99 6474.5677 924 7

TURNER 08-SEP-81 01-MAR-99 6383.5677 911 7

MARTIN 28-SEP-81 01-MAR-99 6363.5677 909 1

KING 17-NOV-81 01-MAR-99 6313.5677 901 7

JAMES 03-DEC-81 01-MAR-99 6297.5677 899 5

FORD 03-DEC-81 01-MAR-99 6297.5677 899 5

. . . . . . . . . .

14 rows selected.




1.5.3 날짜 함수

날짜 함수는 오라클 날짜에 대해 연산을 합니다. 모든 날짜 함수는 숫자값을 RETURN하는데 MONTHS_BETWEEN을 제외하고는 DATE형을 RETURN합니다

날짜 함수
설 명

MONTHS_BETWEEN
두 날짜 사이의 월수를 계산

ADD_MONTHS
월을 날짜에 더합니다.

NEXT_DAY
명시된 날짜로부터 다음 요일에 대한 날짜를 나타냅니다.

LAST_DAY
월의 마지막 날을 계산 합니다.

ROUND
날짜를 반올림 합니다.

TRUNC
날짜를 절삭 합니다.




1.5.4 MONTHS_BETWEEN 함수

1) 날짜와 날짜 사이의 월수를 계산합니다

2) 결과는 음수 또는 양수가 될 수 있습니다.

3) 결과의 비정수 부분을 월의 부분을 나타냅니다.

Syntax
MONTHS_BETWEEN(date1, date2)

사 용 예
MONTHS_BETWEEN(sysdate,hiredate) → 212.04794


위 예에서 212는 월을 나타내고 .04794는 월의 일부분을 나타냅니다.



문제20) EMP 테이블에서 10번 부서 중 현재까지의 근무 월수를 계산하여 출력하여라.

SQL> SELECT ename,hiredate,SYSDATE,MONTHS_BETWEEN(SYSDATE,hiredate) m_between,

2 TRUNC(MONTHS_BETWEEN(SYSDATE,hiredate),0) t_between

3 FROM emp

4 WHERE deptno = 10

5 ORDER BY MONTHS_BETWEEN(SYSDATE,hiredate) DESC;



ENAME HIREDATE SYSDATE M_BETWEEN T_BETWEEN

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

CLARK 09-JUN-81 10-FEB-99 212.04812 212

KING 17-NOV-81 10-FEB-99 206.79005 206

MILLER 23-JAN-82 10-FEB-99 204.5965 204




1.5.5 ADD_MONTHS 함수

1) 날짜에 월을 더합니다(ADD_MONTHS(hiredate,10))

2) 날짜에 월을 뺍니다(ADD_MONTHS(hiredate,-10))

3) 결과의 날짜형입니다.

Syntax
ADD_MONTHS(date1, n)

사 용 예
ADD_MONTHS(hiredate,5) → 23-JUN-82


문제21) EMP 테이블에서 10번 부서 중 입사 일자로부터 5개월이 지난 후 날짜를 계산하여 출력하여라.

SQL> SELECT ename,hiredate,ADD_MONTHS(hiredate,5) a_month

2 FROM emp

3 WHERE deptno = 10

4 ORDER BY hiredate DESC;



ENAME HIREDATE A_MONTH

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

MILLER 23-JAN-82 23-JUN-82

KING 17-NOV-81 17-APR-82

CLARK 09-JUN-81 09-NOV-81




1.5.6 NEXT_DAY 함수

1) 명시된 요일의 돌아오는 날짜를 계산 합니다.

2) 요일이 아니라 숫자도 기술 가능(SUNDAY:1, MONDAY:2, . . . . .)

3) NLS_LANG이 KOREAN_KOREA.KO16KSC5601로 되어 있으면 한글도 사용 가능(일요일,월요일,화요일, . . . . . )

Syntax
NEXT_DAY(date1, ‘string’ | n )

사 용 예
NEXT_DAY(hiredate,’FRIDAY’) → 29-JAN-82

NEXT_DAY(hiredate,’금요일’) → 29-JAN-82




문제22) EMP 테이블에서 10번 부서 중 입사 일자로부터 돌아오는 금요일을 계산하여 출력하여라.

SQL> SELECT ename,hiredate,NEXT_DAY(hiredate,'FRIDAY') n_day,

2 NEXT_DAY(hiredate,6) n_6,NEXT_DAY(hiredate,7) n_7

3 FROM emp

4 WHERE deptno = 10

5 ORDER BY hiredate DESC;



ENAME HIREDATE N_DAY N_6 N_7

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

MILLER 23-JAN-82 29-JAN-82 29-JAN-82 30-JAN-82

KING 17-NOV-81 20-NOV-81 20-NOV-81 21-NOV-81

CLARK 09-JUN-81 12-JUN-81 12-JUN-81 13-JUN-81




1.5.7 LAST_DAY 함수

1) 월의 마지막 날짜를 계산

2) 윤년, 평년은 자동 계산

Syntax
LAST_DAY(date1)

사 용 예
LAST_DAY(hiredate) → 30-NOV-81


문제23) EMP 테이블에서 입사한 달의 근무 일수를 계산하여 출력하여라. 단 토요일과 일요일도 근무 일수에 포함한다.

SQL> SELECT empno,ename,hiredate,LAST_DAY(hiredate) l_last,

2 LAST_DAY(hiredate) - hiredate l_day

3 FROM emp

4 ORDER BY LAST_DAY(hiredate) - hiredate DESC;



EMPNO ENAME HIREDATE L_LAST L_DAY

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

7698 BLAKE 01-MAY-81 31-MAY-81 30

7566 JONES 02-APR-81 30-APR-81 28

7900 JAMES 03-DEC-81 31-DEC-81 28

7902 FORD 03-DEC-81 31-DEC-81 28

7844 TURNER 08-SEP-81 30-SEP-81 22

7788 SCOTT 09-DEC-82 31-DEC-82 22

7782 CLARK 09-JUN-81 30-JUN-81 21

7876 ADAMS 12-JAN-83 31-JAN-83 19

7369 SMITH 17-DEC-80 31-DEC-80 14

7839 KING 17-NOV-81 30-NOV-81 13

. . . . . . . . . .

14 rows selected.




1.5.8 ROUND 함수

1) 명시된 형식으로 반올림 합니다.

2) 날짜를 가장 가까운 년도 또는 월로 반올림할 수 있습니다.

① fmt에 명시된 단위에 대해 반올림한 날짜를 계산

② fmt가 생략되면 날짜를 가장 가까운 날짜로 반올림한다.

Syntax
ROUND(date1 [,fmt] )

사 용 예
ROUND(‘25-JUN-99’,’MONTH’) → 01-AUG-99

ROUND(‘25-JUN-98’,’YEAR’) → 01-JAN-99




1.5.9 TRUNC 함수

1) 명시된 형식으로 절삭 합니다.

2) 날짜를 가장 가까운 년도 또는 월로 절삭할 수 있습니다.

① fmt에 명시된 단위에 대해 절삭한 날짜를 계산

② fmt가 생략되면 날짜를 가장 가까운 날짜로 절삭한다.

Syntax
TRUNC(date1 [,fmt] )

사 용 예
TRUNC(‘25-JUN-99’,’MONTH’) → 01-JUN-99

TRUNC(‘25-JUN-98’,’YEAR’) → 01-JAN-98




문제24) EMP 테이블에서 10번 부서 중 입사한 달의 ROUND과 TRUNC 함수를 비교합니다.

SQL> SELECT ename,hiredate,ROUND(hiredate,'MONTH') m_round,

2 TRUNC(hiredate,'MONTH') m_trunc, ROUND(hiredate,'YEAR') y_round,

3 TRUNC(hiredate,'YEAR') y_trunc

4 FROM emp

5 WHERE deptno = 10

6 ORDER BY hiredate DESC;



ENAME HIREDATE M_ROUND M_TRUNC Y_ROUND Y_TRUNC

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

MILLER 23-JAN-82 01-FEB-82 01-JAN-82 01-JAN-82 01-JAN-82

KING 17-NOV-81 01-DEC-81 01-NOV-81 01-JAN-82 01-JAN-81

CLARK 09-JUN-81 01-JUN-81 01-JUN-81 01-JAN-81 01-JAN-81




1.6 변환 함수

1.6.1 데이터의 형 변환

오라클 서버는 어떤 일정한 데이터형의 데이터를 사용해야 하는 곳에, 그것과 다른 데이터형의 데이터를 사용할 수 있게 합니다. 이것은 오라클 서버가 자동적으로 데이터형을 변환할 수 있을 때 허용됩니다. 이 데이터형 변환은 오라클 서버에 의해서 암시적으로 행해지거나 또는 사용자에 의해서 명시적으로 행해질 수 있습니다.



가) 암시적인 데이터형 변환

값 할당(assignment)시,오라클 서버는 다음을 자동으로 변환할 수 있습니다.

FROM
TO

VARCHAR2 or CHAR
NUMBER

VARCHAR2 or CHAR
DATE

NUMBER
VARCHAR2

DATE
VARCHAR2




♣ 참고

오라클 서버가 값 할당(assignment) 문장에서 사용된 값의 데이터형을 목표(target)값의 데이터형으로 변환할 수 있을 경우에 할당(assignment) 문장은 올바로 수행됩니다. 또한 CHAR가 NUMBER로의 변환은 문자열이 적절한 숫자로 나타낼수 있을 경우에만 가능하고 CHAR가 DATE로의 변환은 문자열이 Default Date Type와 같을 경우에만 성공합니다.



☞ Guidelines

비록 암시적 데이터형 변환을 이용할 수 있더라도,SQL문장의 안정성을 위해서 명시적 데이터형 변환을 할 것을 권장합니다.



나) 명시적인 데이터형 변환

SQL은 변환 함수를 통하여 어떤 데이터형의 값을 다른 데이터형의 값으로 변환하기 위하여 아래의 함수를 제공 합니다.

함 수
사 용 목 적

TO_CHAR
숫자나 문자값을 지정한 형식의 VARCHAR2문자열로 변환 합니다.

TO_NUMBER
숫자를 포함하는 문자열을 숫자로 변환 합니다.

TO_DATE
날짜를 나타내는 문자열을 명시된 날짜로 변환 합니다.




1.6.2 TO_CHAR 함수

숫자,날짜,문자열을 지정한 형식의 VARCHAR2 문자열로 변환하는 함수입니다.



1) 날짜 형식을 변환

Syntax
TO_CHAR( date, ‘fmt’ )

사 용 예
TO_CHAR(hiredate, ‘YY/MM/DD’) → 81/11/17




가) 특정 형식으로 날짜를 출력

이전의 모든 날짜 형식은 DD-MON-YY형식이었다. TO_CHAR함수는 이러한 형식의 날짜를 명시한 날짜 형식으로 변환하여 출력할 수 있다.



☞ Guidelines

1) 포맷(fmt) 모델은 단일 인용 부호로 둘러 싸여 있어야 하고 대소문자를 구분한다.

2) 포맷(fmt) 모델은 어떤 타당한 날짜 형식도 포함 가능하다.

3) 추가된 공백을 제거하거나 앞부분의0을 없애기 위해서 “fm”요소를 사용한다.

4) SQL*Plus COLUMN명령어로 문자 필드 결과의 출력 폭의 크기를 조절할 수 있다.(DEFAULT는 80)



나) 날짜 형식 모델

구 성 요 소
설 명

SCC or CC
세기;BC날짜에는 _S를 붙입니다.

Years in dates YYYY or SYYYY
년;BC날짜에는 _S를 붙입니다.

YYY or YY or Y
년의 마지막3,2또는1자리 수

Y,YYY
콤마가 있는 년

IYYY,IYY,IY,I
ISO표준에 바탕을 둔4,3,2또는 1자리 수

SYESR or YEAR
문자고 표현된 년;BC날짜에는 _S를 붙입니다.

BC or AD
BC/AD지시자

B.C or A.D
.이 있는 BC/AD지시자

Q
년의 4분의1

MM
두자리 값의 월

MONTH
9자리를 위해 공백을 추가한 월 이름

MON
세 자리의 약어로 된 월 이름

RM
로마 숫자 월

WW or W
년이나 월의 주

DDD or DD or D
년,월 또는 주의 일

DAY
9자리를 위해 공백을 추가한 요일 이름

DY
세 자리 약어로된 요일 이름

J
Julian day;BC4713년12월 31일 이후의 요일 수




다) 시간 형식

1) 시간 요소는 날짜의 시간 부분을 형식화(HH24:MI:SS AM → 15:34:32 PM)

2) 문자열에 이중 인용 부호를 사용하여 문자열을 추가(DD “of” MONTH→10 of OCTOBER)

3) 숫자 접미사는 숫자를 문자로 변환(ddspth → fourteenth)

4) 시간 형식의 종류

요 소
설 명

AM or PM
정오 지시자

A.M or P.M
.이 있는 정오 지시자

HH or HH12 or HH24
하루 중 시간(1-12, 0-23)

MI
분(0-59)

SS
초(0-59)

SSSSS
자정 이후의 초(0-86399)




라) 기타 형식

요 소
설 명

/ . ,
사용 문자가 결과에 다시 나타난다.

“of the”
인용 부호내의 문자가 결과에 출력




마) 숫자에 영향을 주는 접미사

요 소
설 명

TH
서수(DDTH → 4TH)

SP
명시한 수(DDSP → FOUR)

SPTH or THSP
명시한 서수(DDSPTH → FOURTH)


문제25) EMP 테이블에서 10번 부서 중 입사 일자를 ‘1 May 1981’와 ‘1998년 1월 1일’의 형태로 출력하여라

SQL> var t_hiredate varchar2(30)

SQL> var t_kor varchar2(20)

SQL> col t_hiredate format a30

SQL> col t_kor format a20

SQL> SELECT ename,hiredate,TO_CHAR(hiredate, 'fmDD Month YYYY') t_hiredate,

2 TO_CHAR(hiredate, 'YYYY"년" MM"월" DD"일"') t_kor

3 FROM emp

4 WHERE deptno = 10

5 ORDER BY hiredate DESC;



ENAME HIREDATE T_HIREDATE T_KOR

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

MILLER 23-JAN-82 23 January 1982 1982년 01월 23일

KING 17-NOV-81 17 November 1981 1981년 11월 17일

CLARK 09-JUN-81 9 June 1981 1981년 06월 09일




2) 숫자 형식을 변환

TO_CHAR함수를 사용하여 숫자 값을 문자로 출력하기 위해 사용한다.

Syntax
TO_CHAR( number, ‘fmt’ )

사 용 예
TO_CHAR(sal, ‘$999,999’) → $3,000




가) 숫자를 가진 TO_CHAR함수

1) 숫자 값을 문자로 변환할 때 즉 NUMBER형을 VARCHAR2로 전환할 때

2) 이 기법은 연결(Concatenation) 시에 유용



☞ Guidelines

1) 형식에 의해 제공되는 자릿수를 초과하는 숫자에 대해서는 “#”을 출력

2) 지정된 소수 값을 형식에서 제공하는 소수점 자리로 반올림 한다.



나) 숫자 형식 모델

요 소
설 명

결 과

9
9의 수는 출력 폭을 결정
999999
1234

0
무효의 0을 출력
099999
001234

$
달러 기호
$999999
$1234

L
지역 화패 기호
L999999
1234

.
명시한 위치에 소수점
999999.99
1234.00

,
명시한 위치에 콤마
999,999
1,234

MI
우측에 마이너스 기호(음수 값)
999999MI
1234-

PR
음수를 “()”로 묶는다
999999PR
<1234>

EEEE
과학적인 부호 표기
99.999EEEE
1.234E+03

V
10을 n번 곱합니다.
9999V99
123400

B
0을 0이 아닌 공백으로 출력
B9999.99
1234.00




문제26) EMP 테이블에서 부서 20중 급여 앞에 $를 삽입하고 3자리마다 ,를 출력하여라

SQL> SELECT empno,ename,job,sal,TO_CHAR(sal,'$999,999')

2 FROM emp

3 WHERE deptno = 20

4 ORDER BY sal DESC;



EMPNO ENAME JOB SAL TO_CHAR(S

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

7902 FORD ANALYST 3000 $3,000

7788 SCOTT ANALYST 3000 $3,000

7566 JONES MANAGER 2975 $2,975

7876 ADAMS CLERK 1100 $1,100

7369 SMITH CLERK 800 $800




1.6.3 TO_NUMBER 함수

숫자를 포함하는 문자열을 숫자로 변환 합니다.

Syntax
TO_NUMBER( char )

사 용 예
TO_NUMBER(‘1234’) → 1234




1.6.4 TO_DATE 함수

날짜를 나타내는 문자열을 명시된 날짜로 변환 합니다.

Syntax
TO_DATE( char [, ‘fmt’ ] )

사 용 예
TO_DATE(‘19990220181030’,‘YYYYMMDDHH24MISS’) →1999/02/20 18:10:30




문제27) February 22, 1981에 입사한 사원의 정보를 이름, 업무, 입사일자를 출력하여라.

SQL> SELECT ename,job,TO_CHAR(hiredate, 'Month DD, YYYY') t_hire

2 FROM emp

3 WHERE hiredate = TO_DATE('February 22, 1981','Month DD, YYYY');



ENAME JOB T_HIRE

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

WARD SALESMAN February 22, 1981




1.7 기타 함수

1.7.1 ECODE 함수

CASE나 IF-THEN-ELSE-END IF문장의 조건적 조회를 가능하게 함

Syntax
DECODE(col | expr,search1,result1[,search2,result2,..][,default])

사 용 예
DECODE(deptno, 10, sal*1.1, 20, sal*1.5, 30, sal*1.2, sal)




문제28) EMP 테이블에서 JOB이 ANALYST이면 급여 증가는 10%이고 JOB이 CLERK이면 급여 증가는 15%이고 JOB이 MANAGER이면 급여 증가는 20%입니다. 다른 업무에 대해서는 급여 증가가 없습니다. 사원번호, 이름, 업무, 급여, 증가된 급여를 출력하여라.

SQL> SELECT empno,ename,job,sal,DECODE(job,'ANALYST', sal*1.1,

2 'CLERK', sal*1.15,'MANAGER', sal*1.2, sal) d_sal

3 FROM emp

4 ORDER BY sal DESC;



EMPNO ENAME JOB SAL D_SAL

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

7839 KING PRESIDENT 5000 5000

7902 FORD ANALYST 3000 3300

. . . . . . . . . .

14 rows selected.




1.8 중첩 함수

1) 단일행 함수는 여러 LEVEL에 걸쳐 중첩 가능

2) 중첩 함수는 가장 하위 LEVEL에서 상위 LEVEL순으로 진행

Syntax
F3( F2( F1(col,arg1), arg2), arg3)

사 용 예
NVL(TO_CHAR(mgr), ‘No Manager’)




문제28) 다음의 결과를 분석하여 보아라.

SQL> col t_rpad format a20

SQL> col r_r format a20

SQL> SELECT deptno,dname,RPAD(dname,20,'*') t_rpad,

2 RPAD(RTRIM(dname),20,'*') r_r,loc

3 FROM dept;



DEPTNO DNAME T_RPAD R_R LOC

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

10 ACCOUNTING ACCOUNTING ****** ACCOUNTING********** NEW YORK

20 RESEARCH RESEARCH ****** RESEARCH************ DALLAS

30 SALES SALES ****** SALES*************** CHICAGO

40 OPERATIONS OPERATIONS ****** OPERATIONS********** BOSTON
AND

NOT IN

DB/DB study 2006. 6. 7. 19:13
2-5. DEPT 테이블에는 총 4 건의 데이터가 들어 있다.

DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
이 때 다음 SELECT 문을 실행할 경우 몇 건의 데이터가 출력되는가?



SELECT *

FROM dept

WHERE deptno NOT IN (10, 20, NULL)



a. 0

b. 1

c. 2

d. 3

e. 4.





<해설>



이 SELECT 문을 NOT IN 대신 AND 연산자로 풀어 써 보자.



SELECT *

FROM dept

WHERE deptno != 10 AND deptno != 20 AND deptno != NULL



NULL과의 연산은 || 연산자를 제외하고는 모두 NULL로 처리되므로 deptno != NULL 의 결과는 NULL이고 이 값과의 AND 연산도 NULL이 된다. 따라서 연산의 최종 결과가 NULL이므로 WHERE 조건을 만족시키는 데이터는 하나도 없다.



정답 : (a) (<- 마우스로 정답 부분을 선택하세요)
AND

select 컬럼명
from 테이블명;

select *
from tab;  <-- 모든 테이블

set linesize 100 <-가로길이 압축
set pagesize 50  <-페이지를 늘려줌(항목이 다시 나오는것을 막아줌)

select *
from emp;

empno ename job mgr hiredate sal comm deptno


select *
from dept;

deptno dname loc

select empno, ename from emp;

desc emp <- ; 없음 , 항목보기

select empno, ename, sal, job from emp;

select ename, sal, sal+500 from emp;

select (256+34)*6-54/9 from emp; <- 답이 14번 나옴

select (256+34)*6-54/9 from dual; <- 답이 1번 나옴, 가상 테이블 답

select (256+34)*6-54/9 결과 from dual; <- 결과=alias(별칭)

select empno 사원번호, ename 사원명 from emp;

select empno 사원 번호, ename 사원명 from emp;
ora-00923: from 키워드가 있어야할 곳에 없습니다.

select empno "사원 번호", ename 사원명 from emp; <- 공백이나 따옴표를 제외한 특수문자사용시

** 대개의 경우 ' 를 사용, " 는 2가지 경우만..

select empno as 사원번호, ename as 사원명 from emp;

ex4:
select empno, ename, sal, comm, sal+comm/100 from emp;

ex5:
select ename, sal, comm, sal*12+NVL(comm,0) from emp;

** NVL(a1, a2)  <- 대상 컬럼이 Null인경우 a2값을 반환
a1: 대상컬럼명
a2: 변환목표값

ex6:
select ename as NAME, sal as SALARY from emp;

ex7:
select ename as NAME, sal*12 as "Annual Salary" from emp;

ex8:
select ename as "성 명", sal as "급 여" from emp;


select * from emp where sal>1300 and job=SALESMAN;   <- 에러
ora-00904:열명이 부적합합니다

select * from emp where sal>1300 and job='SALESMAN';

select 'Dear ' ename from emp;
Dear

select 'Dear '||ename from emp;
Dear smith

select 'Dear ', ename from emp;  <- 별개의 컬럼
Dear smith


** 로그저장법
Spool c:\aa.txt
spool off

ex9:
select ename, job from emp;

select ename||' '||job as Employees from emp;

ex10:
select ename||' is a'||job as "Employees Details" from emp;

ex11:
select ename||': 1 Year Salary ='||sal*12 as Monthly from emp;

ex12:
select job from emp;

ex13:
select distinct job from emp;
select distinct job, ename from emp;

ex14:
select deptno, job from emp;
select distinct deptno, job from emp;


연습문제
01:

02:

03:
select empno, ename, sal*12 "연 봉" from emp;
04:
desc emp
05:
select distinct deptno from emp;
06:
select ename||' '||job from emp;
07:
select dname||' '||loc from dept;
08:
select job||' '||sal from emp;
09:


ed <-sql plus 명령어
select *
from emp
/  <-에디트 실행

sql buffer 편집기
Alt + F4


select empno, ename, sal, job from emp order by sal desc;
select empno, ename, sal*12 ansal, job from emp order by ansal desc;

select ename. sal, deptno from emp order by deptno, sal desc;
select ename. sal, deptno from emp order by deptno desc, sal;

AND

====================================================================
다중 셀렉트~
====================================================================



<HTML>

<HEAD>

<TITLE></TITLE>

<style>

#sub1, #sub2, #sub3

{ position: absolute;left: 180px;visibility: hidden;z-index: 3}

</style>

<SCRIPT LANGUAGE="JavaScript">

<!--

catnumber = 3 // 카테고리의 갯수 설정

offset = 150

performOnchange = false

if (document.all) {

docObj = "document.all."

styleObj = ".style"

} else {

docObj = "document."

styleObj = ""

}

function openselect(subcat) {

popupselect = eval(docObj + subcat + styleObj)

popupselect.visibility = "visible"

}

function closeselect(submenu,subcat){

popupselect = eval(docObj + subcat + styleObj)

if (submenu.selectedIndex != 0) {

popupselect.visibility = "hidden"

numchoice = submenu.selectedIndex

choice = submenu[numchoice].value

myForm.subcategory.value = choice

submenu.selectedIndex = 0

}

}

function lock() {

performOnchange = false

}

function unlock() {

performOnchange = true

}

function selectSub(cat) {

for (i=1; i <= catnumber; i++) {

subcat = "sub" + i

popupselect = eval(docObj + subcat + styleObj)

popupselect.visibility = "hidden"

}

if (performOnchange == true) {

letsopen = "sub" + cat.selectedIndex

if (letsopen == "sub0") {

alert("카테고리를 선택 해 주세요")

choice = "- 서브 카테고리 -"

myForm.subcategory.value = choice

cat.focus()

} else {

openselect(letsopen)

lock()

}

}

}

// -->

</script>

</HEAD>

<BODY>



<!---- 첫번째 서브 카테고리 설정 ----->



<span id="sub1">

<select name="sub_singer" onchange="closeselect(this,'sub1')">

<option selected value="">- 서브 카테고리 -

<option value="1">1

<option value="2">2

<option value="3">3

</select>

</span>



<!---- 두번째 서브 카테고리 설정 ----->



<span id="sub2">

<select name="sub_hobby" onchange="closeselect(this,'sub2')">

<option selected value="">- 서브 카테고리 -

<option value="가">가

<option value="나">나

<option value="다">다

</select>

</span>



<!---- 세번째 서브 카테고리 설정 ----->



<span id="sub3">

<select name="sub_int" onchange="closeselect(this,'sub3')">

<option selected value="">- 서브 카테고리 -

<option value="A">A

<option value="B">B

<option value="C">C

</select>

</span>



<!---- 메인 카테고리 설정 ----->



<select name="main_category" onmouseover="unlock()" onchange="selectSub(this)">

<option selected value="">-- 카테고리 선택 --

<option value="숫자">숫자

<option value="한글">한글

<option value="영어">영어

</select>

<p>

<form name=myForm action="">

<input type="text" name="subcategory" readonly="readonly" value="- 서브 카테고리 -">

<input type=submit value=" 전송 ">

<!------------------------- 여기까지 ---------------------------------->



</BODY>

</HTML>


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

====================================================================
td 에 스크롤바 생성하기
====================================================================

<table border=0 width=0 height=0 cellspacing=0 cellpadding=0>
<tr>
<td width=200 height=100 valign="top">
<div style="overflow-y:scroll; width:200; height:100; padding:4px">
내용
</div>
</td>
</tr>
</table>


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

====================================================================
마우스 오른쪽 단추 클릭시 강제이동시키기
====================================================================

script language="JavaScript">
<!--
function click() {if (event.button==2) {
alert('오른쪽마우스 클릭했을때 할말');
location.href="페이지넘길 주소";
}
}
document.onmousedown=click
// -->
</script>

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

====================================================================
그림에 마우스 오버만 해도 링크 이동
====================================================================

<a href="" onmouseover="parent.location='이동될 주소'"><img src="이미지주소" border="0">

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

====================================================================
시작과 멈춤이 가능한 스크롤 텍스트
====================================================================

<marquee id="scroller" direction=up scrollAmount=5 width=200 height=150 style="background-color:#eeeeee;border:1px dot #999999">
여기에 원하는 글을 쓰세요 ^_^
</marquee>
<center>


<a href="scroller.start()">시작</a> &nbsp; <a href="scroller.stop()">멈춤</a>

<script language="JavaScript1.2">
if (document.all)
scroller.stop()
</script>


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

====================================================================
이미지 슬라이드(마우스오버시멈춤)
====================================================================

<script language="JavaScript1.2">
<!--

/*
Conveyor belt slideshow script-
?Dynamic Drive (www.dynamicdrive.com)
For full source code, installation instructions,
100's more DHTML scripts, and Terms Of
Use, visit dynamicdrive.com
*/

//Specify the slider's width (in pixels)
var sliderwidth=330
//Specify the slider's height (in pixels, pertains only to NS)
var sliderheight=145
//Specify the slider's scroll speed (larger is faster)
var slidespeed=4

//Specify the slider's images
var leftrightslide=new Array()
var finalslide=''
leftrightslide[0]='<a href="#"><img src="http://skydare.net/img/benner1.gif"; width="90" height="30" border=0></a>'
leftrightslide[1]='<a href="#"><img src="http://skydare.net/img/benner2.gif"; width="90" height="30" border=0></a>'
leftrightslide[2]='<a href="#"><img src="http://skydare.net/img/benner3.gif"; width="90" height="30" border=0></a>'
leftrightslide[3]='<a href="#"><img src="http://skydare.net/img/benner1.gif"; width="90" height="30" border=0></a>'
leftrightslide[4]='<a href="#"><img src="http://skydare.net/img/benner2.gif"; width="90" height="30" border=0></a>'



///////do NOT edit pass this line////////////////////////////////////

var copyspeed=slidespeed
//copy contents of leftrightslide into one variable
for (i=0;i<leftrightslide.length;i++)
finalslide=finalslide+leftrightslide[i]+" "


if (document.all){
//dynamically write out the marquee tag
document.write('<marquee id="ieslider" scrollAmount=0 style="width:'+sliderwidth+'">'+finalslide+'</marquee>')
//stop marquee when mouse is over it
ieslider.onmouseover=new Function("ieslider.scrollAmount=0")
//re-enable marquee when mouse is out
ieslider.onmouseout=new Function("if (document.readyState=='complete') ieslider.scrollAmount=slidespeed")
}

function regenerate(){
window.location.reload()
}
function regenerate2(){
if (document.layers){
document.ns_slider01.visibility="show"
setTimeout("window.onresize=regenerate",450)
intializeleftrightslide()
}
if (document.all)
ieslider.scrollAmount=slidespeed
}

//NS specific function for initializing slider upon page load
function intializeleftrightslide(){
document.ns_slider01.document.ns_slider02.document.write('<nobr>'+finalslide+'</nobr>')
document. ns_slider01.document.ns_slider02.document.close()
thelength=document.ns_slider01.document.ns_slider02.document.width
scrollslide()
}

//NS specific function for sliding slideshow
function scrollslide(){
if (document.ns_slider01.document.ns_slider02.left>=thelength*(-1)){
document.ns_slider01.document.ns_slider02.left-=slidespeed
setTimeout("scrollslide()",100)
}
else{
document.ns_slider01.document.ns_slider02.left=sliderwidth
scrollslide()
}
}
window.onload=regenerate2

//-->
</script>

<font color="#000000>
<ilayer width=&{sliderwidth}; height=&{sliderheight}; name="ns_slider01" visibility=hide>

<!--~============ LAYER ============~-->
</font><layer name="ns_slider02" onMouseover="slidespeed=0;" onMouseout="slidespeed=copyspeed" id="layer1" left="50" top="50" width="200" height="200" z-index="1"></layer>
<!--~========== END LAYER ==========~-->
</ilayer>

출처:하늘다래

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


====================================================================
html문서 없이 새창으로 이미지 띄우기
====================================================================

<img src="이미지주소" name="ranimage" border="0">

<script language="JavaScript1.1">
<!--
document.ranimage.src="이미지가 들어있는 폴더"+Math.round(Math.random()*3+.4)+".gif";
// -->
</script>

출처: 하늘다래

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

출처 : http://www.apoka.net/

AND

====================================================================
쿠키를 이용해서 광고창 제어하는 소스
====================================================================

<html>
<head>
<title>Untitled</title>
</head>

<body>
<SCRIPT language="JavaScript">
<!--
function setCookie( name, value, expiredays )
{
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
}

function closeWin()
{
if ( document.test.chkbox.checked ){
setCookie( "notice0428", "done" ,30 );
}
self.close();
}

// -->
</SCRIPT>

<form name="test">
<p>여기에 원하시는 내용을 넣습니다.
<INPUT TYPE=CHECKBOX NAME="chkbox"><B>Do not open this window next time</B></font>
<input type=button value="close" onClick="closeWin();">
</form>
</body>
</html>
<!--start sima--><center><input type="button" value="View Source" onClick='window.location="view-source:"+window.location.href'><!--end sima-->

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


====================================================================
배경이 위쪽에만 나오게 하는 또다른 방법
====================================================================

<body bgcolor="" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" background="http://happyscript.com/testimage/bg3.jpg"; style="background-repeat:repeat-x" >

위쪽에만 반복적으로 나옵니다. ====================================================================


====================================================================
텍스트박스 안에 배경 이미지 넣기 textarea
====================================================================

<body>
일반 img tag을 이용해서 부른 경우입니다.<br>
<img src="http://happyscript.com/testimage/bg1.jpg"; xwidth=177 xheight=17 alt="" border="0">
<br>
텍스트박스(textare) 안에 스타일을 이용해서 배경이미지를 넣은 경우입니다.<br>
<textarea style="background-image:url(http://happyscript.com/testimage/bg1.jpg); width=313; height=416">
배경이미지와 텍스트가 같이 있습니다.
여기에서 텍스트를 입력할 수 있습니다.

====================================================================
배경색과 글자색을 바꿔주는 소스
====================================================================

<SCRIPT LANGUAGE="JavaScript">
<!--
function color() {
document.bgColor=(""+ colc.cc.value +""); // 배경색 부분
document.body.text=(""+ colc.tc.value +""); // 글자색 부분
}
//-->
</script>

<!--
폼 구성 부분
색 추가시는 간단히 option만 복사하여 늘려준 후 색을 적어주면 된다.
색은 아무거나 적어도 됨.. EX) black,#000000
//-->
<form name="colc">
<table border="1">
<tr>
<td colspan="2" align="center">
<b>Color Change</b>
</td>
</tr>
<tr>
<td align="center">
<b>배경색</b>
</td>
<td align="center">
<select name="cc" size="1">
<option value="black">Black
<option value="blue">Blue
<option value="green">Green
<option value="skyblue">Light Blue
<option value="orange">Orange
<option value="purple">Purple
<option value="red">Red
<option value="silver">Silver
<option value="Yellow">Yellow
<option selected value="white">White
</select>
</td>
</tr>
<tr>
<td align="center">
<b>글자색</b>
</td>
<td align="center">
<select name="tc" size="1">
<option selected value="black">Black
<option value="blue">Blue
<option value="green">Green
<option value="skyblue">Light Blue
<option value="orange">Orange
<option value="purple">Purple
<option value="red">Red
<option value="silver">Silver
<option value="Yellow">Yellow
<option value="white">White
</select>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" name="button" value="바꾸기" onclick="color()" style="width:100%">
</td>
</tr>
</table>
</form><input type=button name=simabuttonviewsource value="View Source" onClick='window.location="view-source:"+window.location.href'>

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

====================================================================
하루중 시간대에 따라 배경이 다른 자스
====================================================================

<script language="JavaScript">

<!-- Hide From Old Browsers

day=new Date() //..get the date

x=day.getHours() //..get the hour

if(x>=0 && x<4) {

document.write('<body background="../../../testimage/bg1.jpg">')

} else

if(x>=4 && x<12) {

document.write('<body background="../../../testimage/bg2.jpg">')

} else

if(x>=12 && x<18) {

document.write('<body background="../../../testimage/bg3.jpg">')

} else

if (x>=18 && x<24) {

document.write('<body background="../../../testimage/bg4.jpg">')

}

<!-- End Hiding -->

</script>

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

====================================================================
배경화면이 움직이는 자스
====================================================================

<BODY>

<script language="Javascript">
<!--
var background = "../../../testimage/bg8.jpg";
var speed = 0;

browserName = navigator.appName;
browserVer = parseInt(navigator.appVersion);

if (browserName != "Netscape" || browserVer >= 6) {

function moveback(movert,movedn,hPos,vPos) {

if (arguments[4])
document.body.style.backgroundImage = "url("" + arguments[4] + "")";

if (arguments[5])
document.body.style.backgroundRepeat = arguments[5]

if (!isNaN(hPos)) {
if ((movert!=0) && (hPos>0)) hPos=-100000
hPos += movert
}
if (!isNaN(vPos)) {
if ((movedn!=0) && (vPos>0)) vPos=-100000
vPos+= movedn
}
document.body.style.backgroundPosition= hPos + " " + vPos
if (isNaN(hPos)) hPos = """ + hPos + """
if (isNaN(vPos)) vPos = """ + vPos + """
setTimeout("moveback("+movert+","+movedn+","+hPos+","+vPos+")",speed)
}
moveback(1,1,0,0, background);
}
//-->
</script>


====================================================================
색이 줄단위로 바뀌는 테이블
====================================================================

<table border="0" width="500" height="200">
<tr onMouseOver="this.style.backgroundColor='#E8F6FF';return true;" onMouseOut="this.style.backgroundColor=''; return true;">
<td align=center><a href="'./sima_bbs.cgi?)">색이 줄단위로 바뀌는 테이블</a></font></td>
<td>--------------------------</td>
</tr>
</table>


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

====================================================================
페이지 들어갈때 배경색을 정하고 들어가는 소스
====================================================================

<body bgcolor="white" onload="var bg = prompt('색상코드를 입력해 주세요! 예: FF00FF',''); document.bgColor=bg;"><input type=button name=simabuttonviewsource value="View Source" onClick='window.location="view-source:"+window.location.href'>

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


====================================================================
색상-테이블의 색이 차츰차츰 변하게하는 자스 예제
====================================================================

<html>

<head>
<title>http://perlbbs.com<;/title>
<script language="javascript">
<!--
var tInC=null;
var tIdC=null;
var tIdCOn = new Array(0,0,0,0,0,0);
var tIdCOff = new Array(1,1,1,1,1,1);


function tBgFIn(obj, col,idNum) {
if(tInC != obj && tInC != null && tIdCOn[idNum] == 0) tBgFOut(tInC,tIdC);
if(tIdCOn[idNum] == 0) {
tIdCOn[idNum] = 1;
tIdCOff[idNum] = 0;
tInC=obj;
tIdC=idNum;
changeColor(obj, col);
}
}
function tBgFOut(obj,idNum) {
if(tIdCOff[idNum] == 0) {
tIdCOff[idNum] = 1;
tIdCOn[idNum] = 0;
changeColor(obj, "#ffffff");
}
}
function changeColor(obj, col) {
obj.filters.blendTrans.apply();
obj.style.backgroundColor= col;
obj.filters.blendTrans.play();
}
//-->
</script>

</head>

<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<TABLE border=0 width=100%>

<TR>
<TD colSpan=2 align=center>
<TABLE border=2 borderColor=#ff9900 cellPadding=3 cellSpacing=3
style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; BORDER-RIGHT: 0px; BORDER-TOP: 0px">

<TR><!-- 1 -->
<TD align=middle id=bgColorId1
onmouseover="tBgFIn(bgColorId1, '#CCFFCC',1)"
style="BACKGROUND-COLOR: #ffffff; FILTER: blendTrans(duration=0.3)"
vAlign=top width=120>
<TABLE bgColor=#ffff99 border=0
style="BORDER-TOP: rgb(255,153,0) 2px solid" width="100%">

<TR>
<TD width=100>
<P align=center><A
href="http://perlbbs.com"; terget=new><FONT
color=blue><B>마우스를 여기로 옮겨보세요</B></FONT></A></P></TD></TR></TABLE>
<P>이 테이블의 색이 점차적으로 변합니다.<BR></P></TD>
<TD align=middle id=bgColorId2
onmouseover="tBgFIn(bgColorId2, '#CCFFFF',2)"
style="BACKGROUND-COLOR: #ffffff; FILTER: blendTrans(duration=0.5)"
vAlign=top width=120>
<TABLE bgColor=#ffff99 border=0
style="BORDER-TOP: rgb(255,153,0) 2px solid" width="100%">

<TR>
<TD width=100>
<P align=center><A
href="http://perlbbs.com"; terget=new><FONT
color=blue><B>마우스를 여기로 옮겨보세요</B></FONT></A></P></TD></TR></TABLE>
<P>이 테이블의 색이 점차적으로 변합니다.<BR></P></TD>
<TD align=middle id=bgColorId3
onmouseover="tBgFIn(bgColorId3, '#FFFFCC',3)"
style="BACKGROUND-COLOR: #ffffff; FILTER: blendTrans(duration=0.5)"
vAlign=top width=120>
<TABLE bgColor=#ffff99 border=0
style="BORDER-TOP: rgb(255,153,0) 2px solid" width="100%">

<TR>
<TD width=100>
<P align=center><A
href="http://perlbbs.com"; terget=new><FONT
color=blue><B>마우스를 여기로 옮겨보세요</B></FONT></A></P></TD></TR></TABLE>
<P>이 테이블의 색이 점차적으로 변합니다.<BR></P></TD>

</TR></TABLE>
</body>

</html>
<!--start sima--><center><input type="button" value="View Source" onClick='window.location="view-source:"+window.location.href'><!--end sima-->

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


====================================================================
multiple select에 추가하는 예제~~
====================================================================

<HTML>
<HEAD>
<TITLE>apoka.net</TITLE>
<Script language=javascript>
<!--

function addPrd()
{
var frm = document.frmName1;

var add_value = frm.prd_group1[frm.prd_group1.selectedIndex].value;
var add_text = frm.prd_group1[frm.prd_group1.selectedIndex].text;

frm.prd_insert.options[frm.prd_insert.options.length] = new Option(add_text,add_value);
}

//-->
</script>
</HEAD>
<BODY>
<form name="frmName1">
<select name="prd_group1" style="width:190px;">
<option value="" selected>==대분류==</option>
<option value="01">apoka1</option>
<option value="02">apoka2</option>
<option value="03">apoka3</option>
<option value="04">apoka4</option>
</select>
<input type="button" value="추가" name="insetOK" onClick="addPrd()">
<select name="prd_insert" multiple style="width:100px;">
</select>
</form>
</BODY>
</HTML>

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

====================================================================
서브메뉴~~~~
====================================================================

<html>
<head>
<SCRIPT language=javascript>
var old='';

function menu(name)
{
submenu=eval("submenu_"+name+".style");
if(old!=submenu)
{
if(old!='')
{
old.display='none';
}
submenu.display='block';
old=submenu;
}
else
{
submenu.display='none';
old='';
}
}
</SCRIPT>
</head>
<body>

<a onclick="menu(1);" style="CURSOR:hand"><b>메뉴1</b></a>
<br>
<span id=submenu_1 style="DISPLAY: none;">
서브메뉴<br>
서브메뉴<p>
</span>

<a onclick="menu(2);" style="CURSOR:hand"><b>메뉴2</b></a>
<span id=submenu_2 style="DISPLAY: none;">
서브메뉴<br>
서브메뉴<p>
</span></body>
</html>

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

====================================================================
마우스 갖다대면 서브메뉴가~~
====================================================================

<html>
<head>
<title></title>
</head>

<style type="text/css">
<!--
body {font-family: "고딕", "Helvetica", "sans-serif"; font-size: 10px; xline-height:150%; color: #000000}
table {font-family: "고딕", "Helvetica", "sans-serif"; font-size: 10px; xline-height:100%; color: #000000}
A:link { text-decoration: none; color:#333333}
a:visited { color: #333333; text-decoration: none}
a:hover { color: blue; text-decoration: underline} -->
</style>

<script language="javascript">
<!--
var main_cnt = 6
function showhide(num) {
for (i=1; i<=main_cnt; i++) {
menu=eval("document.all.block"+i+".style");
imgch=eval("document.bar"+i);
if (num==i) {
if (menu.display=="block") {
menu.display="none";
imgch.src="+.gif";
}else {
menu.display="block";
imgch.src="-.gif";
}
//}else {
// menu.display="none";
// imgch.src="+.gif";
}
}
}

function show(num) {
for (i=1; i<=main_cnt; i++) {
menu=eval("document.all.block"+i+".style");
imgch=eval("document.bar"+i);
if (num==i) {
menu.display="block";
imgch.src="-.gif";
}else {
menu.display="none";
imgch.src="+.gif";
}
}
}

//-->
</script>
</HEAD>

<BODY>
<SCRIPT language="JavaScript">
document.cookie.expires="0";
</SCRIPT>
<center>
<TABLE borderColor=white cellSpacing=0 cellPadding=0 width=135 border=1>
<TR>
<TD xonclick="showhide(1);" onmouseover="this.style.backgroundColor='#ffffcc'; show(1);" style="CURSOR: hand" onmouseout="this.style.backgroundColor=''" borderColorLight=gray bgColor=#cccccc gray #e4e4e4 xheight=14>
<IMG name=bar1 src="+.gif" border=0 width=12 height=12>
A</TD>
</TR>
<TR>
<TD>
<SPAN id=block1 style="DISPLAY:none; MARGIN-LEFT:1px; xCURSOR:hand">
<TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 border=1 WIDTH="100%">
<TR height=12px onmouseover="this.style.backgroundColor='#ffffcc'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target=_top>
A-1</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ffffcc'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
A-2</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
A-3</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
A-4</a>
</TD></TR>
</TABLE>
</span>
</td>
</tr>

<TR>
<TD xonclick="showhide(2);" onmouseover="this.style.backgroundColor='#ccddff'; show(2);" style="CURSOR: hand" onmouseout="this.style.backgroundColor=''" borderColorLight=gray bgColor=#cccccc gray #e4e4e4 xheight=14>
<IMG name=bar2 src="+.gif" border=0 width=12 height=12>
<xa href="http://apoka.net"; target=_top>
B</a></TD>
</TR>
<TR>
<TD>
<SPAN id=block2 style="DISPLAY:none; MARGIN-LEFT:1px; xCURSOR:hand">
<TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 border=1 WIDTH="100%">
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
B-1</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
B-2</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
B-3</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<xA href="sub1-1">
B-4</a>
</TD></TR>
</TABLE>
</span>
</td>
</tr>

<TR>
<TD xonclick="showhide(3);" onmouseover="this.style.backgroundColor='#ccddff'; show(3);" style="CURSOR: hand" onmouseout="this.style.backgroundColor=''" borderColorLight=gray bgColor=#cccccc gray #e4e4e4 xheight=14>
<IMG name=bar3 src="+.gif" border=0 width=12 height=12>
<xa href="http://apoka.net"; target=_top>
C</a></TD>
</TR>
<TR>
<TD>
<SPAN id=block3 style="DISPLAY:none; MARGIN-LEFT:1px; xCURSOR:hand">
<TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 border=1 WIDTH="100%">
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
C-1</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
C-2 </a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
C-3</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
C-4</a>
</TD></TR>
</TABLE>
</span>
</td>
</tr>

<TR>
<TD xonclick="showhide(4);" onmouseover="this.style.backgroundColor='#ccddff'; show(4);" style="CURSOR: hand" onmouseout="this.style.backgroundColor=''" borderColorLight=gray bgColor=#cccccc gray #e4e4e4 xheight=14>
<IMG name=bar4 src="+.gif" border=0 width=12 height=12>
<xa href="http://apoka.net"; target=_top>
D</a></TD>
</TR>
<TR>
<TD>
<SPAN id=block4 style="DISPLAY:none; MARGIN-LEFT:1px; xCURSOR:hand">
<TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 border=1 WIDTH="100%">
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
D-1</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
D-2</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
D-3</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
D-4</a>
</TD></TR>
</TABLE>
</span>
</td>
</tr>

<TR>
<TD xonclick="showhide(5);" onmouseover="this.style.backgroundColor='#ccddff'; show(5);" style="CURSOR: hand" onmouseout="this.style.backgroundColor=''" borderColorLight=gray bgColor=#cccccc gray #e4e4e4 xheight=14>
<IMG name=bar5 src="+.gif" border=0 width=12 height=12>
<xa href="http://apoka.net"; target=_top>
E</a></TD>
</TR>
<TR>
<TD>
<SPAN id=block5 style="DISPLAY:none; MARGIN-LEFT:1px; xCURSOR:hand">
<TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 border=1 WIDTH="100%">
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<xA href="sub1-1">
E-1</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
E-2</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
E-3</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="right">
E-4</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<xa href="http://apoka.net"; target="right">
E-5</a>
</TD></TR>
</TABLE>
</span>
</td>
</tr>


<TR>
<TD xonclick="showhide(6);" onmouseover="this.style.backgroundColor='#ccddff'; show(6);" style="CURSOR: hand" onmouseout="this.style.backgroundColor=''" borderColorLight=gray bgColor=#cccccc gray #e4e4e4 xheight=14>
<IMG name=bar6 src="+.gif" border=0 width=12 height=12>
<xa href="http://apoka.net"; target=_top>
F</a></TD>
</TR>
<TR>
<TD>
<SPAN id=block6 style="DISPLAY:none; MARGIN-LEFT:1px; xCURSOR:hand">
<TABLE borderColor=#ffffff cellSpacing=0 cellPadding=0 border=1 WIDTH="100%">
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="new">
F-1</a>
</TD></TR>
<TR height=12px onmouseover="this.style.backgroundColor='#ccddff'" onmouseout="this.style.backgroundColor=''" bgColor=#e4e4e4 borderColorLight=gray>
<TD align=right valign=center>
<a href="http://apoka.net"; target="new">
F-2</a>
</TD></TR>
</TABLE>
</span>
</td>
</tr>
</table>

</body>
</html>


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


출처 : http://www.apoka.net/

AND

가장 많이 사용되어지는 레이어메뉴 자바스크립트

<script Language="JavaScript">
<!--
function MM_findObj(n, d) { //v4.0
var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
if(!x && document.getElementById) x=document.getElementById(n); return x;
}
function MM_showHideLayers() { //v3.0
var i,p,v,obj,args=MM_showHideLayers.arguments;
for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
obj.visibility=v; }
}
//-->
</script>

<body>부분..........

<span onMouseOver="MM_showHideLayers('layer1','','show','layer2','','hide')" style="cursor:hand">주메뉴1</span>
<br><br><span onMouseOver="MM_showHideLayers('layer1','','hide','layer2','','show')" style="cursor:hand">주메뉴2</span>

<div id="layer1" style="width:100px; height:200px; position:absolute; left:100px; top:85px; z-index:3; visibility:hidden;">
<a href="#">부메뉴</a><br>
<a href="#">부메뉴</a>
</div>


<div id="layer2" style="width:100px; height:200px; position:absolute; left:100px; top:108px; z-index:2; visibility:hidden;">
<a href="#">부메뉴</a><br>
<a href="#">부메뉴</a>
</div>

----------------------------------------------------------------------------------------------------------------------------------
5초후 자동으로 새창 띄우기
----------------------------------------------------------------------------------------------------------------------------------

html>
<head>
<title>apoka.net</title>
</head>
<body onload=cnt()>
<center>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td align="center">
<form name="form1" method="get">
<p align="center"><font size="2"><b><br> 5초후 자동으로 이동 합니다.</b></font><br>
<br>
<input type="text" name="text1" size="2" style="font-family:'Comic Sans MS'; font-size:60pt; text-align:center; border-width:0; border-style:solid;" readonly><br> <br>
</td>
</tr>
</table>
<script language="JavaScript">
<!--
if(document.all)document.write('<embed src="tting.wav" width="100" height="100" border="0" hidden="true" autostart="false"><embed src="tting2.wav" width="100" height="100" border="0" hidden="true" autostart="false">')
if(document.all)document.write('<bgsound id="kts">')
var timer1=null
var a=5
function cnt(){
form1.text1.value = a
a--
kts.src='tting.wav'
timer1=setTimeout('cnt()',1000)
if(a==-1){
kts.src='tting2.wav';
clearTimeout(timer1);
newwin= window.open('http://devpia.com','new','toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,resizeable=yes,width=1024,height=768,top=0,left=0')
}
}
//-->
</script>
</body>
</html>

----------------------------------------------------------------------------------------------------------------------------------
체크하면 테이블 색깔 바꾸기
----------------------------------------------------------------------------------------------------------------------------------
<html>
<SCRIPT LANGUAGE="JavaScript">
<!--
function check_user()

{

if (document.form.test1.checked == true)

{

obj1 = link_table.rows[0]; // 요건 테이블에 id를 주어서 거기의 row(즉 tr이 되겠죠.)를 변수로 선언하고

// obj1 = link_table.rows["aa"]; // 일케 해도 되요..

obj1.style.background = "red"; // 고넘의 속성을 변경시키는 겁니다.

}

else

{

obj1 = link_table.rows[0];

obj1.style.background = "white";

}

}
//-->
</SCRIPT>

<form name="form">

<BODY >

<table id="link_table" width="500" border="1">

<tr id="aa">

<td align=center ><input name="test1" type="checkbox" OnClick="check_user()"></td>

<td align=center >메뉴 1</td>

<td align=center >메뉴 2</td>

</tr>

</table>

</BODY>

</form>

</HTML>

----------------------------------------------------------------------------------------------------------------------------------
쿠키를 이용해서 북마크 페이지를 만드는 소스
----------------------------------------------------------------------------------------------------------------------------------
<script language="JavaScript">
<!--
var sepchar = "@"; // unique separator character
var BMtotal = 6; // max number of bookmarks permitted
var ShowCount = 0;
var expDays = 30; // 쿠키 지속 기간

var exp = new Date();
exp.setTime(exp.getTime() + (expDays*24*60*60*1000));

function ListBookmarks() {
var NumBookmarks = GetCookie('PT_NumBookmarks');
var i;
var Bookmark;

if (NumBookmarks == null) {
NumBookmarks = 0;
}
ShowCount = 0; SwapColour = 0;

for (i=1; i <= NumBookmarks ; i++) {
Bookmark = GetCookie('PT_Bookmark'+i);
if (Bookmark != null) {
PrintBookmark(Bookmark, i);
}
}
}

function DeleteBookmark(Count) {
DeleteCookie('PT_Bookmark'+Count);
window.location = window.location;
}

function PrintBookmark (Bookmark, Count) {
var pairs = Bookmark.split(sepchar);
pairs[0]= unescape(pairs[0]);
pairs[1]= unescape(pairs[1]);
var BMtitle = pairs[0];
var BMaddress = pairs[1];

ShowCount++; // 북마크 보여지는 부분의 소스 - <table>는 폼 구성 부분에.. -_-;;
document.write('<tr>');
document.write('<th width="90%"><a href="'+BMaddress+'"><font color="blue">'+BMtitle+'</font></a></th>');
document.write('<th width="10%"><a href="DeleteBookmark('+Count+')" onmouseover="window.status=''+BMtitle+'을/를 삭제합니다. (Count : '+Count+')'; return true" onmouseout="window.status=''; return true"><font color="blue">Delete</font></a></th>');
document.write('</tr>');
}

function AddBookmark(BMtitle, BMaddress) {
var NumBookmarks = GetCookie('PT_NumBookmarks');
var i;
var ToDoItem;
var Bookmark;
var OldestBookmark = 0;
var CountBookmarks = 0;

if (NumBookmarks == null) {
NumBookmarks = 0;
}

for (i=1; i <= NumBookmarks ; i++) {
Bookmark = GetCookie('PT_Bookmark'+i);
if (Bookmark != null) {
CountBookmarks++;
if (OldestBookmark == 0) {
OldestBookmark = i;
}
}

if (Bookmark == BMtitle+sepchar+BMaddress) {
alert(''+BMtitle+'이/가 북마크 되었습니다.'); // 북마크 되었다는 메세지
history.go(0); // 페이지 새로고침 - 북마크시 페이지 새로고침해야 나옴..
return; }
}

if (CountBookmarks > BMtotal) {
DeleteBookmark(OldestBookmark);
}

NumBookmarks++;
SetCookie('PT_Bookmark'+NumBookmarks, BMtitle+sepchar+BMaddress, exp);
SetCookie('PT_NumBookmarks',NumBookmarks, exp);
alert(''+BMtitle+'이/가 북마크 되었습니다.'); // 북마크 되었다는 메세지
history.go(0); // 페이지 새로고침 - 북마크시 페이지 새로고침해야 나옴..
}

function getCookieVal (offset) {
var endstr = document.cookie.indexOf (";", offset);

if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));

}

function GetCookie (name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;

while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
return getCookieVal (j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}

function SetCookie (name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;

document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");

}

function DeleteCookie (name) {
var exp = new Date();
exp.setTime (exp.getTime() - 1);
var cval = GetCookie (name);
document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}

function addurl() { // 폼의 값을 받는부분..
AddBookmark(''+document.cookie_bookmark.addurl_title.value+'','http://'+document.cookie_bookmark.addurl_url.value+'');
}


//-->
</script>

<!--
폼 구성 부분
아래 북마크 소스 출려하는 자스의 경우 꼭
<table>을 붙여줘야함..
//-->
<form name="cookie_bookmark" method="post">
<table border="0" width="300" cellspacing="0" cellpadding="2" style="border:1 solid #000000;">
<tr>
<th colspan="3" width="300">쿠키 북마크</th>
<tr>
<tr>
<th width="100">북마크 타이틀</th>
<td colspan="2" align="center" width="200"><input type="text" name="addurl_title" tabindex="1" style="width:100%;"></td>
</tr>
<tr>
<th width="100">북마크 경로</th>
<th width="45"><input type="text" value="http://"; style="width:45px;" tabindex="4"readonly></th>
<td align="center" width="155"><input type="text" name="addurl_url" tabindex="2" style="width:100%;"></td>
</tr>
<tr>
<td colspan="3" align="center" width="300"><input type="button" value="click" onclick="addurl();" tabindex="3" style="width:50%;"></td>
</tr>
<tr>
<td colspan="3" width="300"><Br>

<script language="JavaScript">
<!--
document.write('<table border="0" width="100%" cellspacing="0" cellpadding="2">');
ListBookmarks(); // 북마크를 출력하는 소스
document.write('</table>');
//-->
</script>
</td>
</tr>
</table>
</form>


----------------------------------------------------------------------------------------------------------------------------------
몇번째 방문했는지 알려주는 스크립트
----------------------------------------------------------------------------------------------------------------------------------
<head>

<script language="JavaScript">
<!--
function getCookieVal (offset) {
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
function GetCookie (name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
return getCookieVal (j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0)
break;
}
return null;
}
function SetCookie (name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (2 < argc) ? argv[2] : null;
var path = (3 < argc) ? argv[3] : null;
var domain = (4 < argc) ? argv[4] : null;
var secure = (5 < argc) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}

function DisplayInfo() {
var expdate = new Date();
var visit;
// Set expiration date to a year from now.
expdate.setTime(expdate.getTime() + (24 * 60 * 60 * 1000 * 365));
if(!(visit = GetCookie("visit")))
visit = 0;
visit++;
SetCookie("visit", visit, expdate, "/", null, false);
var message;
if(visit == 1)
message="감사합니다. Happy에 처음 오신분이군요.";
if(visit== 2)
message="다시 방문해 주셔서 감사합니다.";
if(visit == 3)
message="또 오셨군요. 감사합니다.";
if(visit == 4)
message="기쁩니다, 다시 뵙게 되어서.";
if(visit == 5)
message="요즘 어떻게 지내셨어요 ?";
if(visit == 6)
message="오늘은 자료실을 둘러 보시죠...";
if(visit == 7)
message="이제는 자주 들리시네요...";
if(visit == 8)
message="자주 뵙게되서 기쁘군요 !";
if(visit == 9)
message="오늘은 날씨가 어떤가요 ?";
if(visit >= 10)
message="언제 커피 한잔 하실래요!";
alert("n"+"어서오세요.nn"
+"이번이 "+visit+ "번째 방문입니다." + "nn"
+message);
}

function ResetCounts() {
var expdate = new Date();
expdate.setTime(expdate.getTime() + (24 * 60 * 60 * 1000 * 365));
visit = 0;
SetCookie("visit", visit, expdate , "/", null, false);
}
// -->
</script>
</head>
<body bgcolor="#f5f5f5"
text="#009999"
link="#0066cc"
vlink="#0066cc"
alink="#0099ff"
onLoad="DisplayInfo()">
<p align=CENTER>
<font face="굴림">
방문자에게 다른 메세지 보여주기
</font>
<p align="center">
<font face="굴림" size="2">
새로고침 을 해보세요<br>
그럼 인사말이 바뀔거예요
</font>
</body><input type=button name=simabuttonviewsource value="View Source" onClick='window.location="view-source:"+window.location.href'>

AND

일본IT취업

일본IT연수 2006. 6. 3. 08:47
AND