레이블이 DB인 게시물을 표시합니다. 모든 게시물 표시
레이블이 DB인 게시물을 표시합니다. 모든 게시물 표시

2013년 2월 11일 월요일

[DB] 도서 대여점 관리 프로그램

간단한 요구사항 분석자료를 통해 ER 다이어그램을 그려보았다.


요구사항 분석

1. 도서에 대해서 도서번호, 도서명, 출판사, 지은이, 장르, 가격, 대여유무,
    등록일을 저장한다. 도서번호에는 장르와 위치를 넣어서 도서를 찾기 쉽게한다.

2. 도서는 코믹스, 순정, 애정판, 소설, 월간지 장르로 구분한다. 장르마다 대여료와
     대여기간, 연체금이 정해져 있다. 도서는 한 장르에만 속해 있다. 대여 중인
     책은 대여 될 수 없다.

3. 회원에 대해서 회원번호, 이름, 전화번호, 주소, 대여 중인 책, 마일리지를 저장한다.
    회원은 도서를 대여 할 수 있다. 회원은 여러 권의 책을 동시에 빌릴 수 있다.
    회원은 도서를 대여할 때마다 대여금액의 10%를 마일리지로 적립받을 수 있고,
    도서를 대여할 때 현금처럼 사용할 수 있다.

4. 사원에 대해서 사원번호, 이름, 주소, 전화번호, 비밀번호를 저장한다.
    사원은 고객등록, 도서등록, 도서대여, 도서반납, 고객조회를 할 수있다.
    사원중에 사원을 관리하는 관리자가 있어서 사원을 추가/삭제를 할 수 있고,
    일별, 월별, 연별 매출액을 조회할 수 있다.


사원, 회원, 도서 세 개의 기본테이블을 중심으로 회원관리, 대여, 도서관리라는 행위테이블이 만들어져 있다. 요구사항을 최대한 반영하기 위해 생각해 본 ER 다이어그램이다.

사실 SQL문으로 성능을 향상시키는 것도 중요하나 그것보다도 더욱 중요한 것은 데이터베이스의 설계라 생각한다. 설계시 요구사항을 최대한 반영할 수 있음은 물론이거니와 테이블의 관계 및 정규화 작업까지 단순하게 생각할 것이 아니다.

[DB] TOP-N SQL, INDEX, VIEW, SEQUENCE


* TOP-N SQL
select alias.*, rownum from
(select employee_id, last_name, hire_date from employees order by hire_date) alias
where rownum <= 5

select * from
(select temp.*, rownum r from
(select * from board order by seq) temp)
where r between 3 and 6


### INDEX ###
DB안에 데이터를 매번 full scan하여 찾는 것은 성능과 비용이 좋지 못하다.
따라서 너무 잦은 full scan을 줄이고 일정한 검색 속도를 보장하기 위해
인덱스를 사용한다.

인덱스를 만들면 각각의 인덱스에 따른 ROWID(주소값)가 부여되고 자동적으로
B-TREE구조로 데이터가 정렬된다.

인덱스의 사용순서
1. 인덱스를 생성하면서 ROWID를 부여(한번의 full scan)
2. B-TREE 구조 정렬
3. 검색
4. B-TREE에서 인덱스에 해당하는 ROWID반환
5. ROWID로 검색

일정한 속도가 보장된다.
그러나 insert 및 update의 요청으로 인한 인덱스 데이터가 누적되기
때문에 성능면에서 좋지 못하다.

### VIEW ###
실제 데이터값은 없으나 뷰를 통해서 원하는 데이터를 테이블처럼 다룰 수
있다.
사용이유 : 조인 횟수를 줄일 수 있고 원하는 데이터만 추려놓거나
보일 필요가 없는 데이터를 숨기기 위한 용도로 사용된다.
create view emp30 as
select e.employee_id, e.last_name, d.department_name from employees e
join departments d on e.department_id = d.department_id
where d.department_id = 30

### SEQUENECE ###
- 자동증가

create sequence 테이블명_컬럼명_seq
start with 1 //시작
increment by 2 //2씩 증가
maxvalue = 10000 //최대값
cycle //최대값을 찍고 처음으로 돌아감

create sequence emp07_empno_seq;

insert into emp07 values(emp07_empno_seq.nextval, 'kim', 'IT', 1234);
시퀀스는 한번 증가하면 되돌릴 수 없다.
글번호 카운팅
1. 시퀀스
2. 기존의 글 번호 + 1

[DB] 서브쿼리


하위 질의문으로써 전형적으로 where절에서 사용한다.
예를 들어보자.
예) 평균급여보다 많은 급여를 받는 직원의 이름과 급여를 출력하시오.
select avg(salary) from employees
를 하여 평균급여를 구한 뒤
select last_name, salary from employees where salary > 평균급여

이렇듯 하나의 질의문의 결과를 얻기 위해 두번의 질이과정을 거치고 있다. 이는 번거로운 작업니다. 이를 해결하기 위해 서브쿼리를 사용한다.

select last_name, salary from employees
where salary > (select avg(salary) from employees)
어떤 조건을 위해 where 절에 또다시 select하는 것이 서브쿼리이다.

문제) 직무별(job_id) 최대급여자의 사원내역을 출력하라.
select * from employees where (salary, job_id) in(select max(salary), job_id from employees group by job_id)
중요한 문제!
서브쿼리로 받는 값이 두개 이상이 될때는 in을 사용하여 값을 받아야한다. (=연산자로는 두개 이상의 값을 받을 수 없다.) 그리고 where절에서 salary 컬럼만으로 직무별 최대값을 구하면 같은 직무가 중복 출력되는 것을 볼 수 있다. 그 이유는 job_id를 salary의 최대값과 같이 처리해 주지 않았기 때문에 최대급여와 같은 다른 직무도 출력되는 것이다.

글만으로는 알아보기 어렵겠지만 명령문을 유심히 살펴보고 나름의 이해를 하도록 노력하자.

- update 문에서 서브쿼리 사용
문제) 20번 부서 이름을 30번 부서 이름으로 변경하여라.
update dept02 set department_name = (select department_name from dept02 where department_id = 30) where department_id = 20


문제1) student 테이블과 department 테이블을 이용하여 이윤나 학생과 1전공(deptno1)이 동일한 학생들의 이름과 전공이름을 출력하라.
select name, dname from student s, department d where s.deptno1 = d.deptno and
s.deptno1 = (select deptno1 from student where name = '이윤나')

문제2) professor 테이블에서 입사일이 송도권 교수보다 나중에 입사한 사람의 이름과 입사일, 학과명을 출력하라.
select p.name, p.hiredate, d.dname from professor p, department d where p.deptno = d.deptno and p.hiredate > (select hiredate from professor where name = '송도권')

* 다중 행 sub query
in => 같은 값을 가진 다중 행 출력
all => 해당하는 서브쿼리의 범위 최대, 최소 값을 반환
any => 해당하는 서브쿼리의 값들을 모두 반환

위의 설명만으로 이해하기 어렵다. 예제를 통해서 이해해보자
문제1) emp02 테이블을 사용하여 전체 직원중 과장 직급의 최소 연봉보다 연봉이 높은 이름과 직급, 연봉을 출력하시오.
select name, position, pay from emp02 where pay > any(select pay from emp02 where position = '과장')

문제2) student 테이블을 조회하여 각 학년별로 최대 키를 가진 학생들의 학년과 이름, 키를 출력하시오.
select grade, name, height from student where height, grade in (select max(height), grade from student group by grade)

[DB] DML


* INSERT 문
insert into 테이블명(컬럼명들) values(컬럼값들)
insert into dept01(deptno, dname) values(20, 'IT')

* UPDATE 문
update 테이블명 set 컬럼명 = 수정값, 컬럼명 = 수정값 where 수정할 대상

문제) emp00 테이블에서 salary가 3000불 이상 대상자는 salary를 10%인상하여라.

update emp00 set salary = salary * 1.1 where salary >= 3000


* delete 문(Rollback 가능, TRUNCATE는 Rollback 불가능)
delete from 테이블명 where 삭제대상
delete from emp01 where dname = 'IT'

* 트랙잭션
- 하나의 작업처리 단위
- COMMIT : 트랜잭션이 성공적으로 완료
- ROLLBACK : 트랜잭션 중 에러등으로 인해 실패했을 때 트랜잭션 단위의 작업전체를 취소
- DDL(create, truncate) => 자동 커밋
- DML(delete, update, insert) => 트랜잭션 관리 대상

JDBC에서 트랜잭션 수행
try{
 1번 작업(주문내역 추가)
 2번 작업(재고내역 감소)
 3번 작업(배송내역 추가)
 COMMIT();//트랜잭션 성공
1~3번 작업이 하나의 트랜잭션이다. 따라서 2번에서 에러가 발생 했을 때 commit()이 되지 못하고 catch문으로 간다.
}catch(Exception e){
 예외발생시 이곳에서 예외처리.
 ROLLBACK();//트랜잭션 되돌리기
}

[DB] JOIN


2개 이상의 테이블에서 원하는 데이터를 얻기위해 사용. 찾고자 하는 데이터가 다른 테이블에 존재할 때 기본 테이블의 주키를 이용하여 다른 테이블의 컬럼을 참고할 수 있다.

JOIN을 위해 주키와 외래키에 대해 잘 알아야 한다.

오라클에 연습용 테이블을 이용해 실습을 해보자.
문제> 'King'의 부서이름을 출력하시오.
King의 부서이름은 departments라는 테이블에 department_name으로 확인할 수 있다. 그러나 'King'이라는 이름은 employees테이블의 last_name을 통해 알 수 있으니 두 테이블의 조인을 통하여 원하는 값을 얻을 수 있다. 따라서 명령문은 다음과 같다.
select department_name from employees, departments
where employees.department_id = departments.department_id
and employees.last_name = 'King'

department_id를 서로 공유하는 컬럼이기 때문에 이를 통하여 서로의 값을 참조하는 조인테이블을 만들 수 있다.

테이블 명이 길 경우 이름을 변경하는 것도 가능하다. 위와 같은 결과 같을 나타내는 명령문이다.
select d.department_name from employees e, departments d
where e.department_id = d.department_id
and e.last_name = 'King'

JOIN의 또다른 방법이 존재한다. 명령어는 다음과 같다. 이 방법을 ANSI 조인이라 한다.
select d.department_name from employees
join departments on employees.department_id = departments.department_id
where employees.last_name = 'King'

* 조인 사용방법
1. 원하는 데이터는 무엇인지 명확히하라.
2. 원하는 데이터가 어느 테이블에 있는지 확인하라.
3. 원하는 데이터가 다른 테이블에 있다면 공통된 컬럼이 무엇인지 확인하라.(department_id)

mission> 'Sales'부서에 소속사원의 이름, 입사일과 부서이름을 출력하라.
select last_name, hire_date, department_name from employees
join departments on employees.department_id = departments.department_id
where departments.department_name = 'Sales'

* 3개 조인
사원이름, 부서번호, 부서이름, 직종번호, 직종이름, 도시이름
select e.last_name, e.department_id, d.department_name, j.job_id, j.job_title,
l.city from employees e, departments d, jobs j, locations l
where e.department_id = d.department_id and e.job_id = j.job_id
and d.location_id = l.location_id

* ANSI 조인
select e.last_name, e.department_id, d.department_name, j.job_id, j.job_title,
l.city from employees e
join departments d on e.department_id = d.department_id
join jobs j on e.job_id = j.job_id
join locations l on d.location_id = l.location_id

여기까지가 INNER 조인이다. INNER 조인은 두 개 이상의 테이블의 조인시 테이블에서 공통된 값을 출력한다. 그러나 공통이 되지 않은 데이터지만 확인이 필요한 데이터를 출력할 때가 있다. 이때 OUTER 조인이 필요하다.

* OUTER 조인
데이터가 존재하는 곳을 기준으로 공통되지 않는 데이터까지 출력한다.
즉, INNER JOIN에서 누락되는 데이터를 출력하도록 할 때 사용한다.
다음의 명령문을 보자.
select employee_id, last_name, hire_date from employees
where TO_CHAR(hire_date, 'YYYY-MM') between '1999-01' and '1999-06'

그러면 11개의 데이터가 출력된다. 여기서 부서이름까지 출력한다면 다음과 같다.

select employee_id, last_name, hire_date, department_name
from employees e, departments d
where e.department_id = d.department_id and
TO_CHAR(hire_date, 'YYYY-MM') between '1999-01' and '1999-06'

이렇게되면 10개의 데이터가 출력되면서 하나의 데이터가 빠진다. 그 이유는 department_id는 존재하나 department_name이 없는 경우 INNER JOIN에 의해 데이터가 제외되기 때문이다. 즉 공통된 데이터가 아니기 때문에 제외되는 것이다. 따라서 다음과 같이 OUTER 조인을 하면 모든 데이터를 확인 할 수 있다.

select employee_id, last_name, hire_date, department_name
from employees e, departments d
where e.department_id = d.department_id(+) and
TO_CHAR(hire_date, 'YYYY-MM') between '1999-01' and '1999-06'


또는

select employee_id, last_name, hire_date, department_name
from employees e left join departments d on e.department_id = d.department_id
where TO_CHAR(hire_date, 'YYYY-MM') between '1999-01' and '1999-06'

이렇게 누락되는 컬럼에 +를 시키던지 LEFT JOIN이라고 표현하여 오른쪽 테이블을 기준으로 왼쪽 테이블에 누락된 데이터를 JOIN시킴으로써 데이터를 누락시키지 않도록한다.

그러나 실무에서는 OUTER 조인은 조심스럽다. LEFT 조인을 하게되면 full 스캔을 하게된다.
따라서 성능면에서 비용이 발생한다.

* SELF 조인
자기자신을 참조하는 조인
select A.last_name, B.last_name from employees A, employees B
where A.manager_id = B.employee_id
A의 매니저는 B의 직원아이디를 뜻한다.
SELF 조인에서 INNER 조인을 하였다. 그렇기 때문에 두 테이블의 공통의 데이터만을 출력한다.

[DB] 테이블, 제약조건


CREATE TABLE 테이블이름(
 컬럼이름1 데이터타입,
 컬럼이름2 데이터타입,
 컬럼이름3 데이터타입,
 제약조건
);

데이터타입의 종류
- 문자형 : char(size), varchar2(size) <- 가변형
- 숫자형 : number, number(w), number(w, d)
- 날짜형 : date
- 대용량(이미지, 파일) : LOB

테이블 복사
CREATE TABLE emp01 AS SELECT * FROM employees;

테이블 구조만 복사
CREATE TABLE emp02 AS SELECT * FROM employees WHERE 1 = 0;

테이블 구조 수정
- 새로운 컬럼 추가
ALTER TABLE emp02 ADD(job varchar2(30));

- 기존 컬럼 수정
ALTER TABLE emp02 MODIFY(job varchar2(50));

- 기존 컬럼 삭제
ALTER TABLE emp02 DROP(job);
또는
ALTER TABLE emp02 DROP column job;

테이블 삭제
DROP TABLE emp02 PURGE;//쓰레기 데이터 값까지 제거

테이블 로우(row) 삭제
TRUNCATE table emp01;
DELETE FROM emp01;
두 명령어의 차이는 DELETE는 ROLLBACK이 가능해서 데이터를 되돌릴 수 있는 반면 TRUNCATE는 ROLLBACK이 불가능하다는 것

테이블 쓰레기값 삭제
PURGE recyclebin;

테이블 이름 변경
RENAME emp01 to emp02;

테이블 정의
CREATE TABLE emp03(
 empno number(4),
 empname varchar2(10),
 job varchar2(10),
 deptno number(4)
);

ROW 추가
INSERT INTO emp03 values(1, '홍길동', 'IT', 30);

ROW 추가시 명시적 컬럼 추가
INSERT INTO emp03(empno, empname, job) values(1, '박찬호', 'IT');

ROW 추가시 null문자로 추가
INSERT INTO emp03 values(1, null, null, null);

제약조건(데이터를 추가, 수정, 삭제하는 과정에서 DB의 무결성 유지)

CREATE TABLE emp04(
 empno number(4) NOT NULL, //반드시 입력해야하는 제약조건
 empname varchar2(10),
 job varchar2(10) PRIMARY KEY,//식별자로써 주키이다. 유일한 키값이고 반드시 입력
 deptno number(4) UNIQUE //중복되는 값을 배제(유일한 값)
);

테이블의 제약조건을 읽어냄
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
 FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'EMP04';

CONSTRAINT_TYPE
P - PRIMARY KEY
R - FOREIGN KEY(REFERENCES)
U - UNIQUE
C - NOT NULL, CHECK

테이블 선언에서 주키와 외래키 설정하기
CREATE TABLE emp05(
 empno number(4),
 empname varchar2(10),
 job varchar2(10),
 department_id number(4)

 CONSTRAINT emp05_empno_PK PRIMARY KEY(empno),
 CONSTRAINT emp05_department_id_ FK FOREIGN KEY(department_id)
 REFERENCES departments(department_id)
);

테이블을 만든 뒤 나중에 제약을 설정

CREATE table emp06(//테이블 수정 방식
empno number(4),
empname varchar2(10),
job varchar2(10),
department_id number(4)
);

ALTER TABLE emp06 ADD CONSTRAINT emp06_empno_PK PRIMARY KEY(empno);
ALTER TABLE emp06 ADD CONSTRAINT emp06_department_id_FK FOREIGN KEY(department_id) REFERENCES departments(department_id);

제약조건 삭제
ALTER TABLE emp06 DROP CONSTRAINT emp06_empno_PK

CHECK (의도한 데이터만 입력받기 위해 설정)
CREATE TABLE emp07(
 empno number(4),
 empname varchar2(10),
 job varchar2(10),
 gender varchar2(1) CHECK(gender IN('M', 'F'))//M, F 둘중 하나의 값만 허용
);
INSERT INTO emp07 values(100, '홍길동', 'IT', 'M');

DEFAULT 제약조건
CREATE TABLE emp08(
 deptno number,
 dname varchar2(20),
 loc varchar2(20) DEFAULT 'seoul', //값을 입력하지 않으면 디폴트로 seoul입력
);
INSERT INTO emp08(deptno, dname) values(10, '홍길동');

[DB] 함수


1. 그룹함수(SUM, AVG, MAX, MIN, COUNT...)
- SUM() 인자값으로 컬럼을 지정. 해당컬럼의 합계 산출
SELECT SUM(salary) AS 인건비 FROM employees;

- AVG() 해당컬럼의 평균 산출
SELECT AVG(salary) AS 평균급여 FROM employees;

- MAX() 컬럼의 최대값
SELECT MAX(salary) AS 최대급여 FROM employees;

- MIN() 컬럼의 최소값
SELECT MIN(salary) AS 최소급여 FROM employees;

- COUNT() 컴럼의 수
SELECT COUNT(salary) AS 글로자 수 FROM employees;

GROUP BY (특정 컬럼의 값들을 각 값별로 묶어서 결과를 출력, 그룹함수를 적용할 때 사용한다. 단순히 group by에 기술된 컬럼만 출력한다면 distinct와 같은 결과.)
- 사원테이블에 부서별로 각 그룹의 부서 아이디와 평균 연봉 출력
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id;

잘못된 출력명령
SELECT department_id, last_name, AVG(salary) FROM employees GROUP BY department_id;(부서별로 그룹을 묶었으나 출력하는 컬럼에 last_name이 존재한다. last_name을 어떠한 기준으로 출력할 방법이 없다.)

HAVING (특정 그룹의 조건을 지정)
- 그룹별로 부서 아이디와 연봉이 10000이상인 부서 출력
SELECT department_id, AVG(salary) FROM employees GROUP BY department_id
HAVING AVG(salary) >= 10000;

- 부서별로 사원의 수와 커미션을 받는 사원의 수를 카운트하여 출력
SELECT department_id, COUNT(department_id), COUNT(commission_pct)
FROM employees GROUP BY department_id HAVING COUNT(commission_pct) IS NOT NULL

2. 숫자함수
- MOD() 나머지값 리턴
SELECT MOD(1, 3) "나머지 값" FROM dual;(dual은 가상의 테이블)

- ROUND() 반올림
SELECT ROUND(899.2356, -2) "반올림" FROM dual;
(두 번쨰 인자가 -2변 소수점 위 2번째 자리 반올림, 2라면 소수점 아래 2번째 자리 반올림)

- TRUNC() 반올림 버림
SELECT TRUNC(899.2356, 2) "반올림버림" FROM dual;

3. 문자열함수
- LOWER() 대문자를 소문자로
SELECT LOWER('DataBase') FROM dual;

- UPPER() 소문자를 대문자로
SELECT UPPER('DataBase') FROM dual;

- SUBSTR() 부분문자열 추출
SELECT SUBSTR('Korea Economy', 3, 8) FROM dual;
3->추출문자 시작, 8->추출문자로부터 출력할 문자갯수

- LENGTH() 문자열길이 추출
SELECT LENGTH('DataBase') FROM dual;

4. 날짜함수
- SYSDATE
SELECT SYSDATE-1 AS 어제, SYSDATE AS 오늘, SYSDATE+1 AS 내일 FROM dual;

- 근무일수 구하기
SELECT last_name, SYSDATE - hire_date FROM employees;

5. 변환함수 (데이터형변환 + 포멧변경)
- TO_CHAR() 해당하는 숫자, 날짜 형태의 데이터를 문자열로 변환
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD DY') FROM dual;

숫자를 문자로
SELECT TO_CHAR(2000, '&999,999') FROM dual;

입사년도 출력
SELECT * FROM employees WHERE TO_CHAR(hire_date, 'YYY') = '1997';

- TO_DATE() 숫자, 문자형태의 데이터를 날짜형으로 변환
SELECT last_name, hire_date FROM employees
WHERE hire_date = TO_DATE(19970625, 'YYYY/MM/DD');

-TO_NUMBER() 정수형으로 변환
SELECT TO_NUMBER('10,000', '999,999') + TO_NUMBER('20,000', '999,999') FROM dual;

6. 기타함수
- DECODE() 케이스문처럼 사용
SELECT job_id, DECODE(job_id, 'ST_MAN', 'Salse DEPT', 'SH_CLERK', 'SALES DEPT', 'Another') FROM employees WHERE job_id LIKE 'S%';

문제) department_id가 80일 경우 Accounting, 50일 경우 Sales, 30일 경우 Invocation
SELECT department_id, DECODE(department_id, 80, 'Accounting', 50, 'Sales', 30, 'Invocation') FROM employees;

- NVL() 데이터값이 NULL인 경우 0 또는 다른 값으로 변환
SELECT employee_id, salary, NVL(commission_pct, 0) FROM employees;

문제) job_id순서로 사원의 연봉을 출력. 연봉 = (salary * 12) + commission_pct
SELECT last_name, salary * 12 + NVL(commission_pct, 0) AS 연봉 FROM employees
ORDER BY job_id ASC;

이상 몇가지 함수를 정리해 보았다. 더많은 함수들은 따로 더 찾아보고 공부하자

[DB] SELECT


기본적인 SELECT 구문 (SQL문 마지막에는 세미콜론이 항상 붙여야 하지만 OracleXEUniv 버전에서는 안붙여도 된다. 하지만 꼭 세미콜론을 붙이는 습관을 가지자.)

- table 정보 출력
SELECT * FROM TAB;

- 해당 테이블의 구조(정보)를 알고자 할때
DESC (해당테이블);

- 사원테이블의 전체 컬럼내용에 대한 데이터 출력
SELECT * FROM employees;

- 사원테이블 중 원하는 컬럼내용(employee_id, last_name, salsry)에 대한 데이터 출력
SELECT employee_id, last_name, salary FROM employees;

- 컬럼명 대신 별칭으로 출력
SELECT employee_id "사원번호", last_name AS "사원명", salary 연봉 FROM employees;
AS는 일반적으로 생략되고 이중인용부호는 공백이 있는 경우에 사용한다. 따라서 공백이 없다면 단순히 컬럼명 뒤에 원하는 별칭을 붙이면 된다.


WHERE 조건 

- 사원테이블에 성이 King인 사람 찾기
SELECT * FROM employees WHERE last_name = 'King';(대소문자 구문하고 홀따옴표 중요)

- AND연산자를 이용해 봉급이 10000 이상 20000 이하인 사람의 사원번호와 성, 봉급 출력
SELECT employee_id, last_name, salary FROM employees
WHERE salary >= 10000 AND salary <= 20000;

- BETWEEN연산자를 이용하여 위에 예제와 같은 데이터 출력
SELECT employee_id, last_name, salary FROM employees
WHERE salary BETEWEEN 10000 AND 20000;

- OR연산자를 이용하여 직업 아이디가 FI_MGR 이거나 FL_ACCOUNT인 사람의 사원번호, 고용일, 봉급, 직업 아이디 출력
SELECT employee_id, hire_date, salary, job_id FROM  employees
WHERE job_id = 'FI_MGR' OR job_id = 'FL_ACCOUNT';

- IN연산자(해당하는 컬럼 모두 출력)를 이용하여 직업 아이디가 'FI_MGR', 'FL_ACCOUNT', 'SA_MGR' 인 사람의 사원번호, 고용일, 봉급, 직업 아이디를 출력
SELECT employee_id, hire_date, salary, job_id FROM employees
WHERE job IN('FI_MGR', 'FL_ACCOUNT', 'SA_MGR');

- DISTINCT (중복 제거)를 사용하여 직업 아이디를 출력
SELECT DISTINCT job_id FROM employees;

- 비교연산자를 사용하여 97년도에 입사한 사원의 모든 정보를 출력
SELECT * FROM employees WHERE hire_date >= '1997/01/01' AND hire_date <= '1997/12/01';

- 부서테이블에서 부서번호가 10인 데이터 모두 출력
SELECT * FROM departments WHERE department_id =10;

- NOT연산자를 이용하여 위의 예제가 10이 아닌 데이터 모두 출력
SELECT * FROM departments WHERE NOT department_id = 10;

- 위의 예제에서 또다른 not 사용해 출력
SELECT * FROM departments WHERE department_id <> 10;

- LIKE연산자(검색과 관련해 자주 쓰임)를 사용하여 97년에 입사한 사원의 아이디, 성, 고용일을 출력
SELECT employee_id, last_name, hire_date FROM employees
WHERE hire_date LIKE '97%';

- LIKE 또다른 예제-
1. last_name이 K로 시작하는 row를 출력
SELECT employee_id, last_name, hire_date FROM employees
WHERE last_name LIKE 'K%';
2. last_name이 o로 끝나는 row를 출력
SELECT employee_id, last_name, hire_date FROM employees
WHERE last_name LIKE '%o';
3. last_name 중간에 a를 포함하지 않는 사원의 모든 정보를 출력
SELECT * FROM employees WHERE last_name NOT LIKE '%a%';

-ORDER BY(정렬)을 이용하여 고용일을 오름차순으로 정렬하고 사원 아이디, 성, 고용일을 출력
SELECT employee_id, last_name, hire_date FROM employees
ORDER BY hire_date ASC;

[DB] 데이터베이스


유용하고 의미있는 정보를 관리하고 저장하기 위해 데이터베이스를 사용한다.
데이터의 수가 십만개 또는 몇백만개는 크지도 않지만 오늘날 빅데이터가 이슈화되고 있는 시점에서 실시간으로 생성되는 데이터의 수는 어마어마하다.

따라서 Oracle, MS SQL, MY SQL과 같은 DBMS, 즉 데이터베이스를 관리해 주는 소프트웨어가 필요하다.

앞으로 Oracle을 위주로 공부한다. 그 이유는 가장 널리 사용되어지고 성능과 비용이 좋기 때문이다. 하지만 데이터베이스의 구축보다는 어떻게 활용을 할것인가에 초점을 맞출것이고  데이터베이스 설계의 측면에서는 프로그래머가 되어 많은 역량을 쌓으면서 차츰 데이터를 보눈 눈을 높여가면서 계속적으로 공부해나가야할 분야일 것 같다.

앞으로의 순서는 대략 다음과 같다.

1. SELECT 문을 활용한 데이터 선택
2. 함수
3. TABLE 생성과 제약조건 설정
4. JOIN
5. VIEW, SQUENCE, INDEX
6. DB모델링

일단 간단한 SELECT문에 대해 알아보자

SELECT : 원하는 Column을 선택
FROM : 해당 테이블 지정
WHERE : 조건 설정
DISTINCT : 중복제거
ORDER BY : 정렬(ASC오름차순, DESC내림차순)

예를 들어 다음과 같다.
SELECT Column FROM Table WHERE 조건 ORDER BY 정렬필드 [ASC, DESC]