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

댓글을 달아 주세요

셀렉트문과 조건문을 통해 원하는 데이터를 뽑아내었다 할찌라도 원하는 데이터들이 뒤죽박죽으로 되어 있다면 사용을 하기가 매우 어려울 것이다. 데이터베이스를 사용하는 의미조차 찾기 어려워지는 것이다.



데이터들 정렬하기.
데이터를 정렬하는 방법은 매우 간단하다. 기본적인 셀렉트문을 사용한 후 마지막에 ORDER BY 구문을 사용해서 정렬 조건을 주면 된다.

SELECT last_name FROM employees ORDER BY last_name;
SELECT last_name, salary FROM employees WHERE salary > 10000 ORDER BY salary DESC;
SELECT last_name, salary FROM employees WHERE salary > 10000 ORDER BY last_name DESC, salary;

첫번째의 쿼리문은 이름을 가나다 순을 정렬해서 보여준다. ORDER BY 를 사용한 정렬에서, 정렬 형식을 지적해주지 않는다면 기본적으로 올림차순으로 정렬이 된다. 두번째 쿼리에서 처럼 급여가 10000 이상인 사람들을 급여가 높은 순으로 정렬을 하고 싶다면 ORDER BY 항목의 마지막에 'DESC' 를 추가하면 내림차순으로 정렬을 하는것이 가능하다. 세번째의 쿼리문같이 여러가지 항목으로 정렬을 하는것도 가능한데, 먼저 열거된 항목으로 정렬이 된 후, 그 안에서 정렬이 되는 형식을 따른다.



그룹별 검색을 위한 그룹함수.
이런 경우가 있다. 특정 부서에 있는 사람들의 평균이나, 총합을 구하고 싶을때, 각 그룹별로 구하고 싶을때. 많은 양의 데이터를 관리하게 될때, 이러한 요구는 충분히 많이 필요하게 될 것이다. 오라클에서는 이러한 부분들을 이미 함수로 만들어 준비해 두었다. 이전에 문자열로 변환하는 TO_CHAR(), 이나 숫자로 변환하는 TO_NUMBER() 도 하나의 함수이다. 함수를 사용하는데 있어서 주의해야 할것이 있는데, 그 함수가 그룹을 지원하는가에 대해서 생각해 보아야 한다는 것이다. 그룹별로 나뉘어진 데이터를 보고자 하는데, 그를 충족시키는 조건이 오지 않는다면 데이터베이스는 사용자의 의도대로 데이터를 보여주지 못할 것이다.

SELECT AVG(salary) FROM employees GROUP BY department_id;

부서별로 급여의 평균을 구하고자 한다면 위와 같은 쿼리문을 작성해서 사용할 수 있다. GROUP BY 는 그룹을 구분짓는 역할을 한다. 그룹별 구분을 짓는 GROUP BY 절을 사용할때는 SELECT 부분에는 그룹바이로 나뉘어진 항목이나, 그룹 함수를 사용한 항목만 표기하는 것이 가능하다. 위의 쿼리에서는 그룹함수 AVG() 가 사용되었기 때문에 아무런 문제 없이 출력이 가능하다. 위의 쿼리문에 추가할 수 있는 항목은, 또다른 그룹함수나, GROUP BY 항목으로 나뉘어져있는 department_id 외에는 올 수가 없다. 그룹 함수로 사용되는 또 다른 함수에는 항목의 총 합을 구하는 SUM() 함수, 항목내에서 가장 큰 값을 반환하는 MAX() 함수, 가장 작은 값을 반환하는 MIN() 함수가 있고, 그룹내에 포함되는 숫자를 알고 싶다면 COUNT() 함수를 사용하면 각 그룹에 몇개의 항목이 포함되어 있는지 알 수 있다.



그룹별 조건달기.
GROUP BY 절을 통해 각 그룹별 항목을 출력하는 것이 가능하다는 것을 알게 되었다. 일반적인 항목에 대해서는 WHERE 을 통해서 조건을 명시하는 것이 가능하였는데, 그룹을 조건으로 해야 할때도 WHERE 을 사용하는것이 가능할까? 가능할것 같기도 하지만, 실제론 그렇지 않다. 그룹별로 조건을 나누게 될때, 각 그룹안에 항목들을 구분지으며, 조건을 포함시킨다는 것은 실로 불가능하기 때문이다. 그래서 GROUP BY 를 통해 구분된 그룹에 조건을 추가하기 위해서는 HAVING 이라는 항목을 사용해야 한다.

SELECT department_id, AVG(salary) FROM employees GROUP BY department_id HAVING department_id > 30;

위의 쿼리문에서는 각 그룹별로 평균을 구하는데, 그 그룹 아이디가 30 보다 큰 그룹에 대해서만 평균을 구하는 것을 의미한다. 그룹을 구분짓는 조건에 대해서는 HAVIG 절을 사용했다는 것을 알 수 있다.



자주 사용되는 유용한 함수들.
오라클의 함수에는 그룹함수 이외에도 유용하게 쓰이는 함수들이 있다. 그리고 그 함수들은 중첩해서 사용하는 것이 가능하다. ROUND() 라는 함수는 자릿수를 제한하는 기능을 가진 함수인데, 평균을 구하는 AVG() 함수와 함께 사용하여 불필요한 소수점 이하의 자릿수를 줄이는 것이 가능하다.

SELECT department_id, ROUND(AVG(salary), 2) FROM employees GROUP BY department_id;

ROUND() 함수는 첫번째로 받은 인자를 두번째로 받은 수의 소수자릿수만큼만 표현을 해준다. 위에서 처럼 '2'를 입력했다면 소수 셋째자리에서 반올림하여 소수 둘째자리까지만 표현을 해주게 된다. 소수점을 표현하고 싶지 않다면 두번째 자리에 '0'을 입력하면 소수점 이하의 자리에서는 반올림이 이루어진다. 그리고 음수로 표현할 경우에는 10의자리 100의 자리로 점점 자릿수가 올라간다. 만일 '-2'를 입력한다면 10의 단위에서 반올림한 수가 출력되게 되는 것이다.

WIDTH_BUCKET() 함수는 네개의 인자값을 갖게 된다. 첫번째 인자는 입력한 값이 되고, 두번째와 세번째는 각각 최소값과, 최대값이 된다. 그리고 마지막은 최소값과 최대값 사이를 나누는 분할비가 된다. 이것은 일정한 등급을 분류할때 사용될 수 있다.

SELECT WIDTH_BUCKET(82, 0, 100, 10) FROM DUAL;

위와 같은 쿼리문을 실행한다면, '0'에서 '100' 까지를 10개의 단계로 나눈 후 입력값 '82'가 포함된 단계인 '9' 를 반환하게 된다.

NVL() 함수는 첫번째 값이 'NULL' 값을 가질 경우, 아무것도 표현하지 않는대신 다른 문자로 표현할 수 있도록 해준다.

SELECT commission_pct FROM employees;
SELECT NVL(commission_pct, 0) FROM employees;

첫번째 쿼리는 커미션이 없을 경우 없다는 의미의 '-'를 출력하지만, 두번째는 '-' 대신에 '0'이라는 숫자를 출력해준다. 주의해야할 점은 'NULL' 값을 대신하는 것은 그 데이터 타입과 동일해야 한다는 것이다.

FLOOR() 함수는 소수점 이하의 수를 내림 해주는 기능을 갖고, CELL() 함수는 소수점 이하의 수를 올림 해주는 기능을 갖고 있다. 이 두개의 함수는 무조건 정수형태의 값만을 리턴하게 된다. 그리고 추가적으로 TRUNC() 라는 함수는 두번째 인자로 내림하고자 하는 자릿수를 정할 수 있다. 인자값 만큼의 소수자리수를 남기로 내림을 실행하게 된다.

MOD() 함수는 첫번째 인자를 두번재 인자를 나눈 나머지값을 반환하는데, 자바에서의 MOD 연산자와 동일한 역할을 한다.
LOWER(), UPPER() 함수는 각각 인자로 받아들여진 문자열을 모두 소문자로, 대문자로 변환시켜준다.

SUBSTR() 함수는 문자열을 분리해주는 기능을 가지고 있다. 첫번째 인자로 받은 문자열을 두번째 인덱스 번호에서부터, 세번째 숫자만큼의 문자수만큼 잘라내어 반환해준다.

SELECT SUBSTR('HELLO BYE', 7, 3) FROM DUAL;

'HELLO BYE'에서 'BYE'만을 추출하기 위해서는 위와 같은 쿼리문을 사용할 수 있다. 7번째 인덱스인 'B'에서부터 세번째인 'E'까지의 문자열을 나타낸다.

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

댓글을 달아 주세요

최근에 달린 댓글

글 보관함