▶ 뭉충닷컴
 
mungchung.com login
Site Search
My Space
주절주절...
공부방
쥔장소개
Board
자유게시판
유용한 정보
자료실
Programming
강좌 & Articles
Spring 3.0
프로그래밍 Tip
   -ASP
   -PHP
   -JavaScript
   -HTML
   -Java/JSP
   -Database
   -Crystal Report
   -Visual Basic
   -이클립스
   -리눅스
   -기타
Windows API (VB)
Spread Sheet 7.0
컴퓨터활용 Tip
Other things
StarCraft 전략
StarCraft 문서
김용(金庸)
Son Q & Dieda

Query를 잼있고, 유용하게 사용해보자

조회 수 14724 추천 수 0 2005.10.01 12:18:40

일반 개발자에비해서 웹개발자들은 DB를 많이 이용한다. 심한 경우는 하루종일 DB작업만 하다가 퇴근하는 경우도있다. 모 대기업에서 근 4년동안 개발직으로 근무했을때 개발할때는 프로그래밍위주로 일을 하지만 개선할때는 주로하는 일이 DB다루는 일이였다. 사이트란게 1년 정도 지나면 많이 안정화되기 때문에 새로운것 추가되거나 내용 좀 바꾸지 않는 이상은 프로그래밍 적으로 별로 할일이 없는데, 대신에 DB에 있는 데이타 가공해서 뿌려주거나, 다른 이기종 DB간의 인터페이스 하거나 잘못된 값들 찾아서 DB의 값들 바꿔주거나 하는 일들 많이 생긴다.

프로그래밍 안하고 요런 얍삽한 짓거리만 하다보니 개발도 좀 더 쿼리를 이용해서 얍삽한 짓거리를 하기 시작했다. -_- 그 얍삽한 짓거리들 에전에 한참 근무했을때 어디다 적어둘까, 강좌로 만들까 생각만하고 귀찮아서 안하다가 1년이상이 지난 지금 적으려니 기억이 가물가물하다. 게다가 테스트용 Data를 만들어야 하는데 이 별것 아닌 테스트 Data 만드느라 고생했다.

일단 아래 예제들 직접 실행해 보려면 Sql Script 파일 다운받아서(첨부파일 받으면됨) 쿼리분석기에서 한번 실행해주자. 그럼 2개의 테이블이 생성되고 데이타들이 들어가있을꺼다. 그 안의 데이타의 이름이나 정보들은 뭉충한 나의 친구들의 정보를 약간 변형한것이다 -_-

다룰 내용은 아래와 같이 2가지다.




쿼리문으로 웹개발 좀 더 쉽게하기

보통 웹개발자들이 쿼리문 쓸때 그냥 단순히 "Select * From 테이블명" 이런식으로 해서 데이타들 가져온후에 그 데이타를 가공한다. 예를 들어보자 웹에서 이름과 이메일을 "이름 (이메일)" 이런식으로 보여준다고 하면 대개 아래와 같이 한다.

strSql = "Select User_Name, User_Email From UserBasic" Set rs = DBConn.Execute(strSql) Do Until rs.Eof Response.Write Rs(0) & " (" & Rs(1) & ")" Response.Write "<br>" Rs.MoveNext Loop

위의 방식이 잘못된것은 아니고 일반적으로 아주 많이 사용하는 방식이다. 근데 이걸 쿼리문을 조금 더 이용해서 간단하게 할수 있다.

strSql = "Select User_Name + ' (' + User_Email + ')' From UserBasic" Set rs = DBConn.Execute(strSql) Do Until rs.Eof Response.Write Rs(0) & "<br>" Rs.MoveNext Loop

위의 코드를 보면 이전 코드와 달라진점은 쿼리문이 좀 달라졌다는걸 알수있다. 실제로 이 쿼리문을 실행하면 아래와 같은 모양으로 나온다.

첫번째 방법이랑 두번째 방법이랑 둘다 똑같은 결과를 뿌려주지만 뭐가 좋은지는 나도 모른다. -_- 속도테스트 그런것 없다. 가끔 어떤 강좌들 보면 똑같은 결과라도 방식이 몇개 있으면 효율성이나 속도성등 테스트해서 더 좋은놈이 뭔지 가르쳐주기도 하는데 나는 그런것 없다. 그런것 하면 조낸 귀찮은거다.

헛소리 그만하고 또 다른 놈을 알아보자. 이번엔 날짜를 뿌려주는 부분에 관한 내용이다. 자.. 위에 첫번째 예제에 asp로 하는 예시까지 적었더니 이번엔 갑자기 조낸 귀찮아 졌다. 아래 이미지만 보자

이미지 보면 알것지만 절대 설명할 필요가 없다. 그냥 날짜 뿌려질때 보통 asp상에서 뒷부분 시간 짤라내던것을 이젠 쿼리문으로 뒷부분 시간이 아예 안나오게 한거다. 여기서 쓰인 Sql 함수가 Convert 인데 요건 DB에 RegDate의 타입이 datatime로 된 데이타들을 char 형으로 형변환 한것이다. 그렇담 3번째 인자에 있는 120은 뭐냐? 그건 날짜를 표현하는 방법의 스타일중 하나다. 그냥 몇가지 정해진 상수중 하나다. 자세한 내용은 쿼리분석기에서 도움말 연후에 Convert로 색인 찾아서 보면 이 강좌보다 더 많은 내용을 찾을수 있다. 보통 120을 많이 쓰므로 여기선 120만 소개한다.

쿼리문으로 형변환까지 했는데 이젠 문자열 바꾸는것 까지 해보자. 웹에서 보여줄때 DB에 있는 데이타 그대로 보여주지 않는 것도 있다. Replace 함수 이용해서 좀 바꿔서 보여주는경우 있는데 이것도 asp 말고 쿼리문으로 실행해보자. 역시나 아래 이미지를 본다.

쿼리문상에서 Replace 이용했는데 asp랑 사용법 똑같다. 아무래도 MS 계열 프로그램이라 본지 Sql함수들 사용하다 보면 Visual Basic 함수들과 유사한 함수들이 많다. 그러니 asp 좀 할줄 알면 '혹 요 asp 함수도 먹힐까?' 라고해서 쿼리문에 실행해보면 아주 잘 먹힌다.

자 이젠 갈때까지 가보자. 이젠 아예 쿼리문에 프로그래밍 넣어보자. 쿼리문으로 프로그래밍 제대로 하려면 스토어드 프로시저를 이용해야한다. 뭐 근데 간단한 프로그래밍 이용하려면 Case 문 을 쿼리문에서 직접 이용해도 된다. 역시나 아래 이미지를 본다.

User_Role란 컬럼이 있는데 거기서 A란 권한은 '접근가능' 으로 뿌려주고 'B'란 권한은 '접근불가'로 뿌려주려고 한다. 웹에서 이런 것 처리하려면 역시나 if 문이라던가 case 문 이용해서 A 일땐 '접근가능'.. 이런식으로 처리해줘야하는데 귀찮으니 아예 쿼리상으로 처리한거다.

강좌를 적고보니 이 Case문 과연 쓸일이 있을까 하는 생각이 드는데 나는 좀 많이 사용했다 -_-; 보통 사용할때가 DB의 데이타들 엑셀로 달라고 할때 요런식으로 A,B 코드로 들어간 값을 명칭으로 바꾸려고 할때이다. 뭐 엑셀에서 문자열 바꾸기 이용해서 바꾸는 방법, asp로 임시 페이지 만들어서 처리하는 방법등등이있겠지만 내가 사용한 방법은 그냥 쿼리문에서 위의 이미지처럼 처리한후에 그 아래 뿌려져나온데이타 긁어서 엑셀에 붙여넣기 해서 줬다.

 

 

2개의 테이블을 이용해 Data 수정, 삭제해보기

이제 내가 낑낑대며 만든 Sql Script를 제대로 이용할때다. 위의 강좌들은 보여주는 방법들을 조금 다른 각도에서 바라본 것들이다. 지금 할것은 조인을 이용해서 테이블들의 데이타를 수정, 삭제하는방법이다.

이 쿼리문들은 책에서 본적도 없고, 누가 가르쳐 준적도 없고, 어디 웹에서 본적도 없다. 어쩌다 우연히 아주 우연히 쿼리문가지고 지랄(?)하다보니 된것이다. 그렇다고 어려운것도 아니고 대단한것도 아니다. 단지 좀 쿼리문이 이상할뿐이다. -_-

이 쿼리문들 역시나 예전엔 많이 사용했는데 테스트 쿼리 만드는 시점에선 적으면서 '이런것 언제 사용하지?' 생각이 문득 떠올랐다. 지금 강좌 적는 시점에서 생각해보니 테이블들이 조인된 관계에 있을때 수정/삭제를 쿼리문을 한단계 줄이면서 사용할때 유용하다.

UserBasic, UserDetail 테이블에 있는 레코드들을 보자

위의 데이타를 살펴보면, UserBasic 테이블은 사용자 기본 정보가 들어가있고, UserDetail은 사용자 상세정보가 들어가있다. UserBasic테이블에서 회사원과 학생은 User_Role이 A 이고, 백수와 오타쿠는 B로 되어있다. 즉 회사원, 학생은 접근가능(A) 하지만 백수, 오타쿠는 불쌍하게도 접근불가(B) 이다.

자! 여기서 새로운 코드 C가 하나 생겼다고 가정하자 이 C는 "절대접근불가" 라고하고 이 절대접근 불가에 해당하는 사람들은 "오타쿠" 들이라 한다면 이 오타쿠들에 해당하는 사람들의 User_Role 값을 B -> C로 변경해 줘야한다. 어떻게 해야 편하게 할수 있을까?

Sql이 약한 사람들은 아래처럼 할지도 모른다.

Select User_Idx From UserDetail Where User_Kubun='오타쿠'

이렇게해서 나온 User_Idx 값을 어디다 적어둔후에

Update UserBasic Set User_Role='C' Where User_idx in (적어둔 User_Idx값들)

이런식으로 할꺼다.

지금이야 데이타가 몇개 안되지만 데이타가 몇만건 된다면? 그땐 조낸 괴로운것이다. 요걸 간단하게 하는 방법이 2가지 있다. 더 있을수도 있지만 2가지 밖에 기억이 안난다.

첫번째 방법은 조인문을 이용한 방법이다. 일단 오타쿠들에 해당하는 데이타들을 레코드들을 가져와보자

Select
    *
From
    UserBasic a
    Inner Join UserDetail b On a.User_idx=b.User_idx
Where
    b.User_Kubun = '오타쿠'

이 레코드 5개에 오타쿠에 해동하는 사람들이다. 이 사람들의 User_Role를 B->C로 변경하려면 다음 쿼리문을 이용하면 된다.

Update UserBasic Set User_Role = 'C'
From
    UserBasic a
    Inner Join UserDetail b On a.User_idx=b.User_idx
Where
    b.User_Kubun = '오타쿠'

쿼리문 잘 야려보면 알것지만 From 절부터 Where절까지는 모두 같지만 제일 첫줄만 다르다. 요 구문 가지고도 실행해보면 아래 이미지처럼 나온다. 뻘겋게 옅게 칠해진 부분을 보면 C로 User_Role가 변경되었다.

두번째 방법은 서브(Sub) 쿼리를 이용한 방법이다. 오타쿠들을 B->C로 변경했으니 이번엔 학생들의 User_Role의 값을 A->D로 변경해보자. 그러기 위해선 일단 학생들의 데이타들이 뭔지 알아야한다. 이번엔 조인을 사용하지 않고 서브쿼리를 이용해서 학생들의 데이타만을 뽑아보자.

Select
    *
From
    UserBasic
Where
    User_Idx in (Select User_Idx From UserDetail Where User_Kubun='학생')

요 위의 2개의 레코드를 바꿔보자. 하는 방법은 첫번째 방법과 거의 똑같다.

Update UserBasic Set User_Role='D'
From
    UserBasic
Where
    User_Idx in (Select User_Idx From UserDetail Where User_Kubun='학생')

쿼리문 보면 역시나 From ~ Where 절까지는 그대로 복사하고 위의 첫줄만 바뀌었다. e 얼마나 편한 방법인가 -_-

위의 이 첫번째, 두번째 방법을 꼭 수정(Update)만 아니고 삭제(Delete)에서도 똑같이 이용할수 있다. 자 이제 오타쿠들과, 학생 데이타들을 삭제해보자.

오타쿠 삭제

Delete From UserBasic
From
    UserBasic a
    Inner Join UserDetail b On a.User_idx=b.User_idx
Where
    b.User_Kubun = '오타쿠'

학생 삭제

Delete From UserBasic
From
    UserBasic a
    Inner Join UserDetail b On a.User_idx=b.User_idx
Where
    b.User_Kubun = '학생'

오타쿠들 삭제는 첫번째 조인문을 이용한 방법으로 삭제해봤다. 역시나 From ~ Where 절은 똑같고 제일 첫줄 쿼리만 바꼈다. 학생들 삭제는 두번째 서브쿼리를 이용한 방법으로 삭제한거다. 이것도 마찬가지다!

참고로 Sql 관련 함수들 보고 싶다면 도움말 참조해라. 뭐..근데 솔직히 도움말 이용하는게 그리 쉽지 않다는것을 알것이다. 귀찮고 찾기도 짜증나고 글도 너무 딱딱하다. 보통 강좌들 보면 도움말, 도움말말하는데 확실히 좀 더 깊게 들어가면 웹에서 찾아보는것에 한계가 있고 질문 올려도 잘 대답 안해준다. 그래서 도움말을 이용할수 밖에 없게 된다. 아래이미지는 Case 문 을 도움말에서 찾은것이다. 요런식으로 도움말 보면 예제가 너무도 잘나와있다. 나의 허접한 Case 예제는 정말 쓸데없는 예제처럼 보일정도다 -_-...

이번 강좌는 여기까지가 마지막이다. 언제나 쓰면서 느끼는 거지만 '손민창을 위한 강좌' 인듯 싶다 -_-... 아무도 안보는것 열심히 만들어 두는데 그래도 가끔씩 보면 뭔가 뿌듯하다. -_- 아침에 일어나서 2시간 넘게 고생했네, 할것도 많구만.


댓글 '3'

한~

2006.02.02 14:11:46
*.54.4.54

잘 보구 갑니다..앞으로 좋은 강좌 마니마니 부탁드려요~~

조학현

2007.04.05 08:58:39
*.181.179.237

아 ~ ㅋ 너무재밌어요 이 강좌~ㅋㅋ
정말 잘봤습니다~!

조대길

2007.06.02 11:48:27
*.46.185.35

잘보구 갑니다.. 설명 좋구여...
문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
27 keyfile을 이용한 ssh 접속 방법 뭉충닷컴 2010-10-28 13684
26 멀티 브라우저 지원하는 frame, iframe 접근 코딩 방법 [3] 뭉충닷컴 2010-07-21 26318
25 crontab을 이용한 Tomcat 서버 자동 재시작 shell 뭉충닷컴 2009-08-28 25018
24 자바스크립트로 각 form의 element(요소)에 접근 방법 file [2] 뭉충닷컴 2008-09-11 55964
23 ERwin 에서 Logical의 컬럼명을 코멘트(Comment)로 변경하기 file [2] 뭉충닷컴 2008-01-16 31740
22 Tabular Data Control 마지막 강좌! 뭉충닷컴 2007-06-14 15702
21 ASP로 웹 어플리케이션 주소 사용하기 file 뭉충닷컴 2006-12-10 17907
20 VB로 WebBrowser 컨트롤의 HTML 제어 file 뭉충닷컴 2006-12-01 21389
19 ASP 페이징 쉽게 처리하기 file [4] 뭉충닷컴 2006-08-29 24244
18 두개의 비슷한 DB를 비교해서 변경된 부분 찾아내기 file 뭉충닷컴 2006-05-03 15000
17 ASP에서 Class 를 이용해보자 file 뭉충닷컴 2006-02-26 24770
16 Hotmail의 DHTML EDITOR 편집기를 이용해보자. file [34] 뭉충닷컴 2006-02-04 30232
15 Tabular Data Control 응용 - 제목 Sort (정렬) 쉽게 하기 [3] 뭉충닷컴 2006-01-27 14141
14 스크립트(Script) 코드를 암호화 시켜보자(Encode/Decode) [2] 뭉충닷컴 2005-06-10 19107
13 dll을 이용한 로그인 file [1] 뭉충닷컴 2005-11-25 22021
12 Tabular Data Control 응용 - 페이징 처리하는 3가지 방법 file [1] 뭉충닷컴 2005-11-23 16271
» Query를 잼있고, 유용하게 사용해보자 file [3] 뭉충닷컴 2005-10-01 14724
10 Tabular Data Control 응용 - 테이블의 행 배경색이 격으로 변하게하기 뭉충닷컴 2005-09-25 15796
9 폼(Form) 검증해주는 스크립트(Script) file [15] 뭉충닷컴 2005-06-07 19262
8 asp 로 서버에 zip 압축/압축해제(풀기) 예제 file [8] 뭉충닷컴 2005-08-12 19746
7 MS-SQL의 osql.exe 이용 하기 (도스상에서 sql 구문 이용) 뭉충닷컴 2005-09-25 19302
6 SQL Script 로 ERD와 테이블 생성 손쉽게하기 뭉충닷컴 2005-09-25 21602
5 Tabular Data Control 기초 다지기 4 - 마지막! file 뭉충닷컴 2005-09-25 14683
4 Tabular Data Control 기초 다지기 3 file 뭉충닷컴 2005-09-25 14477
3 Tabular Data Control 기초 다지기 2 file 뭉충닷컴 2005-09-25 14182
2 Tabular Data Control 기초 다지기 1 file [1] 뭉충닷컴 2005-09-25 15222
1 OWC를 이용한 웹에서 엑셀 그래프 그리기 file [4] 뭉충닷컴 2007-12-19 18974