database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
ㆍPostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
PostgreSQL Tutorials 4551 게시물 읽기
 News | Q&A | Columns | Tutorials | Devel | Files | Links
No. 4551
SQL 이야기 1. UNION
작성자
김상기(ioseph)
작성일
2003-01-25 14:12
조회수
7,880

심심한데, SQL 이야기를 꾸려볼까 합니다.

그 첫번째로 UNION 이야기를 할까합니다.

 

오늘 회사에서 있었던 일로,

우정국에서 우편번호를 2003년 1월 1일자로 또 바꾸었더군요.

결국 기존 데이터를 업데이트하면서 이번에는 우편번호를 RDBMS에 집어넣고 꺼내쓰려고 계획했습니다. (예전에는 dbm hash로 설계했었지요. RDBMS와 비교도 안될 정도의 속도는 나오지만, 우리나라처럼 우편번호가 이렇게 시시때때로 바뀌게 될 경우라면 유지보수가 까다롭네요.)

 

아무튼 우정국에서 제시한 우편번호의 자료구조는 다음과 같습니다.

             Table "newzipcode"
 Column  |  Type   | Modifiers | Description
---------+--------+----------+-------------
 zipcode  | text    |           | 우편번호
 sido    | text    |           | 시/도
 gugun   | text    |           | 구/군
 dong    | text    |           | 동
 ri      | text    |           | 리/대표건물
 bunji   | text    |           | 번지
 seq     | integer |           | 일련번호
Indexes: newzipcode_dong_i,
         newzipcode_ri_i,
         newzipcode_zipcode_i
Unique keys: newzipcode_seq_i

 

여기서 '동'이나, '리/대표건물명'으로 검색을 한다고 했을때,

단순하게 생각한 쿼리라면,

 

SELECT * FROM newzipcode

WHERE dong LIKE '종로3가%' OR ri LIKE '종로3가%'

 

이런식이으로 하면 되겠지요.

하지만, 여기서 주의해야할 것은 바로 or 조건입니다.

or 조건은 인덱스를 사용할 수 없습니다. 당연한 처리겠지요.

 

윗 쿼리의 가장 합리적인 처리는 '동'에서는 newzipcode_dong_i 인덱스를 사용하고,

'리'에서는 newzipcode_ri_i 인덱스를 사용하는 것이겠지요.

그런데, 하나의 쿼리문에서는 두개 이상의 인덱스를 사용할 수도 없으니,

이것에 대한 단순한 생각은 쿼리를 두번 사용한다는 것이겠지요.

바로 이럴 때, 이 두개의 쿼리를 union으로 묶는 것입니다.

 

SELECT * FROM newzipcode

WHERE dong LIKE '종로3가%'

UNION

SELECT * FROM newzipcode

WHERE ri LIKE '종로3가%'

 

이렇게 하면, 처음에 꿈꾸었던 그 완벽한(?) 쿼리가 되는 샘이지요.

 

--

 

(물론 좀더 꼼꼼하게 생각한다면, union은 '합집합'이라기보다는 두개를 쿼리를 단순하게 합치는 것이기 때문에, 두개의 쿼리안에 같은 자료가 있다면, 중복되어서 나타납니다. 이것에 대한 고려는 이 투토리얼에서 다룰 범위는 아닌 것같습니다)

 

또 심심하면, SQL 이야기 2를 꾸며보지요.

 

좋은 날 되소서.

이 글에 대한 댓글이 총 4건 있습니다.

절대 태클은 아닙니다..

 

걍 OR를 사용시에 문제점이 있나여..

 

SELECT * FROM newzipcode

WHERE dong LIKE '종로3가%'

OR ri LIKE '종로3가%'

유효하지 않는 전자메일님이 2003-02-07 09:41에 작성한 댓글입니다.

or 연산자는 인덱스를 사용하지 않습니다. 속도가 느려짐은 물론이요 비효율적이겠지요 -.-

 

SQL 이야기 2 해주세요~

그나저나 union 을 쓸때 특별히 주의 할점이 없는지요. 저도 union을 가끔 쓰는데 쓸때마다 유난히 조심스럽습니다 -_-;

신기배(nonun)님이 2003-02-07 12:23에 작성한 댓글입니다.

union all 을 쓰면 중복 제거 됩니다.

미르님이 2003-07-10 18:33에 작성한 댓글입니다.

PostgreSQL 버전에 따라서 or 연산에 대해서 인덱스를 사용하는 놈이 있고 안하는 놈이 있고 그렇네요. :(

아무튼 7.2.x 이상에서는 하는 것같습니다.

 

union 필요없이 or 연산으로도 가능하네요.

이때, 윗 예제라면, dong, ri 칼럼에 각각의 인덱스가 걸려있어야됩니다.

김상기(ioseph)님이 2003-09-04 12:53에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
4629PostgreSQL 7.3.1 윈도우2000에 설치하기
옥용수
2003-03-20
6982
45857.3의 table function 이야기 [5]
김상기
2003-02-18
12368
4578SQL 이야기 2. INSERT INTO ... SELECT
김상기
2003-02-12
8149
4551SQL 이야기 1. UNION [4]
김상기
2003-01-25
7880
4516PostgreSQL clog xlog 손상에 따른 복구 이야기
김상기
2003-01-08
9881
4488PostgreSQL 7.2.2-1 백업/복구
정재익
2002-12-19
10296
4475맥OS X(10.2) 에서 7.2.3 컴파일하기 [1]
신기배
2002-12-12
6608
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.072초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다