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

댓글을 달아 주세요

데이터베이스에는 수많은 데이터들이 저장되어 있다. 그 데이터를 불러오지 않으면 그것은 모두 쓸모없는 데이터들이 된다. 데이터베이스에서 데이터를 불러오기 위해서는 SELECT 라는 명령문을 사용하게 된다.



SELECT문 사용하기
셀렉트는 데이터를 출력하기 위한 가장 기본적인 명령이다. 데이터베이스에서의 기초라고 할 수 있다. 오라클레서 제공하는 XE 버전을 설치하게 되면 'HR' 계정이 있는데, 이것은 데이터베이스에 대한 연습을 하기 위해 이미 테이블들이 생성되어 있기 때문에, 기본적인 데이터베이스에 대한 연습을 하기에는 충분하다. 먼저 테이블의 목록을 보기 위해서 다음과 같이 입력하도록 한다.

SELECT * FROM TAB;

이것은 해석하자면 'TAB' 라는 테이블의 모든 정보를 보여달라는 것이다. SELECT '컬럼명' FROM '테이블명' 의 형식으로 사용되는 것이다. '*' 은 모든컬럼을 표시하라는 의미이고, 'TAB' 은 테이블명이다. 'TAB' 테이블은 사용자가 만드는 것이 아니라 데이터베이스에서 자동으로 만들어지는데, 그 사용자의 테이브에 대한 정보를 가지고있다. 위의 쿼리문을 입력하면 'HR'계정이 가지고 있는 테이블에 대한 정보를 보여줄 것이다.

보여지는 테이블 중에서 employees 테이블의 정보를 보고 싶다면..

SELECT * FROM employees;

위의 쿼리는 'employees' 테이블에 있는 모든 컬럼들과 정보를 보여줄 것이다. 이중에서 특정 부분(직원 번호, 이름, 급여) 만을 보고 싶다면 컬럼명을 명시하여 검색을 할 수 있다.

SELECT employee_id, last_name, salary FROM employees;

각 컬럼들은 콤마를 이용해 구분하도록 한다.



좀더 세밀한 검색하기.
기본 쿼리문에 WHERE 을 통해서 좀더 상세한 조건으로 원하는 결과를 검색을 할 수 있다. 특정한 데이터 값을 갖는다던지, 큰것과 작은것을 비교하는 것이 가능하다.

SELECT employee_id, last_name, salary FROM employees WHERE last_name = 'King';
SELECT employee_id, last_name, salary FROM employees WHERE salary > 10000;
SELECT employee_id, last_name, salary FROM employees WHERE last_name IN ('King', 'Abel', 'Smith');

위의 첫번째쿼리문은 'King'이란 이름을 갖고 있는 데이터를 보여주고, 두번째는 급여가 20000 보다 높은 사람의 데이터를 보여준다. 마지막의 쿼리문은 이름이 'King', 'Able', 'Smith'인 모든 사람을 보여주게 된다. 그 이름이 포함되지 않은 사람을 검색하고 싶다면 'IN' 대신에 'NOT IN'을 사용하면 된다. 그리고 조건이 여러개가 있을경우에는 함께 AND 와 OR 을 사용하여 조건을 추가하는 것이 가능하다.

SELECT employee_id, last_name, salary FROM employees WHERE last_name = 'King' AND salary > 10000;
SELECT employee_id, last_name, salary FROM employees WHERE last_name = 'King' OR salary > 10000;

급여가 10000 이상 20000 이하인 사람의 데이터를 검색하기 위해서는 부등호와 AND 를 조합하여 사용할 수 있지만, 'BETWEEN ~ AND' 를 사용해서도 표현할 수 있다.

SELECT employee_id, last_name, salary FROM employees WHERE salary >= 10000 AND salary <= 20000;
SELECT employee_id, last_name, salary FROM employees WHERE salary BETWEEN 10000 AND 20000;

위의 두 식은 같은 결과 값을 출력하게 된다. 일부 데이터중에는 값이 없는 것이 있을 수도 있는데, 이것은 'NOT NULL' 과 'IS NOT NULL' 의 식으로 표현할 수 있다. 직원들 중에서 커미션이 없는 직원들을 보고싶다면..

SELECT employee_id, last_name, salary, commission_pct FROM employees WHERE commission_pct IS NULL;

위와 같은 방식으로 쿼리문을 작성할 수 있을 것이다.



문자열을 비교하기.
직원의 이름들 중에서 'K'를 포함하는 사람들 검색하고 싶다면 어떤 조건을 주어야 할지 고민이 될 것이다. 특정 문자를 포함하는 조건을 주고 싶을땐, 'LIKE' 를 사용해서 검색할 수 있다.

SELECT employees_id, last_name, salary FROM employees WHERE last_name LIKE '%k%';
SELECT employees_id, last_name, salary FROM employees WHERE last_name LIKE '__k%';

'%' 기호는 한자리 이상의 모든 문자를 의미한다. '%k%' 는 'k' 를 포함하는 모든 문자열이 되는 것이다. '_'는 한 문자를 가르킨다. '__k%' 는 세번째 문자가 'k'인 모든 문자를 의하는 것이다. 이제 문자열에 대해서도 원하는 결과를 도출할 수 있게 되었다.



Date 로 검색하기.
오라클의 데이터 타입에는 문자열(char, varchar), 숫자(number), 날짜(date) 형식이 있다. Date 타입이 기본적으로 보여주는 형식은 'YY/MM/DD'의 모습을 가지고 있다. 현재의 시간을 나타내는 데이터로 'SYSDATE'를 사용할 수 있는데, 매우 세밀한 시간의 정보까지 가지고 있어서 자세한 시간의 출력을 하는것까지 가능하다.

SELECT SYSDATE FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
SELECT TO_CHAR(10000, '$999,999') FROM DUAL;

위의 쿼리문에서는 간단하게 날까지만 출력을 하는 것이 가능하다. 쿼리문에서 사용된 'DUAL'은 테이블이 없는 상태에서 데이터를 출력하고자 할때, 가상의 테이블을 만들어주는 역할을 한다. 아래의 쿼리문은 현재의 시간을 '년도-월-날 시간:분:초'의 형식을 출력형식을 지정해주어 나타낼때 사용된다. 이때 사용되는 TO_CHAR() 라는 함수는 날짜의 형식뿐만 아니라 세번째의 쿼리문처럼 통화의 형태를 나타내는 것도 가능하다. 이와 비슷하게 TO_NUMBER() 라는 함수는 인자로 들어온 문자열을 숫자로 바꾸어주는 기능을 가지고 있다. 물론 안에 포함되는 문자는 숫자의 형태를 가지고 있어야 한다.

문자열 형태도 변환된 날자 데이터는 일반적인 문자열 검색과 동일하게 검색하는 것이 가능하다. 원하는 년도나, 월에 포함된 데이터를 선택한다던지, 일정기간내의 데이터를 검색하는 것도 가능하다.

SELECT employee_id, last_name, to_char(hire_date, 'YYYY/MM/DD') FROM employees
WHERE TO_CHAR(hire_date, 'YYYY/MM/DD') BETWEEN '1997/0101' AND '1997/12/31';

SELECT employee_id, last_name, to_char(hire_date, 'YYYY/MM/DD') FROM employees
WHERE TO_CHAR(hire_date, 'YYYY/MM/DD') LIKE '1997%';

위의 두 쿼리문은 1997년에 속한 데이터들을 출력해줄 것이다.
Posted by seanhigher

댓글을 달아 주세요

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


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

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


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

Posted by seanhigher

댓글을 달아 주세요

최근에 달린 댓글

글 보관함