Oracle(27일차)

Posted by seunggwon
2009. 7. 24. 13:00 Web Develop Note/Oracle
* 권한(부여/회수)
- 시스템권한 : system관련권한, dba~, 연쇄회수 X
- 객체권한 : 객체관련권한, 객체소유자 

*권한부여
grant 권한, [권한, ...]
to user명

grant create session
to jj1;


*user생성
create user user명
identified by 비번
[with admin option]

- sys에서 
jj1 생성
create user jj1
identified by jj1;

jj2 생성-------------------------> jj3부여
create session 부여
[with admin option]


jj3 생성


jj3에게 create session권한 부여
jj2에서...
grant create session
to jj3
with admin option


* 권한조회
select ~ 
from user_sys_privs;

select *
from user_sys_privs;


* 권한 회수
revoke 권한, [권한, ...]
from user명

jj1으로부터 session권한을 회수...
revoke create session
from jj1

jj2로부터
create session 권한 회수
revoke create session
from jj1;


super user에서

super.dept 객체 --> jj3가 super.dept
select
insert
update
delete

select * 
from super.dept;


* 권한부여
grant 권한[, 권한, ...]
on 객체명
to user명
[with grant option]

grant select
on dept
to jj3

select *
from super.dept


jj3상태에서 
super.dept 테이블에 
임의 데이터 입력
insert into super.dept
values(60, '', '');
권한이 불충분...

super에서 jj3에 insert, update, delete 권한부여
grant insert, update, delete
on dept
to jj3;

insert into super.dept
values(60, '', '');

update super.dept
set dname='권한연습중'
where deptno=60;

delete super.dept
where deptno=60;


super.dept ---> jj1 super.dept ---> jj2 super.dept
select select
update

jj1 : create session
jj2 : create session 을 가질수 있게...

grant create session
to jj1, jj2;

conn super/man

grant select, update
on dept
to jj1
with grant option;

conn jj1/jj1

grant select
on super.dept
to jj2;

conn jj2/jj2

select *
from super.dept;

객체권한 조회
select *
from user_tab_privs;

객체권한 받은것
select *
from user_tab_privs_recd;

객체권한 준것
select *
from user_tab_privs_made;


권한회수
revoke 권한[, 권한, ...]
on 객체명
from user명;


super
jj3로부터 super.dept
select, insert, update, delete 회수
revoke select, insert, update, delete
on dept
from jj3;


super는 
jj1으로부터 dept객체에 대한 select, update 권한을 회수합니다.

revoke select, update
on dept
from jj1;

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

* Role
: 권한집합

- DBA
- CONNECT
- RESOURCE

*role 생성
create role role명

- role에 권한부여
- role에 권한회수

-sys에서
role roletest
- create session, create table, drop table

grant create session, create table, drop any table
to roletest;

jj1 user에게 roletest 부여
grant roletest
to jj1;

create session권한을 roletest에서 회수
revoke create session
from roletest

jj1 user로부터 roletest 회수
revoke roletest
from jj1


* role 삭제
drop role role명

drop role roletest;


select *
from user_role_privs;

select * 
from role_sys_privs;

Oracle(Test_1) - SELECT query문 종합문제

Posted by seunggwon
2009. 6. 22. 13:05 Web Develop Note/Oracle

1. 부서 번호가 10번인 부서의 사람 중 사원번호, 이름, 급여를 출력해라.
select empno, ename, sal
from emp
where deptno=10;

2. 사원번호가 7369인 사람 중 이름, 입사일, 부서번호를 출력해라.
select ename, hiredate, deptno
from emp
where empno=7369;

3. 이름이 ALLEN인 사람의 모든 정보를 출력하여라.
select *
from emp
where ename='ALLEN';

4. 입사일이 87/04/19인 사원의 이름, 부서번호, 급여를 출력해라.
select ename, deptno, sal
from emp
where hiredate='87/04/19';

5. 직업이 MANAGER가 아닌 사람의 모든 정보를 출력해라.
select *
from emp
where  job!='MANAGER';

6. 입사일이 81/04/02 이후에 입사한 사원의 정보를 출력해라.
select *
from emp
where hiredate>'81/04/02';

7. 급여가 800이상인 사람의 이름, 급여, 부서번호를 출력해라.
select empno, sal, deptno
from emp
where sal>=800;

8. 부서번호가 20번 이상인 사원의 모든 정보를 출력해라.
select *
from emp
where deptno>=20;

9. 입사일이 81/12/09보다 먼저 입사한 사람들의 모든 정보를 출력해라.
select *
from emp
where hiredate<'81/12/09';

10. 사원번호가 7698보다 작거나 같은 사람들의 입사번호와 이름을 출력해라.
select empno, ename
from emp
where empno<=7698;

11. 입사일이 81/04/02보다 늦고 82/12/09보다 빠른 사원의 이름, 급여, 부서번호를 출력해라.
select ename, sal, deptno
from emp
where hiredate between '81/04/20' and '82/12/09';

12. 급여가 1600보다 크고 3000보다 작은 사람의 이름, 직업, 급여를 출력해라.
select ename, job, sal
from emp
where sal>1600 and sal<3000;

13. 사원번호가 7654와 7782사이 이외의 사원의 모든 정보를 출력해라.
select *
from emp
where empno not between 7654 and 7782;

14. 입사일이 81년 이외에 입사한 사원의 모든 정보를 출력해라.
select *
from emp
where hiredate not between '81/1/1' and '81/12/31';

15. 직업이 MANAGER와 SALESMAN인 사원의 모든 정보를 출력해라.
select ename, empno
from emp
where job in('MANAGER', 'SALESMAN');

16. 부서번호가 20, 30번을 제외한 모든 사원의 이름, 사원번호를 출력해라.
select ename, empno
from emp
where deptno not in(20, 30);

17. 이름이 S로 시작하는 사원의 사원번호, 이름, 입사일, 부서번호를 출력해라.
select empno, ename, hiredate, deptno
from emp
where ename like 'S%';

18. 입사일이 81년도인 사원의 모든 정보를 출력해라.
select *
from emp
where hiredate between '81/1/1' and '81/12/31';

19. 이름 중 S자가 들어가 있는 사람만 모든 정보를 출력해라.
select *
from emp
where ename like '%S%';

20. 이름이 S자로 시작하고 마지막 글자가 T인 사람의 모든 정보를 출력해라.(이때, 이름의 전체 글자수는 5자리이다.)
select *
from emp
where ename like 'S___T';

21. 첫 번째 문자는 관계없고 두 번째 문자가 A인 사원의 모든 정보를 출력해라.
select *
from emp
where ename like '_A%';

22. 커미션이 NULL인 사람의 정보를 출력해라.
select *
from emp
where comm is null;

23. 부서가 30번 부서이고 급여가 500이상인 사람의 이름, 부서, 급여를 출력하라.

select ename, deptno, sal
from emp
where deptno=30 and sal>=500;

24. 이름의 첫 글자가 K로 시작하거나 부서번호가 30인 사람의 사원번호, 이름, 부서번호를 출력하라.
select empno, ename, deptno
from emp
where ename like 'K%' and deptno=30;

25. 급여가 1500이상이고 부서번호가 30번인 사원중 직업이 MANAGER인 사원의 모든 정보를 출력하여라.
select *
from emp
where sal>=1500 and deptno=30 and job='MANAGER';

Oracle(3일차) - WHERE(비교연산자, 논리연산자, null검색)

Posted by seunggwon
2009. 6. 22. 13:00 Web Develop Note/Oracle

* 비교연산자
a=b : a는 b와 같다.
a<>b : a와 b는 같지 않다.
a>b : a는 b보다 크다(초과)
a>=b : a는 b보다 크거나 같다(이상)
a<b : a는 b보다 작다(미만)
a<=b : a는 b보다 작거나 같다(이하)

- 예제
1. 급여가 1500이상 2850이하 사원출력

select ename, sal
from emp
where sal>=1500 and sal<=2850
order by sal asc;
혹은
select ename, sal

from emp
where sal between 1500 and 2850
order by sal asc;

*논리연산자
or, and, not

*in(값, 값, ...)

not in(값, 값, ...)

예제
1. 사원명, 부서번호조회
부서번호가 10 또는 20 조회
 select ename, deptno
 from emp
 where deptno=10 or deptno=20 -> 같은 의미로  where deptno in(10, 20)
                                             -> 부정의의미 where deptno not in(10, 20)
 order by deptno asc;

2. 10과 30사이

select ename,deptno
from emp
where deptno not between 10 and 20
order by deptno asc;

*연결연산자 : ||
*함수명(~, ~, ~) parameter, argument, 인수, 인자

concat(표현식, 표현식) 인수가 2개밖에 들어갈수 있다.
현재날짜와 시간조회

*2009/06/22 09:41:30 이런형태로 출력하려면...
to_char(날짜, '날짜시간Format') 중요함...
to_char(sysdate, 'yyyy/mm/dd hh:mi:ss')

select sysdate, to_char(sysdate, 'bc yyyy/mon/dd day hh24:mi:ss am')
from dual;

* alter session set nls_date_format='날짜시간format'

*조건
select ~
from 테이블명
[where 조건]
[order by 정렬기준 정렬방법];

- 데이터타입 : 문자. 날짜 '~'

예제
- allen의 사원번호, 급여, 입사일조회
select empno, sal, hiredate
from emp
where ename='ALLEN';

*소문자를 대문자로 변환하는 함수
upper(~)

예제
select empno, sal, hiredate
from emp
where ename=upper('allen');

*lower(~)
대문자를 소문자로 출력시키는 함수

*앞글자만 대문자로...
initcap(~)

select empno, sal, lower(ename), initcap(ename), hiredate
from emp
where ename=upper('allen');

81/09/28에 입사한 사원명, 입사일, 급여, 커미션 조회
select ename, hiredate, sal, comm
from emp
where hiredate='81/09/28';

- 예제
1. xx번 부서는 ~~~ =>  출력 concat함수 + ~ 사용
select concat(deptno, concat('번 부서 : ', dname))
from dept;
OR
select deptno||concat('번 부서 : ', dname)

from dept;

2. 커미션이 확정된 사원의 사원번호, 사원명, 급여, 커미션 조회
select empno, ename, sal, comm
from emp
where comm is not null;

3. 2번 결과내 급여가 1500이상인 사원번호, 사원명, 급여, 커미션 조회
select empno, ename, sal, comm
from emp
where comm is not null and sal>=1500;

4. 3번의 결과를 급여 오름차순 조회
select empno, ename, sal, comm
from emp
where comm is not null and sal>=1500;
order by sal asc;

5. 10번 또는 20번 부서에 근무하는 사원들의
부서번호, 사원명, 급여, 커미션, bonus를 bonus 오름차순, 동일보너스 내 사원명 오름차순
bonus=기본커미션+300 커미션이 null이면 50을 기본 커미션으로 한다.
select deptno, ename, sal, nvl(comm, 50), nvl(comm, 50)+300 as bonus
from emp
where deptno in(10, 20)
order by bonus asc, ename asc;

Oracle(2일차) - SELECT(select 문법, 특정컬럼조회, 정렬, null의 의미)

Posted by seunggwon
2009. 6. 19. 13:00 Web Develop Note/Oracle

* select 문법
select {* | 컬럼명}
from table명
order by 정렬기준 정렬방법, [정렬기준 정렬방법];

* 특정컬럼조회
- dept(부서테이블)

DEPTNO : 부서번호 (기본키 = primary key)
DNAME : 부서명
LOC : 지역

- emp(사원)

EMPNO : 사원번호 (기본키 = primary key)
ENAME : 사원명
JOB : 업무
MGR : 상사
HIREDATE: 입사일
SAL : 급여
COMM : 커미션
DEPTNO : 부서번호 (외래키 = foreign key)

- salgrade(급여등급)

GRADE : 호봉
LOSAL : 최저임금
HISAL : 최고임금

- 예제
1. dept 테이블에서 부서번호와 부서명 조회
select deptno, dname
from dept;

2. 사원테이블에서 사원번호, 사원명, 업무, 업무입사일 조회

select empno, ename, job, hiredate
from emp;

3. 사원테이블에서 사원번호, 사원명, 급여, 커미션, 부서번호 조회

select empno, ename, sal, comm, deptno
from emp;

* 정렬
오름차순(asc) : 숫자 작음 -> 큼 , 문자 a->z A->Z ㄱ->ㅎ날짜 예전->최근
내림차순(desc) : 숫자 큼 -> 작음, 문자 z->a Z->A ㅎ->ㄱ 날짜 최근->예전

*distinct : 중복되는 컬럼을 한번씩만 보여줌

- 예제
1. 부서테이블에서 부서명 내림차순 조회
select distinct *
from dept
order by dname desc;


2. 동일부서내 급여를 많이 받는 사원부터 조회
select *
from emp
order by sal desc;

3. 동일부서내에 급여를 많이 받는 사원부터 출력하되 급여가 동일하다면 이름 오름차순
select *
from emp
order by sal desc, ename asc;

* 별칭
- 칼럼명 [as] 칼럼alias
- 칼럼명 "칼럼alias" : "~~"에는 소문자, 대소문자, 공백, 한글

* null의 의미
0(zero)도 아니고, 빈공간도 아니다. 
미확정(해당사항 없음), 알수 없는(unknown) 값을 의미한다.
어떤 값인지 알 수 없지만 어떤 값이 존재하고 있다.
? 혹은 ∞의 의미이므로 연산, 할당, 비교가 불가능하다.

*산술연산
+, -, *, /

* dual 테이블
산술연산이나 가상컬럼 등의 값을 한번만 출력하고 싶을 때 많이 사용하는 테이블

- 예제
오늘 날짜를 한번만 출력
select sysdate
from dual;