본문 바로가기

_스타디

실무DB_2주차

반응형

============================
스풀하기
============================
모든 실습내용은 캡쳐하여 제출하여야 합니다.
캡쳐(스풀) 방법은 다음과 같습니다.

SQL>spool d:\1주차실습.txt

이후의 모든 내용은 위 화일명으로 캡쳐됩니다.
실습 종료 후 다음과 같이 스풀을 종료합니다.

SQL>spool off

저장된 화일을 메모장으로 열어 과제부분을 맨 앞으로 편집한 후
이클래스에 제출합니다


*** 실습문제를 잘라내기해서 앞에 붙여넣기 해야함.
---------------------------------------------------------------------

SELECT문의 기본 (교재 39쪽 참조)

SQL에서 모든 검색질의는 SELECT문으로 처리한다

===========
테이블 전체 보기
===========
select * from emp;
select * from dept;
select * from bonus;

=============
특정 컬럼 전체 보기
=============
select ename from emp;
select ename, job from emp;
select dname from dept;

비교해 보기
--------------
select job from emp;
select distinct job from emp;
--->무엇이 달라졌나?

다음을 수행하면?
select unique job from emp;

 

distinct -> 중복 제거

==> unique는 ORACLE에서만 작동함.잊어버려라.

==========
연산자의 사용
==========
select ename, sal, sal+300  from emp;
select ename, sal, 12*sal+100  from emp;
select ename, sal, 12*(sal+100) from emp;

=======
Alias의 사용 
========
select ename NAME, sal Salary
from emp;

=========
조건식의 사용 
=========
select ename, job, deptno
from emp
where job = 'CLERK';

비교----
select ename, job, deptno
from emp
where job = 'clerk';
----> 결과는?

-----> 결과없음.

대소문자 구분함.



select ename, sal
from emp
where sal BETWEEN 1000 AND 1500;

select ename, sal, mgr
from emp
where mgr in (7902, 7566);

where mgr in ( 7902, **** , **** ~~~)
이 값에 해당하는거 출력.


ENAME             SAL        MGR
---------- ---------- ----------
SMITH             800       7902
SCOTT            3000       7566
FORD             3000       7566

===========
Wild Card의 사용 
===========
select ename
from emp
where ename like 'S%';

--> 처음에 S, 그 뒤는 아무거나


select ename
from emp
where ename like '_A%';

---> _ 만큼 글자수를 세면서 그 뒤는 상관없음. 두번째만 a면 충-분.


%와 _의 차이점을 이해했는가???

======================================
만약 "_" 를 포함하는 이름을 찾는다면????
_은 wild card의 특수 문자이므로 잠시 기능을 멈추어야 한다
즉, wild card 기능으로부터 잠시 탈출해야함!!!

 

--> ' \ ' 이거 우겨넣기
======================================
select ename
from emp
where ename like '%\_%' escape '\';

결과는? 

이제 다음과 같이 레코드를 하나 삽입 후에 실행해보자

INSERT INTO EMP VALUES (7950, 'LEE_HK', 'MANAGER',   7839, '85-10-09',  2450, 2000, 10);
commit;

select ename
from emp
where ename like '%\_%' escape '\';

=========
널값 처리하기
=========
select ename, mgr
from emp
where mgr is null;

=========
정렬 출력하기
=========

select ename
from emp
order by ename; <-- order by 하고 항목 나열 가능. 저거 기준으로 정렬함.

select ename
from emp
order by deptno;

내림차 순으로 출력하려면?

select ename
from emp
order by deptno desc;

==========
숫자함수(48쪽)
==========

select round(45.926,2), trunc(45.926,2)
from dual;

select abs(-2), ceil(3.9)
from dual;

ROUND - > 반올림
TRUNC -> 소숫점 n자리에서 자르기
ABS -> 절댓값
CEIL -> 가우스 상수 ( 어떤 값보다 큰 최대정수.)

 


=============
문자함수 예제(49쪽)
=============

select ename, sal, mgr
from emp
where ename = 'blake';

select ename, sal, mgr
from emp
where lower(ename) = 'blake';

lower --> 소문자화

 



select ename, sal, mgr
from emp
where upper(ename) = 'BLAKE';

select ename, sal, mgr
from emp
where initcap(ename) = 'Blake';

INITCAP -> 첫글자만 대문자화

 



select ename, sal, mgr
from emp
where lower(ename) = 'blake';

select ename, sal, mgr
from emp
where upper(ename) = 'BLAKE';

UPPER --> 대문자화

 


select initcap(ename)
from emp;


select lpad(ename, 10, '*')
from emp;

PAD  >> LPAD / RPAD
왼쪽에 글자수만큼 지정해주고 없는자리에 문자 채우기.
왼쪽에서부터 / 오른쪽에서부터.



select rpad(ename, 10, '*')
from emp;

***문자열 연결하기***

select initcap(ename)||'의 잭책은 '||lower(job)||'입니다.'
from emp;

|| ==> 파이프문자. 두개를 연달아 써줌.
SMITH 의 직책은 JOB 입니다.


***문자열 골라내기***

다음을 실행하고 결과를 알아보자

select ename, substr(ename,-3,3) from emp;

이름이 TH로 끝나는 직원을 찾아보자

글자 세서 빼서 가져가기.
끝에서부터 세번째. 그 자리부터 셈.
공백도 셉니다.



select ename
from emp
where substr(ename,-2,2) = 'TH';

문자열의 길이와 특정문자열의 위치 칮기
select ename, length(ename), instr(ename, 'A')
from emp;


=========
날짜처리(52쪽)
=========

//다음 질의를 실행해보고 비교하시오

select empno, ename, to_char(hiredate, 'fmYY/MM/DD')
from emp;
select empno, ename, to_char(hiredate, 'fmYYYY-MM-DD DAY')
from emp;

select empno, ename, to_char(hiredate, 'YY/MM/DD')
from emp;
select empno, ename, to_char(hiredate, 'YYYY-MM-DD DAY')
from emp;

****조건식에서의 날짜처리****

select ename 
from emp
where hiredate = 80/12/17;

---->날짜는 숫자가 아님! 다음과 같이

select ename 
from emp
where hiredate = '80/12/17';

=======================
시스템으로부터 날짜, 시각 구해오기
=======================
select sysdate
from dual;

select to_char(sysdate, 'YYYY-MM-DD DAY')
from dual;

select to_char(sysdate, 'fmDD Month YYYY') from dual;
select to_char(sysdate, 'fmHH : MI : SS') from dual;
select to_char(sysdate, 'fmHH : MI : SS AM') from dual;

============
Null값의 처리(54쪽)
=============

모든 직원의 이름과 업무추진비를 구해보자

select ename||'의 업무추진비는 '||comm||'원 입니다'
from emp;

원하는 결과가 아니다
-----> 어찌해야할까?

select ename||'의 업무추진비는 '||NVL(comm,0)||'원 입니다'
from emp;

이번에는 연봉을 구해보자
연봉 = salary * 12 + 업무추진비(commission)

select ename NAME, 12*sal+comm
from emp;

---->정확한 결과인가? 
다음을 수행해보자

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


실습 과제 
*************************************************************************************
1. 1982년에 입사한 직원의 이름과 입사일을 출력하라
select ename, hiredate from emp where substr(hiredate , 1, 2) = 82;
2. 상사직원을 가지지 않는 직원(BOSS)를 찾아라
select ename , job, deptno from emp where job = 'PRESIDENT';
3. 1982년 이후로 입사한 직원의 이름과 입사일을 구하라.
select ename, hiredate from emp where substr(hiredate , 1, 2) > 82;
4. 업무추진비를 1,000 이하로 받는 직원의 이름과 업무추진비를 구하시오.
  주의!! (다음 질의는 잘못되었다. 이를 바로 잡고 정확한 질의식을 작성할 것!!)

   select ename, comm
   from emp
   where comm<=1000 OR comm is NULL;

*************************************************************************************

 

 

반응형