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

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total633,812
Today36
Yesterday88
여러개의 테이블에서 원하는 데이터를 얻어내기 위해서는 조인 연산을 통해서 결과를 얻어낼 수 있다. 하지만, 똑같은 데이터를 얻어내기 위해서 매번 조인 연산을 해야 한다는 것은 매우 불합리한 일임을 쉽게 느끼게 될 것이다.



VIEW.
뷰는 실제로 존재하는 테이블과는 조금 차이가 있다. 테이블은 데이터를 갖고 있지만, 뷰는 갖고 있지 않다. 그리고 조인 연산으로 데이터를 가져오게 되면, 식의 조건에 맞는 테이블의 형태로 데이터를 보여주게 된다. 이렇게 조인과 셀렉트 연산으로 보여지는 가상의 테이블을 영구적으로 만들어 놓는 것을 뷰라고 정의할 수 있다.


뷰 생성하기.
뷰를 생성하는 방법은 테이블을 만드는 방법과 비슷하다.

CREATE VIEW 뷰이름;
CREATE OR REPLACE VIEW 뷰이름;

두번째의 쿼리는 동일한 이름의 뷰가 이미 정의되어 있을 경우 이전의 것에 그대로 덮어서 생성을 하게 된다. 이전것과는 상관없이 무조건 생성하는 것이다. 하지만 이것은 단지 뷰만 만들어 놓으것이다. 어떠한 형태와 구조도 없고, 당연히 데이터도 없다. 아직은 아무런 쓸모가 없는 것이다. 이뷰에 데이터를 넣어주어야 뷰로서의 기능을 발휘하게 된다.

CREATE VIEW 뷰이름 AS SELECT * FROM 대상테이블;

위의 쿼리문을 실행하게 되면, 대상테이블에 있던 데이터가 새로운 뷰 안에 포함되게 된다. 하지만, 이렇게 테이블을 그대로 뷰로 옮겨놓는 것은 뷰의 가능성을 무시하는 처사라고 할 수있다. 일반적으로는 AS 절 이후의 셀렉트문을 여러개의 테이블에서 조인을 하거나, 원하는 컬럼들만 추출하여 새로운 테이블을 만든것과 같은 효과를 주어 사용을 하게 된다.

CREATE VIEW 뷰이름 AS
    SELECT e.employee_id, e.last_name, e.salary, e.department_id, d.department_name
        FROM employee e, department d WHERE e.department_id = d.department_id
            ORDER BY salary DESC;

위와 같은 방법으로 뷰를 생성해 놓으면 다시는 부서의 이름을 얻어내기 위해 조인을 하는 수고는 덜게 될 것이다.


인라인 뷰의 사용.
테이블을 조인하기에도 적당하지 않고, 뷰를 만들기에도 한번만 사요을 해야 하는 것이 있다면... 서브쿼리와 비슷한 형태로 인라인 뷰 기능을 이용하면 된다. 서브 쿼리는 어떠한 결과 값을 반환하여 WHERE, HAVING 과 같은 조건절에 사용되는 반면, 인라인뷰는 조건에 맞는 테이블 자체를 반환하기 때문에 FROM 절에 값으로 사용할 수 있다.

SELECT employee_id, last_name, hire_date
    FROM (SELECT employee_id, last_name, hire_date, FROM employee ORDER BY hire_date)
        WHERE employee_id <= 50;

인라인 뷰는 위와 같은 형식으로 사용하는 것이 가능하다. 조금더 발전적인 형태로는 인라인 뷰와, 서브쿼리, 조인연산을 적절하게 사용하게 된다면, 원하는 데이터라면 어떠한 것이라도 가져오는 것이 가능할 것이다.

Posted by seanhigher

댓글을 달아 주세요

이미 만들어진 테이블을 수정하기 위해서는, 테이블을 삭제하거나, 컬럼을 수정, 삭제 하는 방법이 있다. 데이터를 직접 수정하는 방법도 가능하다.



테이블의 데이터 변경하기.
테이블에 데이터를 넣기 위해서는 INSERT INTO 명령을 사용할 수 있다. 이미 테이블에 들어 있는 데이터를 수정하기 위해서는 UPDATE 명령어를 사용할 수 있다. 데이터를 삭제하기 위해서는 DELETE 명령을 사용할 수 있다.

UPDATE 테이블명 SET 컬럼명 = 값, 컬럼명 = 값, WHERE 조건식;
DELETE FROM 테이블명 WHERE 조건식;

데이터를 수정하는 UPDATE문을 사용할때는 각각의 컬럼에 데이터를 수정할 수 있다. 각 컬럼값에 대해서만 데이터를 수정할 수 있다. 그리고 WHERE 절을 사용해 조건실을 주어야 원치 않는 데이터가지 변경되는 것을 막을 수 있다. DELETE 는 해당 조건에 맞는 레코드를 삭제하게 된다. 테이블 전체를 삭제하기 위해서는 위의 DELETE 쿼리문에서 WHERE 절만 제거하면 해당 테이블을 삭제한다.

TRUNCATE TABLE 테이블명;

TRUNCATE 는 테이블을 완전삭제하게 되는데, 히스토리 기능과 비슷한 롤백 기능까지 사용할 수 없기때문에 TRUNCATE 는 사용하기 전에 좀더 신중하게 사용해야 한다.


연결되어 있는 데이터를 삭제하는 방법.
만일 다른 테이블에 외래키로 참조되고 있는 데이터를 삭제하려고 한다면, 삭제가 되지 않을 것이다. 이렇게 외래키로 연결되어 있는 데이터를 삭제하기 위해서는 참조하고 있는 기본키 데이터를 삭제한 후 삭제하는방법과, 제약조건을 삭제한 후 데이터를 삭제하는 방법이 있다. 이 두가지 방법 모두 데이터베이스의 기본인 무결성 원칙을 해치는 방법이기 때문에, 직접적으로 사용되지는 않는다. 하지만, 삭제하고자 하는 데이터를 새로운 기본키를 참조하게 만들고 삭제하는 방식으로 데이터를 삭제한 후, 다시 입력하는 우회적인 방법을 사용하는 것이 가능하다.

Posted by seanhigher

댓글을 달아 주세요

데이터베이스의 데이터들은 테이블안에 저장되어 있다. 데이터베이스를 사용하기 위해서는 가장먼제 테이블을 만들어야 하는 것이다. 데이터베이스를 사용하기 위한 시작점인 것이다.



테이블의 구조.
테이블을 만들기 위해서는 테이블이 어떤 구조로 되어 있는지 알아야 한다. 테이블은 테이블의 이름이 있고, 각 테이블은 각 항목을 나타내는 컬럼이 있다. 각 컬럼들에는 그 컬럼에 맞는 이름과 데이터 타입을 갖게 된다. 컬럼으로 이루어진 테이블에는 하나의 레코드 형식으로 새로운 데이터들이 들어가게 된다.


테이블 만들기
테이블을 만드는 방법은 매우 간단하다. CREATE() 명령문을 사용하면 되는데, 테이블의 기본 구조를 이루는 컬럼들을 함께 선언하여 생성할 수 있다.

CREATE TABLE 테이블이름 (
컬럼이름    데이터타입,
컬럼이름    데이터타입
);

컬럼은 필요한 만큼 여러개 생성하는 것이 가능하다. 쿼리문을 사용하여 테이블을 생성하게 되면, 테이블은 기본적인 구조를 갖게 되고, 그 구조에 맞추어 데이터를 넣을 준비가 되는 것이다.


테이블에 데이터 넣기.
테이블에 데이터를 넣기 위해서는 INSET INTO 명령을 사용해야 한다. 테이블의 구조에 맞게 데이터를 넣는 방법과, 원하는 테이블에만 데이터를 넣을 수 있다.

INSERT INTO 테이블명 VALUES (데이터, 데이터, 데이터);
INSERT INTO 테이블명(컬럼명, 컬럼명) VALUES(데이터, 데이터);

만일 넣고자 하는 데이터가 모든 컬럼에 만족한다면 위와 같이 한번에 입력을 하는 것이 가능하다. 하지만, 특정 컬럼에 대해서만 데이터를 넣고자 한다면, 두번째 쿼리문처럼 원하는 커럼명을 명시해주어, 특정 컬럼에만 데이터를 넣을 수 있다.


컬럼을 추가, 수정, 삭제.
테이블을 만든후, 추가를 하거나, 수정및, 삭제를 해야 한다면, 어떻게 해야 할까? 가장 간단한 방법은 테이블을 삭제하고 다시 만들면 된다. 하지만, 이미 데이터가 포함되어 있다면, 데이터도 다시 넣어야 하기 때문에 곤란한 상황이 될 것이다. 테이블의 컬럼들을 수정하기 위해서는 ALTER 라는 명령어를 사용하여 수정을 하는것이 가능하다.

ALTER TABLE 테이블명 MODIFY 컬럼명    데이터타입;
ALTER TABLE 테이블명 ADD 컬럼명    데이터타입;
ALTER TABLE 테이블명 DROP COLUMN 컬럼명;

MODIFY, ADD, DROP 는 각각 원래있던 컬럼을 수정하고, 추가하고, 삭제하는 역학을 한다. 이 명령을 사용하면 포함되어 있는 데이터들도 당연히 삭제가 된다.

Posted by seanhigher

댓글을 달아 주세요

  1. 2010.08.20 12:03 ssjh312  댓글주소  수정/삭제  댓글쓰기

    좋은글 감사합니다.

데이터베이스에는 수많은 데이터들이 저장되어 있다. 그 데이터를 불러오지 않으면 그것은 모두 쓸모없는 데이터들이 된다. 데이터베이스에서 데이터를 불러오기 위해서는 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

댓글을 달아 주세요

최근에 달린 댓글

글 보관함