블로그 이미지
'무른모'란 부드럽다라는 뜻을 가진 '무르다'라는 말과 도구, 연장을 뜻하는 '연모'라는 순 우리말의 합성어로 소프트웨어를 말합니다. seanhigher

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total633,812
Today36
Yesterday88
데이터베이스에는 수많은 데이터들이 수도없이 들락날락 거린다. 이렇게 수도없이 변경되는 데이터를 효율적으로, 그리고 일관성있게 관리한다는 것은 굉장히 어려운 일중 하나라고 할 수있다. 이런 어려운 일을 도와주는 특별한 기능들이 오라클 속에는 들어있다.



데이터의 순서를 기억해주는 ROWNUM
어떤 테이블을 생성하고 데이터를 입력하던지간에 데이터에는 순서가 정해지게 되는데, 그 순서를 기억하는 보이지 않는 컬럼이 ROWNUM 이다. ROWNUM은 데이터가 테이블에 입력되는 순서대로 순위가 정해지기 때문에 중간에 새로운 데이터가 들어가게 되면 데이터의 순서는 엉망이 되어버린다. 물론 데이터가 들어간 순서를 알고자 한다면 상관이 없지만... 그래서ROWNUM 의 경우는 인라인뷰로 생성하여 데이터를 정렬하고자 할때, 그리고 상위 몇번째까지의 데이터를 얻고자 할때 사용할 수 있다.

SELECT employee_id, last_name, hire_date, salary
    FROM (SELECT employee_id, last_name, hire_date, salary FROM employees ORDER BY salary DESC)
        WHERE ROWNUM <= 5;

위의 쿼리문은 급여가 가장많은 상위 다섯명의 정보를 얻어올 수 있다.


자동으로 순서를 증가시켜주는 SEQUENCE
새로운 데이터가 입력될때마다 자동으로 일정 값 만큼 증가시키고 싶다면 시퀀스 기능을 사용할 수 있다. 시퀀스를 만들고 그것을 테이블의 컬럼에 적용을 하면, 데이터가 새롭게 입력될 때마다 숫자를 입력시키지 않아도 자동으로 순서번호가 들어가게 된다.

CREATE SEQUENCE 시퀀스명;
INSERT INTO 테이블명 VALUES(시퀀스명.NEXTVAL);
SELECT 시퀀스명.CURRVAR FROM DUAL;

시퀀스는 그 자체로 NUMBER 형태의 데이터 타입을 가지기 때문에, 데이터 타입에 맞추어서 시퀀스를 넣어주어야 한다. 일반적으로 시퀀스명은 테이블명_컬럼명_SEQ 의 형태를 갖게 된다. 위에서 첫번째 쿼리문은 시퀀스를 생성하게 되는데, 다양한 조건으로 시퀀스를 생성할 수 있다. START WITH 는 초기값을 나타내고, INCREMENT BY 는 증가값을 나타낸다. MAXVALUE 는 최대값을 나타낸는데, CYCLE 이 YES일 경우 최대값을 넘으면 다시 초기값부터 시작하게 된다. NEXTVAL은 시퀀스의 다음 값을 가져올 수 있고, CURRVAR은 시퀀스가 가지고 있는 현재의 값을 가져오게 된다. 시퀀스를 사용할때 주의해야 할 점은 데이터의 오류가 발생하더라도 시퀀스 번호는 증가한다는 것이다.그리고 그 시퀀스는 다시 되돌릴 수 없다!!


데이터를 빠르게 찾는 방법 INDEX.
일반적으로 데이터를 찾기 위해서는 순차적으로 검색을 하게 된다. 이럴경우, 찾고자 하는 데이터가 테이블의 가장 나중에 있다면 굉장히 많은 시간이 걸리게 될 것이다. 이러한 문제점을 해결하기 위한 방법중의 하나가 인덱스를 사용하는 것이다. 인덱스는 B트리를 사용하여 어떠한 데이터든지 동일한 횟수만에 접근을 하는것이 가능하다. 인덱스를 이용한 데이터의 검색 속도는 그것을 사용하지 않았을때와는 비교하지 못할만큼 비약적이기 때문에, 대용량의 데이터를 사용하는 경우라면 인덱스를 사용하는 것이 일반적이다. 인덱스는 각 데이터를 구분짓는 유일한 데이터여야 하기때문에 일반적으로 기본키를 인덱스로 적용하게 된다.

CREATE INDEX 인덱스명;
CREATE 인덱스명 ON 테이블명(컬럼명);

위와 같이 인덱스를 적용하게 되면 좀더 빠르게 데이터에 접근을 하는 것이 가능하다. 일반적으로 인덱스명은 INDEX_테이블명_컬럼명 의 형식으로 생성하게 된다.

Posted by seanhigher

댓글을 달아 주세요

데이터베이스에서 가장 중요한 역할을 하는 것은 '조인' 연산이라고 할 수 있다. 데이터베이스에 많은 데이터가 있지만, 그 데이터를 얼마나 효율적으로 가져오는지가 중요하다. 이 과정이 조인이 필요한 이유이다.



JOIN 연산
일반적으로 데이터베이스에 있는 데이터를 가져오기 위해서는 'SELECT'문을 사용하게 되는데, 기본적인 셀렉트 문을 사용해서는 하나의 테이블안에 있는 데이터밖에는 가져오지 못한다는 문제점이 있다. 조인 연산은 둘 이상의 테이블에 있는 데이터를 가져올 수 있도록 해준다. 만일 employees 테이블에 'King' 이라는 사람의 부서 이름을 구하고자 한다. 하지만, employees 테이블에는 department_id 만 있을뿐 부서의 이름은 찾을 수가 없다. 하지만, departments 라는 테이블에서 department_id를 통해 부서의 이름을 알 수는 있다. JOIN 연산을 하지 않는다면, employees 에서 department_id 를 검색한후 department_id 를 가지고 departments 테이블에서 찾아낸 department_id 에 맞는 부서의 이름을 검색하여 결과를 얻어내야 할 것이다. 하지만, JOIN 연산을 사용한다면 다음과 같이 한번에 표현하는 것이 가능하다.

SELECT employees.last_name, departments.department_name
  FROM employees JOIN departments ON employees.department_id = departments.department_id
    WHERE employees.last_name = 'King';



기본적인 JOIN.
표준 조인방법은 위의것과 같다. JOIN 에 데이터를 추가하고자 하는 테이블의 이름을 써넣고, ON 에는 두 테이블을 이어주는 관계조건을 명시해주면 된다. 위에서는 테이블의 이름을 계속써야 하기때문에 조금 불편한면이 있다. 각 테이블명에 앨리어스 기능을 사용하는 것이 가능하다. 'FROM employees e' 라고 하면 employees 를 써야 하는 부분에는 'e' 를 써주면 된다. e.last_name과 같이 사용할 수 있다.

SELECT e.last_name, d.department_name
  FROM employees e JOIN departments d ON e.department_id = d.department_id
    WHERE e.last_name = 'King';

조금은 더 간단하게 사용하는 것이 가능하다. 위의 방법은 표준 조인이라고 불린다. 그리고 위의 방법 외에 WHERE 문에 조건을  더 주는 방법으로 JOIN문을 사용하지 않고 조인을 사용하는 것이 가능하다.

SELECT e.last_name, d.department_name
  FROM employees e, departments d
    WHERE e.last_name = 'King' AND e.department_id = d.department_id;



좀더 많이 조인하기.
그렇다면 두개이상의 조인은 어떻게 해야할까? 밑의 WHERE 을 사용하는 방법을 사용한다면 AND 를 사용해서 조건을 추가함으로써 쉽게 조인 테이블을 추가할 수 있다.

SELECT e.last_name, d.department_name
  FROM employees e, departments d, locations l
    WHERE e.last_name = 'King' AND e.department_id = d.department_id AND d.location_id = l.location_id;

위의 방법보다는 조금 더 복잡하게 보일 수 있겠지만, 표준조인 방식으로는 JOIN 과 ON 을 추가하여 조인 테이블을 추가해야 한다.

SELECT e.last_name, d.department_name
  FROM employees e JOIN departments d ON e.department_id = d.department_id
    JOIN locations l ON d.location_id = l.location_id
      WHERE e.last_name = 'King';

WHERE 보다는 쿼리문이 조금 길어진다는 단점이 있지만, 원하는 조건을 WHERE 문에만 쓸 수 있어서 찾고자 하는 조건을 좀더 명확하게 알 수 있다는 장점이 있다. 하지만, 어떠한 방식을 취하는것은 개발자의 몫이다.



모든 데이터를 출력하는 OUTER JOIN.
HR 계정에서 다음의 쿼리문을 실행해보자.

SELECT employee_id, last_name, hire_date  FROM employees e, departments d
    WHERE TO_CHAR(hire_date, 'YYYY-MM') BETWEEN '1999-01' AND '1999-06';

11개의 결과값이 나오는 것을 확인할 수 있다. 그렇다면 조인 연산을 이용해서 부서명까지 출력을 해보면...

SELECT e.employee_id, e.last_name, e.hire_date, d.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';

결과값이 뭔가 이상하다. 11개의 행이 나와야 하는데, 10개의 행밖에 나오지 않는다. 그 이유가 무엇일까?? 이유는 employee 테이블에 있는 데이터 중에서 department_id 값이 널인것이 있기 때문이다. 부서명을 출력하기 위해서 조인연산을 사용했지만, department_id 가 없는 것에 대해서는 조건이 만족하지 않기 때문에 아예 결과가 출력되지 않는 것이다. 그렇다면 그 결과는 영영 출력할 수 없는 것일까? 아웃터 조인이라는 방법은 이러한 문제점을 해결해 준다. employees 에는 있지만, departments 에 없는 데이터를 출력하기 위해서는 WHERE 조건을 e.department_id = d.department_id(+) 라고 '(+)'만 추가해주면 된다. 그렇게 되면 원하던 11개의 결과를 얻을 수 있을 것이다.

    WHERE e.department_id = d.department_id(+)

하지만 표준 조인을 사용하는 방식에서는 조금 다르게 사용을 해야 한다. JOIN 대신에 LEFT JOIN 이나 RIGHT JOIN 을 사용해야 한다.

  FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id

표준조인에서는 위의 방법과는 다르게 데이터가 있는 employees 쪽으로 표시를 해주어야 한다. 만일 위의 employees 와 departments 의 위치가 바뀐다면 RIGHT 를 사용해야 할 것이다.

  FROM department d RIGHT JOIN employees e ON e.department_id = d.department_id

가끔은 표준이 아닌것이 훨씬 더 편하게 사용되는것이 많은것 같은 생각도 문득 든다.

Posted by seanhigher

댓글을 달아 주세요

프로그램을 하는 사람들이라면 당연히 데이터베이스에 대해서 한번쯤은 들어보거나 생각해 보았을 것이다. 가장 대표적인 상용 데이터베이스인 오라클은 아는 사람들이라면 다 안다는 구글만큼 영향력이 있는 데이터베이스이다.


데이터베이스는 무엇일까?
가장 간단하게 이야기한다면 데이터를 저장해놓는 곳이다. 책들에 대한 정보, 회원들에 대한 정보, 스포츠 기록에 대한 정보등, 거의 모든 데이터가 데이터베이스에 들어가게 된다. 단지 데이터만을 넣어두는 곳이 큰 의미를 갖는것일까? 물론 아니다. 데이터베이스는 데이터의 저장소인 동시에 관리자이기도하다. 엄청나게 많은 양의 데이터들을 문제가 발생하지 않게끔 관리를 해주는 모든 행위를 포함하는 것이 데이터베이스라고 할 수 있다. 그래서 일반적인 DB라기 보다는 DBMS(DataBase Management System) 라는 이름으로 더 많이 사용되기도 한다.

대용량의 데이터.
많지 않은 양의 데이터라면 데이터베이스가 필요할까 하는 생각이 든다. 그냥, 텍스트 파일로 저장을 해 놓으면 되지 않겠는가? 아님 엑셀파일로 저장을 해도 쉽게 불러서 사용할 수 있을텐데 하는 생각... 하지만, 데이터베이스가 관리하는 데이터의 수는 우리가 상상하지 못한만큼의 많은 양의 데이터를 처리하게 된다. 이렇게 많은 양의 데이터를 처리하게 되면 의도하지 않았던 데이터가 생성되거나, 오류가 발생하는 일이 생기게 되는데, 이런 작은 문제들 때문에 전체적인 로직이 실행되지 않는 참사가 일어나기도 한다. 단 몇만분의 오차를 억제하기 위한 것이 데이터베이스인것이다.


데이터베이스의 종류
현재 많은 사람들이 사용하고 있는 데이터베이스에는 오라클, MySQL, MS-SQL, CUBRID 등이 있다. MySQL과 큐브리드는 다양한 기능들을 무료로 사용가능하다. 하지만, 중소규모에 한정된다는 단점이 있다. 오라클의 경우는 가장 대용량의 데이터를 효율적으로 처리할 수 있는 기능이 있기 때문에 중소 이상의 기업이나, 다양한 데이터를 제공하는 웹 서비스업체에서는 오라클의 데이터베이스를 많이 사용하고 있다. 데이터베이스에 사용되는 언어를 쿼리문이라고 하는데, 이 쿼리문은 거의 모든 데이터베이스에 비슷하게 사용되고 있다. 물론 세부적인 문법의 사용에 있어서는 다르지만, 기본적인 부분에서는 비슷하다. 물론 각 데이터베이스의 특화된 기능을 사용하기 위해서는 그 데이터베이스에 대해서 좀더 심도있게 배워야 할 것이다.

Posted by seanhigher

댓글을 달아 주세요

최근에 달린 댓글

글 보관함