본문 바로가기

Programming/Database

데이터베이스 9강

# user 생성관리
  1.create user
  2. 권한 or Role부여(1. create role
                           2. role(권한부여)
                           3. role user.role부여)
  3. alter user(패스워드, 계정 풀거나 잠금)

# 조건부여
  alter table add constraint

# not null추가
  alter table dept
  modify a constraint dept_a_nn not null;

# table 생성
1. table 구조 만들기(컬럼 결정)
2. 무결성 보존(제약조건 부여)

insert into table()
values ();
1. insert 명시된 column 수 = values 수
2. insert 문장 1개가 1row
3. 문자, 날짜 값 insert 시 ' '
4. 무결성 지켜라(data type, length 맞는 data, 제약조건 지킬 것)

 

 

 

  DataBase : COLUMN을 오른쪽으로 작성해 나가면서 조건한정

  숫자 자리수 설정                  :  COLUMN point  format 0000000
  숫자형식 설정                      :  COLUMN department_id format 9999999
  문자형식 길이 설정 (길이 : 10)  :  COLUMN depart_name format a16

  값이 숫자 : ' ' 없이 값만 작성
  값이 문자 : '06%', 앞뒤 대체문자 표현해줘야 함
  값이 날짜 : '00/00/00 ' 년 월 일

  NOT
  BETWEEN AND
  IN ( , , , ,)
  LIKE ' '

  DESC
  ASC

  AVG( 컬럼 )

  테이블 2개 연결 : JOIN, 외래키와 기본키의 연결
  alias활용 : SELECT ( .컬럼 )으로 컬럼명 모두 설정

  e.hire_date가 빠름 : e.hire_date < m.hire_date

  WHERE : 일반 COLUMN의 조건
  HAVING : 그룹함수의 조건
  그룹함수 쓰임 : 그룹함수가 아닌 값들은 GROUP BY 적용


12. 이름에 a 및 e 글자가 있는 사원의 이름을 조회하시오.

  SELECT last_name
  FROM employees
  WHERE last_name LIKE '%a%' AND last_name LIKE '%e%';


14. 모든 사원들의 이름, 부서 이름 및 부서 번호를 출력하시오.

 SELECT e.employee_id, e.last_name, d.department_id, d.department_name
 FROM employees e, departments d
 WHERE e.department_id = d.department_id;


15. 30번 부서내의 모든 직업들을 유일한 값으로 출력하시오.
     90번 부서 또한 포함하고, 직업을 오름차순으로 출력하시오.

  SELECT DISTINCT job_id, department_id 
  FROM employees
  WHERE department_id IN (30, 90)
  ORDER BY job_id;


19. 각 직업별, 최대 급여, 최소 급여, 급여 총 합 및 평균 급여를 출력하시오.
     단 최대 급여는 MAX, 최소 급여는 MIN, 급여 총 합은 SUM 및
     평균 급여는 AVG로 출력하고, 직업을 오름차순으로 정렬하시오.

  SELECT job_id, MAX(salary) MAX, MIN(salary) MIN, SUM(salary) SUM, AVG(salary) AVG
  FROM employees
  GROUP BY job_id
  ORDER BY job_id


20. 동일한 직업을 가진 사원들의 총 수를 출력하시오.

  SELECT job_id, COUNT(employee_id)
  FROM employees
  GROUP BY job_id
  ORDER BY job_id


21. 매니저로 근무하는 사원들의 총 수를 출력하시오

  SELECT COUNT(DISTINCT manager_id)
  FROM employees



# SQL
  데이터 검색 SELECT
  데이터 조작 INSERT, UPDATE, DELETE, MERGE
  데이터 정의 CREATE, ALTER, DROP, RENAME, TRUNCATE
  트랜잭션 제어 COMMIT, ROLLBACK, SAVEPOINT
  데이터 제어 GRANT, REVOKE


# PARSE(파싱)
  1. 검증 : 검색하는 열이 테이블에 있는가 체크
  2. 실행계획 : 테이블에서 데이터를 어떻게 가져올 것인지 최적 경로를 설정
  3. 실행 : 데이터를 가져오기


# 정렬만 보고 문자, 숫자 판단
  컬럼헤딩 : 컬럼명은 대문자로 출력된다
  문자, 날짜값 : 왼쪽 정렬
  숫자값 : 오른쪽 정렬


# 그룹함수
  SELECT COUNT(*)
  FROM employees
  WHERE commission_pct IS NOT NULL;


# 그룹 함수는 NULL값을 인식 못함 : AVG 구할 때 NULL을 제외하고 계산
  SELECT AVG (nvl( commission_pct, 0)), SUM(commission_pct)/107
  FROM employees;


# WHERE 서브쿼리
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = (SELECT job_id
                      FROM employees
                      WHERE employee_id = 141)
AND salary > (SELECT salary
                  FROM employees
                  WHERE employee_id =143);


# HAVING 서브쿼리
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (SELECT MIN(salary)
                             FROM employees
                             WHERE department_id = 50);


# 10 20 30 40 50 60 
  (30, 40) 기준 출력

  IN (30, 40)
 >
  30, 40

  > ANY(30, 40) : 최소값보다 큰값 (30보다 큰)
 >
  40, 50 ,60
 
  < ANY(30, 40) : 최대값보다 작은값
 >
  10, 20 ,30

  > ALL(30, 40) : 전부보다 큰 값
 >
  50, 60

  < ALL(30, 40) : 전부보다 작은값
 >
  10, 20

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
                          (SELECT salary
                           FROM employees
                           WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

# 트랜잭션 : SQL만 트랜잭션 작동할 수 있음
             COMMIT, ROLLBACK


# 트랜잭션 작동
DML : insert, update, delete
        문장 전체를 하나의 트랜잭션으로 인식
DDL : create
       실행과 동시 OP COMMIT
DCL : grant
       실행과 동시 OP COMMIT


# 오늘 날짜
select sysdate from dual;


# 행 추가, 정렬은 안해줌
INSERT INTO departments(department_id, department_name)
VALUES(280, 'tyktyk');

select * from departments

rollback;


# 동시 다수 스크립트 파일 실행
save empinsert.sql
Created file empinsert.sql

C:\oraclexe\app\oracle\product\11.2.0\server\bin
empinsert.txt 실행


deadlock : 서로의 자원을 요구

트랜잭션을 작게 나누어서 사용하는 것을 권장 : 동시성 향상


char(5) : 미리 5칸 저장공간 확보, 성능 향상, 저장공간 낭비, 돈 많이 필요
varchar() : 크기를 보고 천천히 저장공간 할당, 성능저하, 저장공간 좋음


number - 안 씀
number(p) - 정수만 가능
number(p,s) - 최대 9자리, 두번쨰 자리는 소수점자리


# 서브쿼리를 활용하여 employees값 가져오는 테이블 생성
CREATE TABLE empsal80
AS SELECT last_name, salary
FROM employees
WHERE department_id = 80;

# 테이블 설정확인
DESC empsal80;

# 테이블 모든 값 확인
SELECT *
FROM empsal80;

#테이블 삭제
DROP TABLE empsal80;


# 컬럼 추가
ALTER TABLE test5
ADD ( c char(5));


# 데이터 추가
INSERT INTO test5(c)
VALUES('bb');


# 데이터의 변경
UPDATE test5
SET c='bb'
WHERE a = 10;


# 데이터 타입변경
ALTER TABLE test5
MODIFY (c number(5));


# 테이블 COLUMN 삭제
ALTER TABLE test5
DROP COLUMN c;


# 테이블 삭제
# 참조받는 테이블은 삭제불가
DROP TABLE test5;

# 삭제 명령
delete : data value삭제, data 저장구조 유지, table저장구조 유지, rollback으로 복구
    WHERE 사용
truncate : data value삭제, data 저장구조 삭제, table저장구조 유지, rollback으로 복구불가
    WHERE 없음
drop : data value삭제, data 저장구조 삭제, table저장구조 삭제, rollback으로 복구불가


# 제약조건
CREATE TABLE test5
(a number(3),
b number(3) NOT NULL,
c number(3),
CONSTRAINT test5_a_pk primary key(a),
CONSTRAINT test5_c_uk unique(c)
)


# 제약조건 추가
ALTER TABLE test5
ADD CONSTRAINT test5_d_uk unique(d);


# NOT NULL조건 추가는
MODIFY를 사용, ADD 안씀
MODIFY e CONSTRAINT test_e_nn NOT NULL;


DROP TABLE dept CASCADE constraints;
DROP TABLE emp CASCADE constraints;

CREATE table dept
(
deptno number(2),
dname varchar2(14) NOT NULL,
loc varchar2(13),
CONSTRAINT dept_deptno_pk primary key(deptno)
)
;

CREATE TABLE emp
(
empno number(4),
ename varchar2(10) NOT NULL,
job varchar2(9) NOT NULL,
mgr number(4),
hiredate date,
sal number(7, 2) NOT NULL,
comm number(7, 2),
deptno number(2),
CONSTRAINT emp_empno_pk primary key(empno)
)
;

ALTER TABLE emp
ADD CONSTRAINT emp_deptno_fk foreign key(deptno)
REFERENCES dept(deptno);

INSERT INTO dept
VALUES (10, 'Administration', 1700);

INSERT INTO dept
VALUES (20, 'Marketing', 1800);

INSERT INTO dept
VALUES (30, 'Purchasing', 1700);

INSERT INTO dept
VALUES (40, 'Human Resource', 2400);

INSERT INTO dept
VALUES (50, 'Shipping', 1500);



INSERT INTO emp
VALUES (100, 'king', 'AD_PRES', null, '1987-01-17', 24000, null, 10);

INSERT INTO emp
VALUES (101, 'Kochar', 'AD_VP', 100, '1989-09-21', 17000, null, 50);

INSERT INTO emp
VALUES (102, 'DE HAEN', 'AD_VP', 100, '1993-01-13', 17000, null, 50);

INSERT INTO emp
VALUES (103, 'Hunold', 'IT_POG', 102, '1990-07-03', 9000, null, 40);

INSERT INTO emp
VALUES (104, 'Ernst', 'IT_PROG', 103, '1997-07-25', 4800, null, 40);

COMMIT;

# 스크립트실행
@empdept.sql


# 뷰 : 테이블의 데이터 엑세스 제한

# 뷰 생성
CREATE VIEW empvu80
AS SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = 80;



# 테이블과 뷰의 차이점
테이블 : 테이블을 생성하면 저장공간 할당, 실제 데이터를 공간에 저장하여 처리
뷰 : 뷰를 생성하는 서브쿼리의 문장을 저장


# 인라인 뷰
SELECT a.last_name, a.salary, a.department_id, b.maxsal
FROM employees a, (SELECT department_id, max(salary) maxsal
                          FROM employees
                          GROUP BY department_id b
WHERE a.department_id = b.department_id
AND a.salary < b.maxsal



# TOP-N 분석
# rownum column : 출력이 되는 행의 순서번호를 출력
                         처음부터만 출력가능
SELECT rownum, last_name, salary
FROM employees;

# 정렬을 DESCENDING으로 연봉설정하고 rownum으로 상위 연봉 출력
# WHERE절이 ORDER BY보다 먼저 출력

SELECT rownum, last_name, salary
FROM (SELECT last_name, salary
FROM employees
ORDER BY salary)
WHERE rownum <4


SELECT rownum, last_name, annsal
FROM (SELECT last_name, 12*salary annsal
FROM employees
ORDER BY annsal)
WHERE rownum <4/


# 컬럼 이름을 작성해야 할 때 함수를 이름으로 포함하면 안됨
SELECT rownum, department_id, avgsal
FROM (SELECT department_id, AVG(salary) avgsal
         FROM employees
         GROUP BY department_id
         ORDER BY avgsal)
WHERE rownum < 6



# 정렬하지 않고 순위처리 (시험 나옴)
SELECT last_name, salary, rank() over  (order by salary)
FROM employees


# 인덱스가 설치되면 table full stack이 아닌 인덱스를 탐색(인덱스 스캔)
# 검색 속도향상(4% 미만의 검색일 때 좋음)
# 범위 검색할 때 인덱스가 좋음
# SELECT가 좋음
# DML은 안 좋음
# 고급 프로그래머는 인덱스로 데이터베이스 튜닝



# 시퀀스
번호를 중복되지 않게 생성
공유 가능
primary key를 생성할 때 할당
한 번 추출된 시퀀스는 다시 추출 안됨, 간격이 발생해서 연속 숫자가 아님

# 시퀀스의  start with는 바꿀 수 없음, 이미 생성한 시퀀스의 중복 발생
  새로 추출하는 값부터 INCREMENT BY 적용

# 시퀀스 제거  : DROP을 해도 추출한 시퀀스는 다시 안 나옴


# 1. 테이블 생성
table : 데이터를 저장할 수 있는 창고
CREATE TABLE test (a numbe(7), b char(7), CONSTRAINT test_a_pk primary key(a));

# 2. 데이터 삽입
INSERT INTO test
VALUES(10, 'b');

INSERT INTO test
VALUES(60, null);


# 데이터 딕셔너리는 오라클 서버가 관리해서 내용을 못 지움

# DBA로 접속 (시험)
conn system/12345

# 최 상위 DBA로 접속
CONN /as sysdba

# 유저 생성 (시험)
CREATE USER test
identified by test;

# 패스워드 변경 (시험)
alter user test
identified by test1;

# 잠긴패스워드 풀어주기 (시험)
alter user test
account unlock;

# 패스워드 잠금
alter user test
account lock;

# 회원가입
grant create session to test;

# 권한부여
grant create table to test;
grant connect, resource to test;

# 권한 회수
revoke create session from test;
revoke connect, resource from test;

# 유저 삭제
drop user test cascade;



# with grant option : DBA로부터 권한을 받은 사용자가 다른 사용자에게 옵션의 권한을 이양할 수 있게 함
# with admin option : 시스템으로부터 권한 이양받음
# 권한은 종속적으로회수됨

'Programming > Database' 카테고리의 다른 글

자동 COMMIT조건  (0) 2020.06.15
사용자 생성 테이블 삭제  (0) 2020.06.15
데이터베이스 8강  (0) 2020.03.10
데이터베이스 7강  (0) 2020.03.10
데이터베이스 6강  (0) 2020.03.10