제 목:[강좌] 데이터베이스의 정의 관련자료:없음 [145]
보낸이:윤병희 (mac21 ) 1999-02-15 04:09 조회:839
1.데이터베이스의 정의
1970년 6월에 E.F.Godd의 'A Relational Model of Data for
Large Shared Data Bank"에서 처음으로 원칙을 정리하였으며
이 모델이 관계형 데이터베이스 관리 시스템의 기본이 됩니다.
데이터 모델은 이외에도 계층형, 망형, 단순 플랫파일등이
있습니다.
RDBMS의 개념은 첫째 개체(Object) 또는 관계(Relation)을
이용하여 데이터를 저장하며 두째 일련의 연산자들은 관계
(Relation)에 대한 집합연산을 하고 결과로서 다른 관계
(Relation)를 돌려 주며 세째 RDBMS는 수용하고 있는 데이터
베이스가 정확하고 일관성을 유지 할 수 있도록 데이터 무결성을
유지해야 합니다.
RDBMS의 기능으로 첫째 데이터의 저장을 관리하며 두째 데이터
에 대한 접근을 통제하며 세째 데이터 검색 및 수정을 하는
수단을 제공합니다.
RDBMS의 구성요소는 Table, Row, Column, Field, Primary Key,
Foreign Key가 있습니다.
1.Table : 테이블은 RDBMS의 기본적인 저장 구조를 한개 이상의
Column과 0개 이상의 행으로 구성된 것을 말합니다.
2.Row : 행은 테이블의 Column 값의 조합이며 Record라고 불리워
집니다.
3.Column : 한 column의 테이블에서 단일 종류의 데이터를 나타내며
column은 특정 Datatype 및 크기를 갖고 있습니다.
4.Field : Row와 Column의 교차에는 필드가 있으며 필드는 데이터를
포함하고 데이터가 없을 경우에는 null값이 존재합니다.
5.Primary Key : 하나의 테이블에서 중복을 허용하지 않는 Column의
집합으로 null 값을 허용하지 않으며 이러한 column이 다른 테이블
의 Foreign Key가 될 수 있습니다.
6.Foreign Key는 같은 테이블 및 다른 테이블의 Primary Key를
참조하는 단일 column 또는 column의 조합이며 Foreign Key의
생성으로 RDBMS의 설계규정을 적용하는 것입니다.
※ Secondary Key란 속도 개선을 위하여 하나 또는 여러개의 Column
에 Index를 부여함을 말합니다. 대체적으로 완벽한 데이터베이스를
설계하지 못한 경우에는 Forign Key를 사용하지 않습니다.
이유는 Foreign Key에 의해 참조된 Primary Key가 있는 Table의
참조된 column은 구조 변경이 용이하지 못하기 때문입니다.
RDBMS의 특징은 SQL 명령의 실행으로 데이터베이스에서의 객체들을
접근하고 변경할 수 있으며 어떠한 물리적 포인터 없이도 복수개의
테이블을 포함할 수 있고, 집합연산과 온라인 갱신이 가능하고 또한
완전한 데이터 독립성을 제공합니다.
데이터베이스 객체는 Table, View, Sequence, Index, Synonym,
Program unit가 있습니다.
1.Table : Row와 Column들로 구성된 기본적인 저장단위 입니다.
2.View : 논리적인 한개 이상의 테이블 데이터의 부분집합을
말합니다.
3.Sequence : Primary Key값을 만들어 줍니다.
4.Index : 조회시 성능향상을 개선시켜 줍니다.
5.Synonym : 객체의 다른 이름입니다.
6.Program unit : Stored Procedure와 같은 SQL BLOCK입니다.
※ Synonym을 이용하여 원격지의 Table을 자신의 데이터베이스에
정의 할 수 있으며 이로서 데이터베이스 엔진에서의 원격지
데이터 접근을 가능하게 합니다.
지금까지 돌아온 뫼피스토 펠레스 병희였습니다.
P.S. 앞으로 시간이 주어 진다면 Oracle, Informix, MS-SQL등과
같은 상용 데이터 베이스에 관한 강좌를 진행할까 합니다.
제 목:[강좌] SQL Query 문형 : Oracle 기준 관련자료:없음 [146]
보낸이:윤병희 (mac21 ) 1999-02-15 06:58 조회:1088
2.SELECT절의 형태 #1
SQL의 기본적인 Query는 SELECT일것 입니다.
SELECT문에서는 상당히 많은 명령의 조합이 있을 수 있으며
혹시라도 모르고 지나치는 형식들까지 정리해 보았습니다.
Syntax : 기본 문형
SELECT [DISTINCT] {*, column [alias], ...}
FROM 테이블명
[WHERE Query 조건(들)]
[ORDER BY {column, 표현식} {ASC | DESC}
SELECT : 최소한 한개 이상의 column으로 구성된 리스트 입니다.
DISTINCT : 결과 레코드의 동일한 row를 제거하고 column 들의 유일한
값만 제공합니다.
* : FROM절에 정의된 Table의 모든 column을 선택하여 나타냅니다.
alias : 선택된 column의 다른 명칭을 부여합니다.
FROM 테이블 : column을 포함하는 Table을 지정합니다.
WHERE : Query의 조건을 명시하며 column, 표현식, 상수 및 비교
연산자로 구성됩니다.
ORDER BY : Query된 row의 순서를 정합니다.
ASC : 검색된 결과를 지정된 column을 기준으로 올림차순으로
정렬합니다.
DESC : 내림차순으로 정렬합니다.
예1) SELECT * FROM IWEBF A1, INTERNET A2
WHERE A1.ID = A2.ID AND A1.NAME = "홍길동";
예2) SELECT DISTINCT IWEBF.ID, IWEBF.NAME FROM IWEBF;
※ Alias를 표현하는 keyword에는 AS라는 것이 있는데
Oracle에서 AS는 SELECT절 에서만 사용되고 다른 DBMS에서는
SELECT와 FROM절에서 사용되어 질 수 있습니다.
예3) SELECT A1.ID AS MainID, A2.NAME UserName
FROM IWEBF A1, INTERNET A2
예4) Oracle에서는 error 발생
SELECT * FROM AS A1 WHERE A1.ID = "mobile"
작업을 하다보면 검색된 값의 처음부터 처리해야 할 것이 있는
반면에 마지막 자료뷰터 검색을 해야하는 작업들이나 값이 큰
숫자 혹은 작은 순서로 해야하는 것들이 있습니다.
이렇게 표시 순서를 지정해야 하는 것들을 해결하기 위해서는
ORDER BY를 사용합니다.
데이터들은 Secondary Key가 지정되어 있는 경우에는 Index
생성시 오름차순 또는 내림차순으로 정렬되어 있지만 Key가
없을시에는 입력 순서대로 저장됩니다.
예5) SELECT A1.ID, A1.Name, A1.Price FROM IWEBF A1
WHERE A1.Price < 100000
ORDER BY A1.Price DESC
예6) 결과가 예5와 같은 경우
SELECT ID, Name, Price FROM IWEBF
WHERE A1.Price < 100000
ORDER BY 3 DESC
※ 여기서 ORDER BY절의 3은 3번째 column을 말합니다.
이상으로 돌아온 뫼피스토 펠레스 병희였습니다.
제 목:[강좌] SQL Query 문형 : Informix 기준 관련자료:없음 [147]
보낸이:윤병희 (mac21 ) 1999-02-15 14:01 조회:430
2.SELECT절 #1 for Informix
Informix는 내가 처음으로 사용하였던 UNIX 기반의 대용량
DBMS입니다.
DB 엔진도 작으면서 특히 통신분야에 많이 사용될 수 있는
능력을 가진 DBMS로 개념상으로 이해하기 쉽고 사용하기 용이하여
처음 사용하는 사람에게 권할만 합니다.
속도 또한 타 DBMS보다 월등히 빠르며 특히 Multimedia Data 저장
에서도 탁월한 성능을 발휘할 수 있습니다.
1998년에는 Sybase에 2위 자리를 내주었지만 가볍고 강력한 DBMS를
원한다면 Informix를 사용하는 것이 좋을 듯 합니다.
일예로 가장 훌륭한 은행 전상망으로 S은행이 뽑혔는데 DB가 Informix
였다나 뭐래나 그렇답니다.
Oracle 강좌에서도 그랬듯이 Informix에서도 'Informix Guide to SQL'
에서 간추려 보았습니다.
Informix에서도 기본적인 SELECT문으로 정리하면서 보다 자세한 문형을
설명할까 합니다.
SELECT INTO, UNION, HAVING, GROUP BY는 천천히 소개 하기로 하고
Oracle 강좌 수준으로 시작합니다.
Syntax : 기본문형
SELECT [ALL, DISTINCT, UNIQUE] {*, column[alias], ...}
FROM 테이블명 {alias}, ...
[WHERE Query 조건(들)]
[ORDER BY {column 표현식} {ASC | DESC}
SELECT : 데이터베이스로부터 읽어들이는 SQL 명령 문장 이름
ALL : 선택된 모든 값들을 받아내는 Keyword로 중복되었더라도
전부 가지고 옵니다. ALL은 기본 지정값입니다.
DISTINCT : Query 수행결과 값이 중복될 경우를 없애주는 문장
UNIQUE : DISTINCT의 또다른 이름
* : Table이나 View의 모든 column을 표시하는 표식
alias : Query 문장안에서 사용되는 대표 명칭
FROM 테이블명 : SELECT 절에서 사용되어지는 column의 소속된
Table을 지정합니다.
WHERE : Query결과의 조건을 설정하는 문장
ORDER BY : 결과값의 순서를 지정해주는 문장
ASC : 오름차순 정렬
DESC : 내림차순 정렬
예1) SELECT ALL * FROM IWEBF
예2) SELECT DISTINCT * FROM IWEBF AS A1, INTERNET A2
WHERE A1.ID = A2.ID
예3) SELECT A1.ID AS MainID, A2.NAME UserName
FROM IWEBF A1, INTERNET AS 2
WHERE A1.ID = A2.ID AND A2.NAME IS NOT NULL
ORDER BY A2.NAME
예4) 예3과 같은 결과
SELECT IWEBF.ID MainID, INTERNET.NAME UserName
FROM IWEBF, INTERNET
WHERE (IWEBF.ID = INTERNET.ID) AND
(IWEBF.NAME IS NOT NULL)
ORDER BY 2 ASC
※ TIP : Query 문장들은 Client에서 Server로 보내져 Server에서
작업후 Client 값을 돌려주게 됩니다. 이때 Query 문장을 분석하게
되는데 Client에서 Server로 명령이 보내질때 제공되는 Database
Interface Driver(ODBC, 써드파티 제품등)에 의해 검사되고 Server
로 보내져서도 또한번 검사하여 오류를 체크합니다.
DB Server가 허용하는 문장이라도 Client에서 검사하여 오류가 나면
Error를 발생 시킵니다. 이러한 검사를 파싱이라합니다.
이것으로 Informix의 SQL #1을 마칩니다.
돌아온 뫼피스토 펠레스 병희가.
제 목:[강좌] SQL Query 문형 : Oracle 기주 관련자료:없음 [148]
보낸이:윤병희 (mac21 ) 1999-02-16 04:23 조회:817
3.JOIN법 (Oracle 기준)
데이터베이스에서 Table간의 유기적 관계를 성립하는 것이며
한개 이상의 테이블로부터 데이터가 요구될 수 조인이 사용됩니다.
JOIN의 형태에 관한 분류는 Equijoin, Non-equijoin 다른 말로 하자면
등가 조인, 비등가 조인입니다.
JOIN의 방법에 관한 분류로는 Cross Join(Cartesian Product),
Inner Join, Outer Join, Self Join이 있습니다.
1.Equijoin (등가 조인)
검색하는 객체의 조건이 같은 것을 선택하는 것입니다.
예1) SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
WHERE A1.ID = A2.ID;
2.Non-equijoin (비등가 조인)
연산자 '=' 이외의 조건을 가진 조인으로 하나의 column 값이
또다른 column과 동일성이 없을때 사용합니다.
예2) SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
WHERE A1.ID BETWEEN A2.OLDID AND A2.NEWID;
3.Cross Join (Cartesian Product)
Table의 하나의 row가 다른 테이블의 모든 row가 결합하여
선택된 결과들의 갯수가 첫번째 Table의 row갯수 × 두번째
Table의 row갯수가 되는 것을 말합니다.
JOIN의 성격을 결정하는 WHERE절의 조건이 없다는 겁니다.
예3) SELECT A1.ID, A2.NAME
FROM IWEBF A1, INTERNET A2;
4.Inner Join
비교의 주체가 되는 Field가 비교의 객체가 되는 Field의
조건에서 동등한 상태의 관계를 유지하는 것을 말하며, 양쪽
Table에 검색된 동일한 결과치만을 가지고 비교하여 조건에
부합되는 것만 선택할 수 있게 합니다.
예4) SELECT A1.ID, A2.NAME FROM IWEBF A1, INTERNET A2
WHERE A1.ID = A2.ID;
※ 예제 1은 Inner Join이면서 등가 조인이고
예제 2는 Inner Join이면서 비등가 조인입니다.
5.Outer Join
어느 한쪽에 없는 값이라 하더라도 Join의 주체 Field를
기준으로하여 결과를 출력하는 것을 말합니다.
Outer Join은 Left Outer Join과 Righter Outer Join이
있습니다. Left Outer Join은 검색 주체가 조건의 왼쪽에
있으며 Righter Outer Join은 오른쪽에 있습니다.
보기 1)
IWEBF INTERNET
--------------------------------------------------------
ID NAME ID PRICE
--------------------------------------------------------
EVA EVANGELION EVA 50000
MOBILE MOBILE SUITS LETTER 15000
WING WING GUNDAM MOBILE 60000
MONO MONONOKE HIME MS08 35000
MONO MOON PRINCESS NADESIKO 40000
LETTER LOVE LETTER LETTER 24000
--------------------------------------------------------
예5) Left Outer Join
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
WHERE A1.ID = A2.ID (+);
결과 :
ID NAME PRICE
--------------------------------------------------------
EVA EVANGELION 50000
LETTER LOVE LETTER 15000
LETTER LOVE LETTER 24000
MOBILE MOBILE SUITS 60000
MONO MONONOKE HIME null
MONO MOON PRINCESS null
WING WING GUNDAM null
--------------------------------------------------------
예6) Righter Outer Join #1
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
WHERE A1.ID (+) = A2.ID;
ID NAME PRICE
--------------------------------------------------------
EVA EVANGELION 50000
LETTER LOVE LETTER 15000
LETTER LOVE LETTER 24000
MOBILE MOBILE SUITS 60000
null null 35000
null null 40000
--------------------------------------------------------
예7) Righter Outer Join #2
SELECT A2.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
WHERE A1.ID (+) = A2.ID;
ID NAME PRICE
--------------------------------------------------------
EVA EVANGELION 50000
LETTER LOVE LETTER 15000
LETTER LOVE LETTER 24000
MOBILE MOBILE SUITS 60000
MS08 null 35000
NADESIKO null 40000
--------------------------------------------------------
※ 이 예들에서 null이란 아무런 값이 없다는 뜻이며
실제 화면에는 나타나지 않습니다.
6.Self Join
하나의 Table에서 Join이 발생되는 것을 말합니다.
예8) SELECT A1.ID, A2.NAME
FROM IWEBF A1, INTERNET A2
WHERE A1.ID = A2.NEWID;
※ 이와 같이 JOIN의 기초를 배워보았습니다.
일반적으로 Table의 갯수가 50개 이하이면서 5개 이하의
Table이 Join되는 경우는 비교적 간단합니다.
그러나 수백개의 Table에서 5개 이상의 Table들이 Join
하면서 복잡한 규칙을 가지게 될 경우에는 여러가지 조인을
혼합하여 결과를 만들어 내게 됩니다.
복잡한 SQL 문장을 Table의 특성에 맞추어 보다 빨리 결과를
얻는 방법을 찾아내는 것이 DB PROGRAMMER들의 일입니다.
앞으로 조금씩 어려워지는 기법들을 소개할까 합니다.
지금까지 돌아온 뫼피스토 펠레스 병희였습니다.
제 목:[강좌] SQL Query 문형 : Informix 기준 관련자료:없음 [149]
보낸이:윤병희 (mac21 ) 1999-02-19 01:33 조회:566
3.JOIN의 방법 (Informix 기준)
비숫한 두 데이터베이스의 SQL을 비교하려니 좀더 특색있게 강좌를
하려합니다. Oracle은 설명위주로 Informix는 예제 위로로 하겠습니다.
보기1) IWEBF와 INTERNET Table의 내용
IWEBF Table
ID NAME
-------- --------------------
EVA EVANGELION
MOBILE MOBILE SUITS
WING WING GUNDAM
MONO MONONOKE HIME
MONO MOON PRINCESS
LETTER LOVE LETTER
INTERNET Table
D PRICE
-------- ---------
EVA 50000
LETTER 15000
MOBILE 60000
MS08 35000
NADESIKO 40000
LETTER 24000
예1) Equijoin (등가 조인)
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
WHERE A1.ID = A2.ID
결과1)
ID NAME PRICE
-------- -------------------- ---------
EVA EVANGELION 50000
LETTER LOVE LETTER 15000
LETTER LOVE LETTER 24000
MOBILE MOBILE SUITS 60000
예2) Non-equijoin (비등가 조인)
SELECT A1.ID AS "CD ID", A1.NAME "CD NAME", A2.PRICE "가격"
FROM IWEBF A1, INTERNET A2
WHERE (A1.NAME BETWEEN 'F' AND 'M') AND
(A1.ID NOT IN (A2.ID))
결과2)
CD ID CD NAME 가격
-------- -------------------- ---------
LETTER LOVE LETTER 50000
LETTER LOVE LETTER 60000
LETTER LOVE LETTER 35000
LETTER LOVE LETTER 40000
※ 결과2를 보더라도 잘못된 값임을 알수 있을것이다.
그러나 Query 문장만은 틀린것이 아니다.
예3) CROSS JOIN (Cartesian Product)
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2
결과3)
ID NAME PRICE
-------- -------------------- ---------
EVA EVANGELION 50000
MOBILE MOBILE SUITS 50000
WING WING GUNDAM 50000
MONO MONONOKE HIME 50000
MONO MOON PRINCESS 50000
LETTER LOVE LETTER 50000
EVA EVANGELION 15000
MOBILE MOBILE SUITS 15000
WING WING GUNDAM 15000
MONO MONONOKE HIME 15000
MONO MOON PRINCESS 15000
LETTER LOVE LETTER 15000
EVA EVANGELION 60000
MOBILE MOBILE SUITS 60000
WING WING GUNDAM 60000
MONO MONONOKE HIME 60000
MONO MOON PRINCESS 60000
LETTER LOVE LETTER 60000
EVA EVANGELION 35000
MOBILE MOBILE SUITS 35000
WING WING GUNDAM 35000
MONO MONONOKE HIME 35000
MONO MOON PRINCESS 35000
LETTER LOVE LETTER 35000
EVA EVANGELION 40000
MOBILE MOBILE SUITS 40000
WING WING GUNDAM 40000
MONO MONONOKE HIME 40000
MONO MOON PRINCESS 40000
LETTER LOVE LETTER 40000
EVA EVANGELION 24000
MOBILE MOBILE SUITS 24000
WING WING GUNDAM 24000
MONO MONONOKE HIME 24000
MONO MOON PRINCESS 24000
LETTER LOVE LETTER 24000
예4) INNER JOIN
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, INTERNET A2 WHERE A1.ID IN (A2.ID)
결과4)
ID NAME PRICE
-------- -------------------- ---------
EVA EVANGELION 50000
LETTER LOVE LETTER 15000
LETTER LOVE LETTER 24000
MOBILE MOBILE SUITS 60000
예5) OUTER JOIN : Informix의 Outer Join은 상당히 복잡하게
구성할 수 있습니다. 여기에는 기본형만을 소개하겠습니다.
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, OUTER INTERNET A2
WHERE A1.ID = A2.ID
※ OUTER JOIN은 상당히 편리한 프로그래밍 환경을 제공합니다.
그러나 그만큼 주의를 해야만 하겠습니다.
1997년 제가 모 무선통신업체에서 프로그래밍을 하고 있을때
한가지 재밌는 테스트를 한 적이 있습니다.
가입자가 100만명 가까이 되었는데 10여개의 테이블을 하나의
Query로 묶어서 프로그래밍을 하게 되었습니다.
처리 시간은 30여초가 흐르더군요. 물론 OUTER JOIN이 몇개
있었습니다. OUTER JOIN을 분리하여 테스트를 하였습니다.
결과는 3초내로 검색 속도가 떨어 지더군요.
프로그래머들 중에서 큰용량의 많은 사용자가 동시에 사용하고
있다는 것을 간과하는 경우가 있어 나중에 문제를 유발 시키는
것을 종종 보아왔습니다.
QUERY문을 복잡하게 통합하는 것이 얼마나 위험 할 수 있는가는
직접 격어 보아야 느낄 수 있습니다.
거의 모든 데이터 베이스에서 Outer Join은 Inner Join보다
느립니다. 그러나 Record의 갯수가 적은 경우에는 눈에 띄게
차이가 나지 않습니다. 그렇기에 개발 초기에는 Outer Join을
많이 사용하여 개발을 편리하게 하고자 하지만 몇년이 지나
용량이 커지면 속도가 현저히 떨어 지는 것을 느낄 수가 있습니다.
보다 정확한 정규화 작업을 통하여 가장 바람직한 최적화를
할 수 있었으면 좋겠습니다.
예6) Self Join
SELECT A1.ID, A1.NAME, A2.PRICE
FROM IWEBF A1, IWEBF A2
WHERE A1.ID = A2.OLDID
지금까지 SQL의 기초에 관한 내용은 마무리 된 듯합니다.
앞으로는 조금더 진보된 SQL을 알려 드릴까 합니다.
그럼 이만 돌아온 뫼피스토 펠레스 병희가.