Programming - cpueblo.com

정의, SQL Query 문형


글쓴이 : 유광희 날짜 : 2006-12-05 (화) 14:26 조회 : 8715
제  목:[강좌] 데이터베이스의 정의                      관련자료:없음  [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을 알려 드릴까 합니다.

그럼 이만 돌아온 뫼피스토 펠레스 병희가.