'Mobile & IT Life'에 해당되는 글 32건

  1. 2012/02/17 12V 3A 아답타; 아수스(Asus)넷북용을 한성넷북 GX102에 사용
  2. 2012/01/13 자바 Java SDK 설치
  3. 2012/01/13 보행중 문자 금지 ! - No Texting While Walking
  4. 2011/12/29 making Windows xp ghost image
  5. 2011/12/27 이불 속에서 고민하지 말고 현장으로 들어가서 부딪히고 경험하라 !
  6. 2011/12/05 프로그래머는 이런 사람
  7. 2011/11/07 소니 X1 (Sony X1) 깜듀롬 2.2Final에서 맵피(Mappy) 구동하는 방법
  8. 2011/08/10 알약, V3는 정부가 나서서 보호해야 할 좋은 프로그램입니다. (4)
  9. 2011/05/30 컴활 1급실기 엑세스 2009년 4회 문제 2의 1 강의
  10. 2011/05/26 금융자산 지키는 보안 8계명 (안철수 연구소)
  11. 2011/05/26 컴활 1급실기 엑세스 2009년 4회 문제 1번 강의
  12. 2011/05/23 윈도우 2003서버 원격데스크탑 포트번호 바꾸기
  13. 2011/05/19 휴렛팩커드 HP 6535s 노트북... 결국 하드디스크도 맛이 가버림
  14. 2011/04/29 [sql 2005] Transact SQL 기본 (12) : Select Advanced (5) 집계함수 다루기
  15. 2011/04/29 [sql 2005] Transact SQL 기본 (11) : Select Advanced (4) 집계함수 다루기
  16. 2011/04/29 [sql 2005] Transact SQL 기본 (10) : Select Advanced (3) 집계
  17. 2011/04/29 [sql 2005] Transact SQL 기본 (9) : Select Advanced (2) Order by
  18. 2011/04/29 [sql 2005] Transact SQL 기본 (8) : Select Advanced (1)
  19. 2011/04/28 [sql 2005] Transact SQL 기본 (7) : Null 찜쪄먹기
  20. 2011/04/28 [sql 2005] Transact SQL 기본 (6) : Delete ~ From ~
  21. 2011/04/28 [sql 2005] Transact SQL 기본 (5) : Update ~ From ~
  22. 2011/04/28 [sql 2005] Transact SQL 기본 (4) : INSERT
  23. 2011/04/27 [sql 2005] Transact SQL 기본 (3)
  24. 2011/04/27 [sql 2005] Transact SQL 기본 (2)
  25. 2011/04/27 [sql 2005] Transact SQL 기본 (1)
2012/02/17 19:40
한성넷북 GX102 아답타를 추가 구매했습니다. (현재 GX102를 1년 3개월째 사용중)
아수스 넷북(Asus)용 12V 3A 아답타를 사용할 수 있더군요.


한성넷북 GX102를 사용하고 있는데 MS-SQL 2005와 같은 프로그램 설치할 때와 FS2004로 비행시뮬할 때만 빼면 무선랜 켠 상태로 4시간동안 배터리로 사용합니다.

경험상 배터리만 사용해서 하루 일과시간에 쓰려면 무선랜 켜고, 화면밝기 70~80%로 사용하는 상태에서 최소 10시간은 되어야 진정 모바일 넷북의 반열에 겨우 올라설 수 있겠습니다.

에이서 12V 3A 월타입(Wall Type) 아답타처럼 아답타 몸체에서 바로 전원 컨센트에 꽂을 수 있는 모델이 아니기 때문에 아답타를 휴대하고 다니는 것이 의외로 불편합니다. 역시 별도로 구하기는 어렵더군요. 잭 사이즈도 맞지 않고.

그래서 아답타를 집과 사무실에 하나씩 두고 쓰려고 아답타 검색을 했는데 한성넷북 GX102 잭에 맞는 12V 3A 아답타를 구하기가 쉽지 않았습니다. 아수스(Asus) 넷북용 12V 3A 아답타는 제법 검색이 되었는데 잭 사이즈가 제가 사용하고 있는 한성넷북 GX102와 같은 것인지 알 수 없더라구요.

거의 포기하고 있다가 얼마 전에 다시 생각이 나서 검색을 해봤는데 외경 4.7 내경 1.7 미리로 잭 사이즈가 기록되어 있길래 바로 구매를 하였답니다. 한성넷북 GX102 를 사용하시는 분들 중에서 12V 3A 아답타를 여분으로 구하려면 아수스 넷북용 12V 3A 아답타를 쓰면 되겠습니다. 구매전 잭 사이즈(내경, 외경) 꼭 확인하시구요 !

아래 제가 구매한 옥션 매장의 링크를 붙여두겠습니다. 참고하세요 ~
구매처 :
http://itempage3.auction.co.kr/DetailView.aspx?ItemNo=A588008411&frm3=V2


※ 한성넷북 GX102 구매 사용기 : http://huey4u.net/entry/한성넷북-GX102-사용기

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2012/01/13 16:31
별도의 설명은 없습니다. 다음 그림 순서를 따라 설치하세요.

















































저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2012/01/13 14:59

휴대폰이 너무나 스마트 해지려고 하다보니 사람들은 덜 스마트(less smart) 해지고 있습니다.

보행중 귀에 이어폰 꽂고 음악 들으면서 휴대폰 문자 사용하다가 분수대에 빠지거나 다른 사람과 부딪혀 넘어지고 돌출된 장애물에 걸려 넘어져 가벼운 찰과상을 입기도 합니다.


심지어는 버스 정류장에서 버스를 기다리는데 머리 한 쪽에서는 음악을 듣고 또 다른 한 쪽에서는 문자로 답장 보낸다고 정신 없습니다. 그러는 상황에서 분명히 자기가 타야 할 버스 번호를 보면서 머리 속 한 부분 즉, 세번 째 부분에서는 "타야지~" 하지만 행동으로 옮겨지지 않지요. 버스는 기다려 주지 않고 출발해버립니다. 이렇게 버스를 놓치는 경우도 다반사지요.


미국에서는 걸어다니면서 문자보내는 행동(texting while walking)을 자제하라는 홍보가 눈에 많이 띕니다. 이런 가운데 미국 필라델피아 주 에서는 앞을 보지않고 휴대폰 문자를 누르고 다니는 보행자에게 120달러(한화 약 12~13만원)의 벌금을 부과할 것이라는 발표도 있었습니다. 한편 헤드폰, 이어폰을 꽂고 보행중이거나 자전거를 타고 이동하는 사람들에 대한 통제력을 가하기 위해 입법(入法)이 필요하다는 변호사도 있었습니다.


한국에 이러한 법이 만들어진다면 제제를 가하는 경찰관에게 "왜 이러세요 ~ !" 하고 대들 수도 있습니다. 이들 보행자를 통제하는 법안이 만들어졌다면, 강력한 법치(法治)국가인 미국에서 "왜 이러세요~!"처럼 대들면 과중처벌까지 됩니다. 흥미로운 것은 "범죄"로 다룬다는 것이죠. 범죄라는 것은 과태료, 훈방 조치가 아니라 "형법(Criminal Law)"으로 다루는 것이니까요.


우리나라는 이 상황을 과연 법으로까지 입법추진하여 공권력으로 제제를 가할 수 있을지 의문입니다만 - (모든 것을 법으로 규제하려는 발상 매우 어리고 아쉽게 보입니다만....) - , 법이 있던 없던간에 "내 몸 하나 지키는 안전"만큼은 "나 스스로 최선을 다해 주의해야 할 것"입니다.


모바일이 우리 삶을 풍요롭게 하지만 늘~ "안전"과 "개인정보 보호"에 대해서는 깊은 관심을 가지고 살아야 하는 세상입니다.



※ 영어 자막까지 넣을 시간은 안 됩니다 ~ oTL;;;    영상이 매우 흥미롭기 때문에 꼭 한 번 보시기 바랍니다.



1. 뉴욕타임스에 올라온 관련 영상 (여기를 클릭하세요.)


2. CBS에 올라온 관련 영상



4. 유투브(youtube.com)에 올라온 동영상 중 하나




3. 앞 안 보고 가다가 전봇대에 부딪혀보셨나요 ~ @#$%;;;;





저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/12/29 20:20
1. go to the snoopybox
2. get snoopy ghost R3
※ how to use the snoopy ghost
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/12/27 02:57
출처 1 : 네이버 자바초보스터디 카페
출처 2 : 김형태님의 홈페이지

젊은 후배들 뿐만 아니라 죽는 그 날 까지 인생의 현역으로 남고 싶은 모든 사람들에게 1독(一讀)을 권하고 싶은 글 입니다.

글은 2004년 3월 19일에 천안공대 윤덕용 교수님께서 작성하신 글이며 PDF파일로 첨부합니다.
다운로드 받아 읽으시기 바랍니다.

첨부파일 :


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/12/05 21:47

새로운 것을 만드는 것에 열정을 가진 이들이다.

개성이 넘치는 이들이 많다.

합리적이고 이성적인 사고를 한다.

일에 대해서 헌신적이다.

돈보다 더 중요한 가치를 추구한다.

신뢰를 중요시 여기는 사람들이다.



출처 : http://clinicforum.com/2011/10/26/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%99%80-%EC%9D%BC%ED%95%A0-%EB%95%8C-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%EA%B2%83/
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/11/07 12:38
가지고 노는 X1에 맵피를 깔아 쓰려고 삽질하던중 다음을 알게되어 공유합니다.

주의 : 롬업과정에서 일어나는 문제에 대해서는 절대로 책임지지 않습니다. 자신있는 분들만 시도하세요.

준비물

1. 깜듀롬 2.2 Final ->
받으러 가기(여기를 클릭)
2. 맵피 (없으면 정품 구하세요.)


★ 페이지 풀 설정
 1. PagePool Changer.exe 실행
상단의 ROM FIle 선택하는 버튼 Select... 을 눌러서 확장자가 nbh로 되어 있는 롬 이미지 파일을 선택한다.
 
 2. Custom 칸의 삼각형 ▲ 버튼을 눌러서 80 이 되도록 한다. 80MB까지 쓰겠다는 뜻이다.

3. 그러면 바로 아래 빨간색 박스친 부분에 Change to 라고 나오는데 이넘을 누른다.

4. 잠시후 Status 칸에 Ready 라고 나오면

5. Close
 


★ 반드시 위 페이지 풀 값을 80으로 설정한 후 롬업을 한다.

롬업과정이 끝난 후 맵피를 설치하면 잘 작동하는 것을 확인할 수 있습니다 !
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/08/10 13:27

개발을 하는 사람의 입장에서 이번 네이트 해킹사건을 보면 여러 군데에서 미심쩍은 부분이 많다는 것을 느낍니다. 특히 N사와 D사가 알툴스(이스트 소프트) 제품을 모두 제거하라고 사내 직원들에게 공지했다고 합니다.

자세한 것은 밝혀지겠지만 저는 한 편으로 이런 것을 떠올려 봅니다.

알약이 나오지 않았던 시절 안철수 박사님께서 국내 최초로 백신 프로그램을 만들었습니다. 그 프로그램은 V3로 유명해졌고 우리 국민들 대부분 V3를 무료로 제공받아 사용을 해왔습니다. 그러던 어느날 미국의 한 거대 백신소프트웨어 업체가 천문학적인 돈과 개인 주택과 자가용 제트기까지 주겠다며 안 박사님을 꼬셨지만 안 박사님은 끝내 거절해서 V3를 지켜냈습니다.

우리나라는 유닉스, 리눅스, 맥 OS, 윈도우즈 같은 운영체제 프로그램이 아직 없을뿐입니다.

오히려 바이러스를 막는 백신은 미국보다 더 강하다고 생각합니다. 그 대표적인 것이 안철수 연구소의 V3, 이스트 소프트의 알약 그리고 지금은 사라졌지만 안드로이드폰에서 다시 떠오르고 있는 바이로봇 입니다.

V3, 알약, 바이로붓 !

뿐만 아니라 동영상 보는 프로그램, 음악 듣는 프로그램, 이미지 보는 프로그램 등등 제법 많은 양질의 프로그램들을 무료로 쓰고 있습니다. 다양한 유틸리티를 이렇게 무료로 제공해주는 개발자는 흔치 않습니다. 악성코드 실행 막아주는 울타리, 윈도우즈 환경 최적화할 수 있는 트윅, 알집에 견줄 수 있는 빵집 등등 우리는 불행중 다행이라고 할까 우리나라에 이런 좋은 사람들이 있습니다.

자주 떠오르는 해킹사건에 복잡한 고리 속에서 우리 토종 프로그램들이 역사 속에서 사라지지 않도록 해야 한다고 생각합니다. 만약 다시 외국의 어떤 거대 업체가 알약, V3를 집어 삼키게 된다면? 이런 상황은 해킹보다 더 끔찍하지요.

알약의 경우 메모리에 상주하는 프로그램 크기가 많고 떠 있는 프로세스가 간혹 CPU 사용률을 높이는 일이 있습니다. 허나 이름이 잘 알려지지 않은 파일공유 및 다운로드 같은, 프로그램 내려받기 사이트에서 제공하는 다운로드 전용 프로그램에 비하면 참고 봐줄 수 있는 문제지요. V3 역시 간혹 CPU사용률을 높이는 경우도 있습니다. 성능은 서로 비슷 비슷합니다. 다운로드 전용 프로그램이나 파일공유 프로그램들이 오히려 시스템 속도를 저하시키고 악성코드를 유포시키는 개구멍으로 사용되죠. 게다가 그리드(Grid) 시스템이라 때때로 시스템 성능을 저하시키는 경우가 많습니다.

이번 해킹 사건으로 이스트 소프트의 수사 대상 프로그램은 알툴즈 업데이트 라고 알고 있습니다.

업데이트 프로그램의 어떤 코드가 어떤 기능을 가지고 있어서 문제의 결과를 만들어내었다는 수사결과가 나와야 공신력과 수사기관의 권위가 설 것이라 생각합니다. 또한 이러한 수사결과가 있어야 외국 보안프로그램 업체의 공격으로부터 우리 토종 프로그램들을 보호할 수 있을 것이라 확신합니다.

따라서 저는 문제가 되는 업데이트 프로그램만 삭제하였습니다.

하나 더 말하면 오라클, MS-SQL, mySQL에 못지 않은 국산 데이터베이스 프로그램이 있습니다. 큐브리드(Cubrid)라고 하지요. 한컴 오피스도 아직 갈 길은 멀지만 MS 오피스에 필적할 정도로 수준이 높습니다. 국산 운영체제가 만들어져 국제 표준이 되는 날을 기대해봅니다. 왜냐하면 우리는 충분히 그렇게 해낼 수 있는 실력이 되니까요.

특정 기업을 사냥하는 수사가 아니라 우리의 저작권, 우리나라의 國富(국부)를 지켜내는 지혜가 모이는 사건이기를 기대해봅니다.

2011.8.10.水
헬기조종사 휴이(huey)
http://huey4u.net

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

  1. Favicon of http://social-media.kr BlogIcon 철산초속 2011/08/10 15:37  댓글주소  수정/삭제  댓글쓰기

    왠지모르게...감동적인 글이네요...잘읽고갑니다...;

  2. Favicon of http://blog.naver.com/altools BlogIcon 알툴즈 2011/08/10 16:40  댓글주소  수정/삭제  댓글쓰기

    알툴즈입니다. 이번 건의 조사결과를 기다리는 입장에서 휴이님의 글을 보게 되었습니다. 알집 공개용에 사용되는 업데이트 모듈의 보안취약점이 발견되어 8월 4일 이후 제품을 실행하면 자동패치되도록 했습니다. 삭제하신 업데이트 프로그램이 혹시 알툴즈 업데이트 프로그램이라면 이번 건과 무관하오니 삭제하지 않으셔도 됩니다. 심려끼쳐 드려 죄송합니다. 그리고 응원해 주셔서 감사합니다.

    • Favicon of http://huey4u.net BlogIcon 휴이(huey) 2011/08/10 22:25  댓글주소  수정/삭제

      위기는 곧 기회라는 말을 많이 합니다. 시련은 이겨낼 것이고 시간은 흐를 것 입니다.

      소프트 파워가 앞으로 대한민국의 힘이 될텐데 부디 좋은 프로그램 많이 만들어내고, 프로그래머 인재가 많은 참신한 기업으로 거듭나면 좋겠습니다.

      또한 우리 국민들 많이 사랑해주세요.

  3. 알약도 그리드? 2012/01/31 01:14  댓글주소  수정/삭제  댓글쓰기

    관리자의 승인을 기다리고 있는 댓글입니다

2011/05/30 08:57


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/05/26 13:35

출처 : http://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?curPage=1&menu_dist=5&seq=17866&dir_group_dist=0

최근 잇따라 발생하는 금융보안 사고로 인해 많은 은행의 고객들이 불안해 하고 있다.
뉴스에서는 그들이 어떻게 해킹을 당했는지, 그들의 보안 관리자가 얼마나 허술했는지 연일 보도하고 있다. 그러나 문제는 보안이 뚫렸다는 것이고 더욱 중요한 것은 해당 금융권의 고객들은 무엇을 해야 할지 손쓸 틈도 없었다는 것이다.

금융권에서 여러 가지 대책을 세우고 보안에 투자를 강화하겠다는 것은 다행한 일이나 무엇보다 내 재산은 내가 지킨다는 각오로 미리 보안 수칙을 인지하고 지키는 것이 중요하다.

인터넷 뱅킹 사용시 지켜야 할 개인 보안 수칙을 알아보자.

1. 은행 인터넷 뱅킹 계정이나 포탈 메일 계정 비밀번호를 주기적으로 변경 및 관리한다.

2. 공인인증서, 보안카드, 비밀번호 등을 스캔해서 사진파일이나 엑셀파일 형태로 개인 이메일 계정 또는 인터넷 하드에 저장하지 않는다.

3. 가급적 공인인증서는 PC보다는 USB나 외장하드 등 이동저장매체에 보관해서 인터넷 뱅킹 사용시에만 PC에 연결해서 사용한다.

4. 인터넷 금융거래 계정 ID와 비밀번호는 포탈 메일 계정 ID비밀번호와 다르게 사용하고 절대 타인에게 알려주지 않는다.

5. PC방 등 공공장소에서 인터넷 뱅킹 사용은 물론 각종 사이트에 로그인하지 않는다.

6. MS 윈도우 보안패치 및 백신을 설치하여 주기적인 백신 업데이트를 해 늘 최신으로 유지한다.

7. 업데이트 한 백신의 실시간 검사를 이용하고 주기적으로 수동 검사를 한다.

8. 계좌이체, 공인인증서 재발급 등 이용 내역을 알려주는 휴대전화 문자(SMS)서비스를 이용한다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/05/26 00:52



강의보기 : 휴이쌤의 영어교실  tutor.huey4u.net
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/05/23 21:12
터미널 서비스의 기본 포트값은 3389

1. 레지스트리 편집기를 열고 아래와 같이 변경합니다.
HKEY_LOCAL-MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp\PortNumber 에 PortNumber 값을 변경 (10진수로 선택하여 원하는 번호로 변경)


2. 방화벽 설정에서 기존의 원격데스크탑 포트를 선택해제 하고 새로운 이름으로 포트를 하나 추가해야 한다.

예) 포트번호를 위 1번에서 54321 로 변경하였다면
방화벽 설정에서 예외추가에 포트추가 메뉴에서 새로운 이름, "my원격" 등 과 같이 입력하고 포트번호 54321 을 입력한다. 그리고 각자 운영하는 서버환경에 따라 접속허용범위를 설정한 후 재부팅한다.

3. Remote PC에서 원격데스크탑을 열어서 123.456.789.012:54321 과 같이 접속하여 잘 되는지 확인한다.

★ 윈도우XP도 동일하게 설정해주면 됩니다.
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/05/19 16:37
노트북 구매한지 만 3년도 안되었는데 하드디스크가 가버린 것은 이번이 처음이다.

노트북 제조사는 휴렛팩커드, 뜨거운 발열로 말썸많았던 6535s 기종이다.
첨 살때부터 붙어있었던 하드디스크는 후지쓰(Fusitsu)社 제품으로 SATA방식 250GB 용량.

6535s는 구매 이후 단기간에 나의 정서를 무참하게 짓밟아버린 기종이다. 특히 이넘의 발열 문제는 입으로 말 하기도 힘들다. 때문에 이넘의 냉각팬 뜯어버린 이야기를 올린 적 있었다.


그런데 몇일전 전원버튼을 눌렀는데 하드디스크에서 "끼릭 끼릭~"하는 소리만 들리고 전혀 반응이 없었다. 바이오스(BIOS)에서도 전혀 인식이 없었다. 직감으로 하드디스크가 나갔구나 했다. 그래도 요즘 경제도 어려운데 그냥 버릴수가 있나 ~


해서 ... 뜯어보았다.
결과는 역시나 ~

디스크의 정보를 읽어주는 Arm이 자리를 잡지 못하고 헤메고 있는 소리였다. 에혀......

기계적으로 맛 간건 아닌거같은데 ~ 전문 테스트 장비가 없으니 더 이상 어케 해볼 수도 없고

주머니 사정 나아지면 새 하드로 교체해야겠다.

1980년대 중반 MSX컴터 첨 나올때부터 컴터를 썼는데
노트북에서는 품질과 성능이 가장 좋았던 제품이 "IBM 씽크패드"
가격대 성능비로는 한성노트북, Acer, Asus 제품이 월등하다.
- 지극히 필자의 개인적인 견해임.

하드 디스크가 맛 간 여러가지 증상에서 하나가 "끼릭 끼릭 ~ "하는 소리가 계속 나는 것.
오늘 이 장면을 폰카 영상으로 잡았다. 사람 말 소리는 함께 일하는 동료의 목소리다. 신경쓰지 않기를 ~ ^^;;




2011. 5.19.  헬기조종사 휴이(huey)

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/29 20:37
 
  • Orders테이블에서 CustomerID 주문건수를 구한다.

select ( case

when A.[Total Orders] < 20 then '열개이하'

when A.[Total Orders] >=20 and A.[Total Orders] < 30 then '10~20개'

when A.[Total Orders] >= 30 then '30개이상'

end ) 사용자그룹,

Count(A.CustomerID) [Total Customers], Sum(A.[Total Orders]) [Total Orders]

From (

Select CustomerID, Count(OrderID) [Total Orders] From Northwind..Orders

Group by CustomerID

) as A

Group by ( case

when A.[Total Orders] < 20 then '열개이하'

when A.[Total Orders] >=20 and A.[Total Orders] < 30 then '10~20개'

when A.[Total Orders] >= 30 then '30개이상'

end )

 

  • Orders 테이블에서 CustomerID별로 ShipCountry 주문건수를 구하라.

Select CustomerID, ShipCountry, Count(OrderDate) 주문건수 From Northwind..Orders

Group by CustomerID, ShipCountry

Order by CustomerID

 

  • 위와 같은 유형으로 하나 해결해보자. Orders 테이블에서 CustomerID별로 미국(USA) 영국(UK) 주문건수를 구하라.

Select CustomerID,

  sum( case ShipCountry when 'USA' then 1 else 0 end ) [미국 주문건수],

  sum( case ShipCountry when 'UK' then 1 else 0 end ) [영국 주문건수]

From Northwind..Orders

Group by CustomerID

Order by [미국 주문건수] Desc, [영국 주문건수] Desc

 


With Cube :  구분된 컬럼별 부분합을 구한다.

select ShipCountry, ShipCity, sum(Freight) 운송료합계 from Orders

Group by ShipCountry, ShipCity

Order by ShipCountry

/* 결과는 70 */

 

select ShipCountry, ShipCity, sum(Freight) 운송료합계 from Orders

Group by ShipCountry, ShipCity With Cube

Order by ShipCountry

/* 결과는 162개인데 국가별, 도시별 부분합이 추가되어 있다. 따라서 ShipCountry열과 ShipCity열에 Null 있다. */

 


With Cube Grouping :  부분합 구할 사용한다.

Select

  ( case when grouping(shipcountry)=1 then '국가별 합계' else shipcountry end ) 배송국가,

  ( case when grouping(shipcity)=1 then '도시별 합계' else shipcity end ) 배송도시,

  sum(Freight) [운송료 ]

From Orders

Group by shipcountry, shipcity with cube

 

구문을 보면 grouping 단독으로 사용되기 보다 case when 같은 구문에서 함께 사용되는 것을 있다.

 

with Rollup

select shipcountry, shipcity, sum(freight) [운송료 합계] from orders

group by shipcountry, shipcity with rollup

결과를 보면 ShipCountry 부분합이 알아서 나오는 것을 있다. 이것이 Rollup 특징이다.

 

Grouping 이용한 Order by

Select shipcountry, shipcity, sum(freight) from orders

group by shipcountry, shipcity with rollup

order by shipcountry, grouping(shipcity)

 

Select shipcountry, sum(freight) from orders

group by shipcountry, shipcity with rollup

order by shipcountry   /* shipcountry에 null값이 맨 처음에 나온다. */

 

Select shipcountry, sum(freight) from orders

group by shipcountry, shipcity with rollup

order by grouping(shipcountry)  /* shipcountry에 Argentina가 맨 처음 나오고 null이 맨 마지막 레코드에 나온다. */

 

select shipcountry, shipcity, sum(freight) [운송료 합계] from orders

group by shipcountry, shipcity with cube

order by grouping(shipcountry), shipcountry, grouping(shipcity), shipcity

/* order by grouping(shipcountry), shipcountry : 국가별 소계 , 부분합이 국가별 목록이 끝나는 부분에서 집계되고 grouping(shipcity), shipcity 도시별 운송료 합계가 국가별 운송료 합계가 집계된 다음 (Row)부터 집계되어 나오는 것을 있다. 활용하면 쓸만한 곳이 많다. with cube grouping with rollup grouping 특성을 알고 활용해야 한다. */

 

Having Grouping

select * from ( select shipcountry, sum(freight) [운송료 합계] from orders

  group by shipcountry with rollup ) A

where A.[운송료 합계] > 5500

 

select shipcountry, sum(freight) [운송료 합계] from orders

group by shipcountry with rollup

having sum(freight) > 5500

 

같은 결과가 나오는데 Having 쓰는 편이 직관적이다. 왜냐? 지금까지 예문들을   따라했다면 Where 보다 Having 쓰는데 숙달된 직관력이 만들어졌기 때문이다. 또한 앞에서 연습했듯이 Having 앞에서 Select 결과 집합을 가지고 필터링을 한다.

 

select shipcountry, shipcity, sum(freight) [운송료 합계] from orders

group by shipcountry, shipcity with rollup

having ( grouping(shipcountry) + grouping(shipcity) = 0 ) or ( grouping(shipcountry) + grouping(shipcity) = 2)  /* 1 집계된 것이므로 1 + 1 = 2 이다. 간단한 개념을 이렇게 활용을 하고 있다. 대단하군… 나는 까지 생각이 미치지 못하였거든…. */

order by grouping(shipcountry), shipcountry, grouping(shipcity), shipcity

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/29 18:52
 

통계는 전문용어다. 따라서 전문 응용수학 개념을 알아야 통계함수를 사용할 있다. 생활속에서 아주 많이 사용되는 통계라는 것은 , 평균, 최대, 최소, 개수 뿐이다. 그래서 이것을 통계라고 수도 없고 해서 '집계'라고 표현을 했다. sql 저자 손호성님도 집계함수라 표현을 하고 있는 것을 보면 달리 다른 표현은 없는 같다.

 

사실 , 평균, 최대, 최소, 개수 5가지 함수 왠만한 일상 생활의 일을 수치로 분석할 있다. 때때로 허탈하기도 하지만 알고 보면 간단한 함수에 무궁무진한 힘이 있다는 것을 있다. 힘은 각자 느껴보기 바란다.

 

엑셀, 엑세스, 비주얼베이직, 자바스크립트 정도를 조금 다룰 있는 수준이라면 5가지 함수에 대해서는 설명하지 않아도 것이다. 따라서 이번 시간에는 정도는 짚고 넘어가야 Count, Count Distinct, Sum 대한 예문을 간단하게 정리하였다. 각자 연습해보고 결과를 비교하며 익히도록 한다.

 

Count

Count(*) :  모든 결과의 Row 개수

Count(컬럼명) :  해당 컬럼의 값으로 나온 Row 개수

따라서 * 마구잡이로 쓰지 않도록 주의한다. 또한 항상 Null 존재에 대해 어떻게 처리해야 것인지도 함께 고민해야 한다.

 

select count(shipregion), count(shipcity) from orders

ShipRegion Null 값이 있는 컬럼이다. 그러나 Count(ShipRegion)하면 Null값을 제외한 나머지 컬럼의 개수를 알려준다. 323건이 나올 것이다. Count(ShipCity) 830건이 나온다. ShipCity컬럼에는 Null값이 없다.

 

Select Count( isNull(ShipCity, '') + ShipCity ) From Orders 결과는?

Null 문자열( ' ' ) 그리고 0 엄격히 서로 다른 값으로 처리된다. 여기서는 Null 문자열로 처리하여 Count했기 때문에 830건이 나온다.

 

Count(Distinct 컬럼명)

해당 컬럼에 huey 2 있다면 huey 1개로 처리하여 개수를 구한다.

Select Count(Distinct ShipRegion), Count(ShipRegion), Count(Distinct ShipCountry), Count(ShipCountry) From Orders

 

Sum

select ShipCity, (Sum(ShipVia) + Sum(Freight)) 합A, Sum(ShipVia + Freight) 합B From Northwind..Orders

Group by ShipCity

Order by ShipCity

 

select ShipCity, (Sum(ShipVia) * Sum(Freight)) 합A, Sum(ShipVia * Freight) 합B From Northwind..Orders

Group by ShipCity

Order by ShipCity


저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/29 17:40

 

  • Northwind..Orders 테이블에서 나라별 주문일자별로 '주문건 ' 구하라.

select Shipcountry, orderdate, count(orderdate) 주문건수 from orders

group by shipcountry, orderdate

order by shipcountry

 

같은 유형의 문제로 국가별 주문건수 또는 주문일자별 주문건수를 각자 구해본다.

Group by 사용할 중요한 것은 Group by 의미가 "집계를 내고자 하는 어떤 기준 또는 "라는 점이다. 또한 Group by 집계 키로 나온 결과 집합의 값들은 오직 한번 Unique 하게 나오는 특성이 있다 것을 알아둬야 한다. Distinct Group by 엄격히 다르다.

 

내가 경영자라고 가정을 보면 집계함수를 쉽게 숙달할 있다. 어떤 기간에 어떤 유형의 소비자들이 어떤 물건을 언제 많이 구매했을까?  항공부대 지휘관이라면 어떤 기간에 어떤 비행임무가 누구에 의해서 가장 많이 수행되었을까?  또는 어느 부대가 어느 기간에 항공임무 요청을 가장 많이 했을까? 같은 궁금함을 해결하기 위해 다양한 통계를 활용한다. '어떤 기간', '어떤 사람', '어떤 물건' 등등이 Group by 해당하는 것이다. 하나 예를 들면 Group by에서 지정한 컬럼들만 Select 목록에 나타날 있다. 힌트를 알았다면 질문하지 말고 각자 연습하기 바란다. 스스로 꾸준히 연습 하는 데서 覺이 열리고 내공은 높아지는 법이다.


 

  • 예제에서 주문건수를 구하는데 주문 년도, 주문 기준으로 집계를 낸다면?

Select DatePart(yy, OrderDate) 주문년도, DatePart(m, OrderDate) [주문 월], Count(OrderDate) 주문건수 From Northwind..Orders

Group by DatePart(yy, OrderDate), DatePart(m, OrderDate)

Order by 주문년도, [주문 월]


 

  • Ireland UK 포함시킨 국가별 주문건수를 보고 싶다면?

Select ( Case ShipCountry When 'Ireland' Then 'UK' Else ShipCountry End ) 배송국가, Count(ShipCountry)

From Northwind..Orders

Group by ( Case ShipCountry When 'Ireland' Then 'UK' Else ShipCountry End )

Order by 배송국가

 

Group by All

아래 구문을 비교해본다. Group by All 사용한 구문에서는 Freight < 500 해당되는 레코드는 모두 0 으로 처리된 목록을 있다. 전체 목록은 나와야 하는데 기준 조건과 다른 경우 Null이나 0으로 처리해야 하는 경우 자주 사용되는 구문이다.

 

select ShipCountry, count(*) 운송건수 from Orders

where Freight >= 500

group by all shipcountry

order by 운송건수 desc

 

select ShipCountry, count(*) 운송건수 from Orders

where Freight >= 500

group by shipcountry

order by 운송건수 desc

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/29 16:54

헬기조종사 휴이(huey) 플밍 이야기

플로그래밍 초보때는 Null 값을 대수롭지 않게 여긴다. 그러나 시간이 지나면서 현실의 다양한 문제들을 처리하다보면 Null 이란 넘이 그리 만만치 않은 넘이라는 것을 깨닫게 된다. 때문에 Null 초보에서 중급 사이의 단계를 올라가는 관문에서 항상 客을 맞상대 하고 있다. 다음 문제를 해결하면 Null 이길 있는 약간의 내공이 만들어질 것이다.

 

Order by

  

  • Northwind 주문테이블에서 선적일과 주문일을 뽑아서 최근 주문일이 상단에 나타나도록 한다. 만약 선적일이 입력되지 않은 경우라면 현재 날짜에 10일을 더하여 목록을 뽑도록 한다.

 

Select ShippedDate, OrderDate From Northwind..Orders

Order by OrderDate desc, ShippedDate

 

최근 주문일에서 아직 선적되지 않은 것은 ShippedDate = Null 임을 있다. 선적되지 않은 것들을 현재 시간 기준으로 10일내에 완료할 것이라면 Null값에 날짜가 들어가도록 해야 한다. isNull() 함수를 쓴다.

 

다음 구문에서 Order by절에 사용된 Null 처리 부분을 '예상 선적일' 컬럼으로 만들어 결과를 뽑았다. 결과를 보면 Order by 절에서 isNull() 처리된 것을 있다.

 

Select ShippedDate, IsNull(ShippedDate, GetDate()+10) [예상 선적일], OrderDate

From Northwind..Orders

Order by OrderDate Desc, IsNull(ShippedDate, GetDate()+10) Desc

 

 

  • ShipCountry A ~ Z 순으로 정렬한 목록을 뽑아라. , 독일(Germany) 위에 나오도록 달라.

select ShipCountry From Northwind..Orders

Order by ( Case ShipCountry When 'Germany' Then Null Else ShipCountry End )  /* 필자는 문제를 해결하는데 육두문자로 ' ' 했다.  고수가 되기 위해서는 아직도 길이 멀다는 것을 느낀다. ㅠㅠ */

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/29 14:56
 

Select 컬럼필터링(ColumnFiltering) From 로우필터링(RowFiltering)

테이블은 데이터집합(Data Set)이다. From 테이블의 개념을 조금 확장하면 From '어떤 데이터 ' 된다. 데이터베이스 활용에서는 개념이 기초가 되므로 익혀둔다. 연습을 위해 Nrothwind, Pubs 예제 데이터베이스가 있어야 한다.

 

Select * From ::fn_helpCollations()

Select * From dbo.titleView

Select * From ( Select * From titles ) as A

Select * From ( Select GetDate() as 현재 ) as A

 

 

파생컬럼 : 임의의 컬럼 하나를 만드는

Select title_id, price, royalty, Round() as [로열 포함 가격], GetDate() as 현재

From Pubs..titles

 

 

플러스 효과 ( + ) : 2 컬럼의 문자열을 붙이거나 산술연산에 사용

Select type + ' : ' + title as [묶음 타이틀]

From Pubs..titles

 

Select GetDate() + 1

Select GetDate() - 1

Select Cast( GetDate() - ( GetDate() - 1 ) as int )

 

Where 절에 사용되는 조건문 유형

(Where 이하 생략 ) 컬럼이름 = '어떤 '

컬럼이름 <= 10,  컬럼이름 < 10,  컬럼이름 >= 10,  컬럼이름 > 10

컬럼이름 != '문법',  컬럼이름 <> '문법'

컬럼이름 Between 45 and 50

컬럼이름 Like '%huey%' 또는 Not Like '%huey'  /* 검색에 많이 활용되므로 Like 사용법을 알아둔다. */

 

 

다양한 Select 문제 해결의 방법

  • 출판사 별로 권의 책들을 출판했는가?

Select pub_name, (

Select Count(*) From Pubs..titles Where pub_id = A.pub_id ) [발간물 ]

From pubs..publishers A

 

  • 프랑스에 있는 출판사 목록을 뽑아내라.

Select * From Pubs..Publishers

Where country = 'France'

 

  • Northwind 주문데이터에서 모든 경유지를 뽑는데 운송지(ShipCity) 독일(Germany) Cunewalde 경우에는 경유지(Shipvia) 2 이상 거쳐가는 곳만 포함하라.

select OrderID, CustomerID, ShipVia, Shipcity, ShipCountry from Northwind..Orders

where shipvia >= ( case ShipCity when 'Cunewalde' then 2 else 0 end )

또는

select * from (

select *, ( case shipcity when 'Cunewalde' then 2 else 0 end ) as returnX

from northwind..orders ) as X

where X.shipvia >= X.returnX

 

  • Northwind..Orders 테이블에서 운송료(Freight) 상위 10% 것을 제외한 나머지 주문 데이터를 뽑아라.

/* 먼저 운송료를 내림차순으로 정렬하여 상위 10% 출력하였다. */

select top 10 percent OrderID, Freight from Northwind..Orders

Order by Freight desc

 

/* 결과적으로 구문에서 얻어진 내용을 제외한 나머지를 뽑으면 되는 것이다. not in () where 조건절에 사용하였다. */

select * from Northwind..Orders

where OrderID not in ( select top 10 percent OrderID

from Northwind..Orders

Order by Freight desc )

Order by Freight desc

 

  • Northwind..Orders 테이블에서 운송료(Freight) 상위 10%, 하위 10% 것을 제외한 나머지 주문 데이터를 뽑아라.

select * from Northwind..Orders

where OrderID not in (

select top 10 percent OrderID         from Northwind..Orders Order by Freight desc)

  and OrderID not in (

select top 10 percent OrderID         from Northwind..Orders Order by Freight )

/* 예문의 결과에서 줄만 추가하였다. */

Order by Freight desc /* 줄은 없어도 된다. 편의상 넣어둔 것이다. */

 

/* 다른 방법은? */

select * from Northwind..Orders

where OrderID not in

(

select orderID from

(

 select OrderID, Freight from ( select top 10 percent orderID, freight from Northwind..Orders Order by Freight desc ) A

 

Union All

 

select OrderID, Freight from ( select top 10 percent orderID, freight from Northwind..Orders Order by Freight ) B

) C

)

 

Having : 결과 집합을 만들어낸 마지막에 조건을 처리한다.

  • Northwind 주문 테이블에서 선박명(ShipName) C 시작하지 않는 선박들의 평균운임(Freight) 얼마인가?

먼저 C 시작하지 않는 선박명 목록을 구해본다.

Select ShipName, Freight From Northwind..Orders

Where ShipName Not Like 'C%'

Order by ShipName

 

필자는 구문을 처음에 이렇게 작성하였다.

Select ShipName, Freight From Northwind..Orders

Where ShipName Not In (

Select ShipName From Northwind..Orders

Where ShipName Like 'C%' )

Order by ShipName

 

어떤가? 결과를 내기 위해 똑같은 생각을 했지만 초보 작성한 구문과 어느 정도 훈련된 상태에서 작성한 구문이 이렇게 다르다. 그래서 꾸준하게 훈련해야 하고 기본기의 중요성은 필요가 없다.

 

이제 목록을 출력해봤으니 Freight 평균을 내야할 단계다. 운임평균은 AVG(Freight) 하면 되는데 무엇을 기준으로 Group by 해야할까?

 

ShipName 별로 평균을 내야 하기 때문에 Group by ShipName 이다.

Select ShipName, AVG(Freight) 평균운임 From Northwind..Orders

Where ShipName Not Like 'C%'

Group by ShipName

Order by ShipName

 

같은 내용을 Having 사용하면 다음과 같다.

Select ShipName, AVG(Freight) 평균운임 From Northwind..Orders

Group by ShipName

Having ShipName Not Like 'C%'

Order by ShipName  /* Having 앞에 Order by 쓰면 에러 발생 !! */

 

Where 조건절의 내용을 Having 절에 그대로 사용하였다. Having절에 Where 조건절의 내용과 똑같은 내용을 포함할 있다. Where 절은 원하는 결과 집합을 찾는 경로를 지시하는 것이라면 Having 결과집합을 먼저 만들어 결과 집합을 다시 한번 필터링 한다.

 

자세히 말하면 Where 절을 사용한 구문을 보면 Where ShipName Not Like 'C%' 먼저 처리한 결과 집합에서 AVG(Freight) 계산하여 보여준다. 그러나 Having 구문에서는 ShipName으로 그룹핑되어 정렬(Sorting) 결과집합을 먼저 만든 AVG(Freight) 계산을 한다. 그리고 나서 Having 절을 처리한다. 따라서 Having 절은 Select 연산의 마지막 과정에서 처리되는 것이 Where 사용하는 구문과의 차이점이다. 다음 예문으로 조금 고민해보면 Having 절의 장점을 알게 것이다.

 

  • Northwind..Orders 테이블에서 ShipName C 시작하지 않는 ShipName 평균 Freight 구하는데  평균 Freight 30달러 이상이어야 한다. (충분한 시간을 가지고 각자 해결해본 다음을 참고한다.)

 

필자는 이렇게 해결하였다.

select ShipName, AVG(Freight) 평균운임 From Northwind..Orders

Where ShipName Not Like 'C%'

Group by ShipName

Having AVG(Freight) >= 30

Order by 평균운임

 

Having 쓰지 않으면 다음과 같이 해야 것이다.

Select * From (

Select ShipName, AVG(Freight) 평균운임 From Northwind..Orders

Where ShipName Not Like 'C%'

Group by ShipName ) A

Where A.평균운임 >= 30

Order by 평균운임

 

헬기조종사 휴이(huey) 당부 사항 :
예제는 손호성님이 쓰신 SQL server 2005 가이드와 MSDN의 SQL Documentation을 공부하면서 필자가 요약 정리한 내용들 입니다. 플밍을 제대로 하려는 뜻이 있고 SQL 2005 깊이 있게 공부할 생각이 있다면 반드시 저자 손호성님의 책을 구해서 긋고 형광펜 해가면서 공부하시기 바랍니다.
책 구매 링크 : http://www.yes24.com/24/goods/2708644?scode=032&OzSrank=1 

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/28 13:21
 

Null 값을 조건에 넣어 사용할 경우 반드시

select ~ from 테이블

where 어떤열 is Null 또는   /* Null 포함하는 범위까지 확장 */

where 어떤열 is Not Null    /* Null 값은 빼고 남은 자료들 출력 */

같이 사용한다.

 

IsNull 함수 사용

http://msdn.microsoft.com/ko-kr/library/ms184325(v=SQL.90).aspx

 

Coalesce()

코울레스 라고 발음한다. 여러 개의 덩어리를 크게 뭉친다, 합병한다는 뜻인데 활용개념과 매칭되지는 않는다. 하지만 예제연습을 보면 활용가치를 느낄 있을 것이다.

 

연락처를 찾는데 , 사무실, 휴대폰 하나라도 입력되어 있다면 첫번째 값을 보고자 한다. 경우 유용하게 사용할 있다.

 

create table #연락처 (

 이름 nvarchar(50),

 집전화 varchar(13),

 사무실 varchar(13),

 휴대폰 varchar(13)

)

insert #연락처 values ('길동이', '111-1111', null, null)

insert #연락처 values ('일지매', null, '222-2222', null) …. 대여섯개의 자료를 null 값을 포함하여 입력하고 다음을 연습한다.

 

select 이름, coalesce(집전화, 사무실, 휴대폰) as 연락처

from #연락처

 

Coalesce() 응용

아래 예문을 실행하여 익히도록 한다.

create table #test ( nid varchar(10) )

/* a ~ d 까지 값을 넣는다. */

insert #test values ('a') … d까지 반복

 

declare @outList varchar(10)

 

select @outList = coalesce(@outList + ', ', '') + cast(nid as varchar(5))

from #test

select @outList as [콤마 구분 값]  /* a, b, c, d 형태로 출력된다. */

 

set @outList = Null

select @outList = coalesce(@outList, '') + nid

from #test

select @outList   /* abcd 형태로 출력된다. */

 

Coalesce Nullif 활용

create table #test (

  userid varchar(10),

  pay1  money  default  0.0,

  pay2  money  default  0.0,

  pay3  money  default  0.0

)

insert #test values('user1', 0.0, 100, 0.0)

insert #test values('user2', 0.0, 0, 130)

insert #test values('user3', 50, 0, 0)

insert #test values('user4', 0, 0.0, 0.0)

 

select * from #test   /* 현재와 같이 모든 셀에 0을 포함하여 값이 있는 경우 coalesce를 사용할 수 없다. */

 

select userid, coalesce(

nullif (pay1, 0),

nullif (pay2, 0),

nullif (pay3, 0)

) as 급여

from #test   /* 0 null 처리하여 결과를 보여주고 있다. */

select * from #test /* 구문을 실행하여 결과와 함께 비교해보면 쉽게 이해할 있다. */

 

In 쿼리에서 Null 사용

create table #test(

aa nvarchar(10) null)

insert #test values ('a')

insert #test values ('b')

insert #test values ('c')

insert #test values (null)

select * from #test

 

select * from #test

where aa in (null, 'b', 'c')  /* in() : null값은 출력되지 않고 b 또는 C 인 결과만을 출력한다. */

 

select * from #test

where aa not in (null, 'b', 'c')   /* 아무런 결과값도 나타나지 않는다. not(aa=null or aa='b' or aa='c') 개념이기 때문이다. 서브쿼리나 join연산에서도 같은 결과를 보여준다. */

 

select * from #test where aa is not null

 

/* 다음 쿼리를 실행하여 각각 나오는 결과값을 비교해본다. Null 처리는 반드시 is Null이나 is Not Null 같이 해줘야 한다. 그래야 빈틈없는 결과를 가질 있다. */

select * from #test where aa is null

select * from #test where aa is null or aa = 'b'

select * from #test where aa is null and aa = 'b'

 

플밍초기에는 Null 처리에 대해 심각하게 생각해본 적이 없었는데 시간이 흐를수록 이넘을 처리하는 것이 중요하다는 것을 깨닫고 있다. 특히 DB플밍에서는 여러 테이블을 join하여 사용하기 때문에 부지불식간에 Null 생겨난다. 지혜롭게 Null 다룰 있다면 내공은 크게 향상될 것이다. 또한 경험이 쌓이다보면 Null값을 최소화 하는 꼼꼼한 테이블 설계를 있을 것이다. 역시 탄탄한 기본기 위에서 내공이 쌓인다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/28 04:00

특정 열의 값에 해당되는 부분만 삭제하는 경우

Northwind Customers, Orders 테이블의 내용을 임시테이블에 복사하여 다음과 같이 연습한다.

select * into #Customers from Customers

select * into #Orders from Orders

 

순서대로 실행해본다.

select A.CustomerID, B.ShipRegion from #Customers A inner join #Orders B ON A.CustomerID = B.CustomerID

 

delete A

from #Customers A inner join #Orders B ON A.CustomerID = B.CustomerID

where B.ShipRegion is Null

 

select A.CustomerID, B.ShipRegion from #Customers A inner join #Orders B ON A.CustomerID = B.CustomerID

 

같은 내용을 다음과 같은 구문을 써서 처리해도 된다.

select * into #Customers from Customers

select * into #Orders from Orders

 

/* 각각 select 구문을 사용하여 출력되는 결과값을 먼저 비교해본다. */

select CustomerID, ShipRegion

from #Orders

where CustomerID in (

select CustomerID from #Customers

where #Orders.CustomerID = CustomerID and #Orders.ShipRegion is Null

)

 

select A.CustomerID, B.ShipRegion

from #Customers A inner join #Orders B ON A.CustomerID = B.CustomerID

where B.ShipRegion is Null

 

/* 조건에 해당하는 범위의 내용은 삭제된다. */

delete #Customers

where CustomerID in (

select CustomerID from #Orders

where #Customers.CustomerID = CustomerID and ShipRegion is Null

)

 

 

select ShipRegion from #Orders where ShipRegion is Null

 

/* B.ShipRegion이 null인 A.CustomerID는 모두 삭제된 것을 알 수 있다. */

select A.CustomerID, B.ShipRegion

from #Customers A inner join #Orders B ON A.CustomerID = B.CustomerID

where B.ShipRegion is Null

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/28 03:57

Update 테이블 From 테이블

먼저 임시 테이블을 2 만들고 연습에 필요한 값을 넣는다.

 

create table #사원 (사원번호 int, 판매개수 int)

create table #판매 (사원번호 int, 판매년도 int, 년간판매량 int)

 

insert #사원 values(1,0)

insert #사원 values(2,0)

insert #사원 values(3,0)

 

insert #판매 values(1, 2001, 30)

insert #판매 values(1, 2002, 45)

insert #판매 values(1, 2003, 47)

 

insert #판매 values(2, 2001, 45)

insert #판매 values(2, 2002, 67)

insert #판매 values(2, 2003, 98)

 

insert #판매 values(3, 2001, 78)

insert #판매 values(3, 2002, 77)

insert #판매 values(3, 2003, 89)

 

select * from #사원

select * from #판매

 

update #사원 Set

판매개수 = B.년간판매량

from #사원 A, #판매 B

where A.사원번호 = B.사원번호 and B.판매년도 = 2001

 

select * from #사원

 

update 구문은 다음과 같이 써도 동일한 결과를 보여준다. 값과 비교하기 위하여 다음 예문은 2002년도의 판매개수를 #사원 테이블에 update하였다.

update #사원 Set 판매개수 = (

  select 년간판매량

  from #판매

  where #사원.사원번호 = #판매.사원번호 and 판매년도 = 2002

)

 

select * from #사원  /* update 제대로 것을 확인할 있다. */

 


Update 레코드는 다시 Update되지 않는다.

 

/* 예제 테이블을 그대로 활용한다. */

insert #판매 values( 3, 2002, 150)  /* 3 사원의 2002년도 년간판매량 150개를 추가한다. */

select * from #사원 /* 3 사원의 2002년도 판매개수는 2 존재한다. */

 

update #사원 set 판매개수 = B.년간판매량

from #사원 A, #판매 B where A.사원번호=B.사원번호 and B.판매년도=2002

 

select * from #사원  /* 어떤 결과가 나오는지 살펴보고 다음 구문을 실행해본다. */

 

/* 3 사원의 2002년도 판매개수는 2 존재하기 때문에 2건의 합으로 update 것인지 최대값 또는 평균으로 update 것인지를 정해줘야 한다.  */

update #사원 set

판매개수 = B.년간판매량

from #사원 A, (

select 사원번호, 판매년도, max(년간판매량) as 년간판매량

  from #판매   /* 년간판매량의 합계로 update하고 싶다면 sum(년간판매량) 이라 적어주면 것이다. */

group by 사원번호, 판매년도 ) B

where A.사원번호 = B.사원번호 and B.판매년도=2002

 

select * from #사원   /* 결과를 확인해본다. */

 

Update 테이블 From 테이블

create table #tmp (value datetime)

insert #tmp values(null)

select * from #tmp

 

update #tmp set

value = 날짜.현재일시

from (select getdate() as 현재일시) as 날짜

 

select * from #tmp

 


Update ~ Top ~

Northwind..Customers 테이블에서 customerID CompanyName 임시테이블 #test 넣고 다음과 같이 실습해본다.

 

update #test set

customerID = 'XX'

from ( select top 2 customerID from #test order by customerID ) as AA

where #test.customerID = AA.customerID

 


Update 결과 값을 알고 싶다면 다음과 같이 구문을 작성하여 실행한다.

앞의 #사원, #판매 테이블을 그대로 활용한다. #판매 테이블에서 3 사원의 2003년도 년간판매량이 1건이면 insert #판매 values(3, 2003, 100) 1 값을 넣어주고 다음을 순서대로 실행하여 변화되는 값을 살펴본다.

 

select * from #사원

 

declare @판매량 int

set @판매량 = 0

 

/* 다음 예문은 3번 사원의 2003년도 년간판매량 합계를 #사원.판매개수에 update한 후 update된 값을 @판매량으로 알아보는 구문이다. */

update #사원 set

@판매량 = 판매개수 = (select sum(년간판매량) from #판매 where #사원.사원번호=#판매.사원번호 and #판매.판매년도=2003)

where 사원번호=3

 

select @판매량

select * from #사원

 

A값과 B값을 서로 바꿔 넣을 있나?

A, B 컬럼을 갖는 임시테이블 하나를 만들고 임의의 값을 넣어준다.

create table #test ( A int, B int)

insert #test values(23, 90)

insert #test values(35, 100)

insert #test values(50, 50)

 

select * from #test

 

declare @tmp int

set @tmp = 0

update #test set

@tmp = 값A,

값A = 값B,

값B = @tmp

select * from #test

 

A 내용이 @tmp로 update 된다. 이어서 A에는 B 값이 담겨지고 마지막으로 B에는 @tmp에 담겨있던 A값으로 update된다. 결과적으로 A와 B의 내용 서로 바꿔진 것을 있다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/28 03:51

Insert ~ Select ~ (1)

create table #testA ( c1 int, c2 varchar(10))

create table #testB ( c1 int, c2 varchar(10))

 

insert #testA(c1, c2) values(1, 'txt1')

insert #testA(c1, c2) values(2, 'txt2')

insert #testA(c1, c2) values(3, 'txt3')

 

insert #testB select c1, c2 from #testA

 


Insert ~ Select ~ (2) : 데이터 형변환 하여 insert

create table #testA ( c1 int, c2 varchar(10))

create table #testB (c1 int, c2 int)

 

insert #testA(c1, c2) values(1, '100')

insert #testA(c1, c2) values(2, '200')

insert #testA(c1, c2) values(3, '300')

 

insert #testB(c1, c2) select c1, convert(int, c2) from #testA

 


Insert ~ Exec ~ : 저장프로시저(Stored Procedure) 실행하여 입력

임시 테이블 #test 만든다. 컬럼은 sp_who 실행했을 나오는 컬럼과 동일하게 만들어 준다.

create table #test (

 spid int,

 ecid int,

 status varchar(30),

 loginame varchar(30),

 hostname varchar(30),

 blk int,

 dbname varchar(30),

 cmd varchar(30),

 request_id int

)

 

insert #test exec sp_who

 


Bulk Insert : 대량 작업용

Bulk Insert 테이블명 From 'd:\가져올파일명.txt'

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/27 23:13

▲ 먼저 연습용 테이블 하나를 만든다.
 create table test..test (
  학과   nvarchar(50),
  과목   nvarchar(50),
  점수   int
 )
 
▲ 평균 AVG()
select avg(점수) from test..test

▲ 합계 SUM()
select sum(점수) from test..test

▲ 과목별 점수 합계와 평균

select 과목, sum(점수) [과목별 합계], avg(점수) [과목별 평균] from test..test
group by 과목  /* groub by는 특정 열 값들을 unique한 값에 따라 그룹을 짓는다. */
order by 과목 desc

select 과목, 점수 from test..test
order by 과목
compute sum(점수), avg(점수) by 과목  /* compute by 절 앞에 반드시 order by절 사용해야 한다. */

select 학과, 과목, count(과목) 과목수, count(과목) 응시자수, sum(점수) 과목총점, avg(점수) 과목평균 from test..test
group by 학과, 과목
having 과목='IFR'  /* IFR 과목의 통계만 산출하려면 where절을 사용하는 것 처럼 Having 절을 group by 다음에 추가한다. */


▲ count() 함수
학과별 과목 수를 산출하려면 임시 테이블을 만들어 사용한다. 또한 카운트 함수는 count(*)보다 count(점수)와 같이 사용하는 것을 권장한다. count(*)는 중복된 행을 포함한 행 개수를 계산, count(컬럼이름)는 검색된 행 에서 not null인 값만 카운팅 하기 때문이다.

select 학과, 과목 into tmpT from test..test
group by 학과, 과목

select 학과, count(과목) 과목수 from tmpT
group by 학과

drop table tmpT


▲ IFR과목의 응시자 수와 총점, 평균 산출
select count(과목) [응시자 수], sum(점수) 총점, avg(점수) 평균
from test..test

where 과목='IFR'

▲ 최대, 최소
select max(점수) 최대, min(점수) 최소
from test..test

where 과목='IFR'

▲ compute 와 compute by 사용 : 실무에서 많이 활용되므로 잘 익혀두도록 한다.

select 과목, sum(점수) [과목별 총점], avg(점수) [과목별 평균] from test..test
group by 과목
select 과목, 점수 from test..test
compute sum(점수)  /* 과목별 총점이 아닌 전체 점수 합계를 보여준다. */

/* 과목별 총점을 산출하려면 compute by를 사용 */
select 과목, 점수 from test..test
order by 과목
compute sum(점수) by 과목
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/27 18:56
sql 2005에서 사용하는 함수 목록 참고 (클릭 click here)
   
형식 변환 함수 Cast(), Convert()
    declare @vInt int, @vNum Numeric(10, 5)
    set @vInt = 10.5678
    set @vNum = 10.5678
    select @vInt 정수, @vNum 실수
   
    declare @var varchar(10)
    set @var = '1000'
    select cast(@var as int) 캐스트
    select convert(int, @var) 컨버트

   
Convert()는 스타일 지정을 할 수 있는데 날짜 형식을 문자 형식으로 바꾸는 경우 유용하게 쓰인다. (스타일 변환 도표 - 아래 빨간색 숫자 참고 : http://msdn.microsoft.com/en-us/library/ms187928(v=SQL.90).aspx)
    select getdate() 현재시간
    select convert(varchar(20), getdate(), 111) [컨버트한 현재시간]
    select convert(varchar(20), getdate(), 102) [102형]
    select convert(varchar(20), getdate(), 2) [102형의 두 자리 연도 yy형]
    select convert(nvarchar(20), getdate(), 127)

   
수학 함수 ABS(), Round(), Rand()
   select abs(-1.0), abs(0.0), abs(1.0)   /* 절대값 */
    select round(34.494, 1), round(34.595, 1), round(34.494, 2), round(34.595, 2), round(345.9995, 3) /* 해당 자릿수에서 반올림, 내림 */
    select rand() 난수발생 /* 0~1사이의 임의 값 만든다. */
    select round(rand()*100, 2), round(rand()*1000, 2)  /* 난수 응용 */

   
문자열 함수
  /* 문자열 연결은 + */
    select country, city from customers
    select country + ' of ' + city [Country of City] from customers
   
    /* 아스키ASCII 코드를 문자로 변환 */
    select ascii('m'), char(109)
   
    /* 자주 쓰는 제어문자 */
    char(9) 탭, char(10) 줄바꿈, char(13) 캐리지리턴
   
    /* LEFT, RIGHT; 참고: sql에는 mid() 함수가 없음 */
    select left(country, 4) [왼쪽자르기], right(country, 4) [오른쪽] from customers
   
    /* Substring  참고: mid() 역할 */
    select substring(country, 2, 3) from customers
   
    /* CharIndex : 특정 문자열의 위치 반환 */
    select phone, charindex(')', phone), substring(phone, charindex(')', phone)+1, 10) from customers
   
    /* 영어 대소문자 변환 */
    select upper(city), lower(city) from customers
   
    /* 공백제거 Ltrim Rtrim 참고: Trim은 사용하지 않음 */
    select shipname, Ltrim(shipname), Rtrim(shipname) from orders
   
    /* 문자열 길이 */
    select Len(shipname) from orders

   
날짜 함수
날짜 함수는 프로그래밍에서 많이 사용되므로 잘 익혀두어야 한다. 엑셀, 엑세스에서 사용했던 함수와 같은 함수도 있기 때문에 MS오피스 활용을 어느 정도 할 줄 안다면 이 부분도 어렵지 않을 것이다.
  
  /* 현재 날짜, 시간 얻기 */
    select getdate()
   
    /* 기간계산 DateAdd() : 오늘부터 한 달 후는 몇일? */
    select DateAdd(day, 5, getdate())
    select DateAdd(Hour, 15, getdate())
   
    /* 기간계산 DateDiff() : A일부터 B일까지 일 수는? 또는 몇 시간? */
    select DateDiff(day, getdate(), '2011.3.1')  /* (-) 는 과거 표시 */
    select DateDiff(day, getdate(), '2011.6.7')
    select DateDiff(hour, getdate(), '2011.5.1 15:00:00')  /* 2011.4.27 18:43 기준으로 93시간 나왔음. 각자 연습해볼 것. */
   
    /* Year, Month, Day */
    select year(getdate()), month(getdate()), day(getdate())
   
    /* 요일 구하기 */
    select getdate() 현재, datePart(dw, getdate()) WeekDay  /* 2011.4.27이 4로 출력됨. 4 : 수요일 이란 뜻; 여기서 dw는 1이 일요일이다. */
    이렇게 써도 동일한 결과를 낸다.
    select getdate() 현재, DatePart(weekday, getdate()) 요일

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요

2011/04/27 16:54
기본이 튼튼해야 무엇이든 할 수 있다. 고수들이 항상 하는 말 이다. 특히 웹 개발에서 고수가 되려면 데이타베이스를 잘 알아야 하는데 그 중 가장 기본이 되는 것이 DDL, DML 사용법이다.

Northwind DB로 연습을 하면 되고 없다면 다음 링크를 따라가서 다운로드 받아 사용하면 된다. 군더더기 빼고 예문만 추려 정리하였으니 직접 실습하면서 개념을 터득하면 된다.




산술연산 검색

    Declare @addEx int
    SET @addEx = 1
   
    Select '123' + @addEx rtnValue  //결과: rtnValue컬럼에 123+1 = 124
    select 'add' + @addEx rtnValue  //결과: 에러발생


Null값 검색時 is Null / is not null / isNull() 함수를 사용해야 한다.

    /* Null 값 포함 출력 */
    select shipregion from orders
    /* 출력되는 결과는 없다. */
    select shipregion from orders where shipregion = ''
    /* Null 값 모두 출력 */
    select shipregion from orders where shipregion is null
    /* ShipRegion = null 이면 N/A로 출력 */
    select ShipCity, isNull(ShipRegion, 'N/A') ShipRegion from Orders

   
범위 값 검색 Between
    /* 결과는 동일하다. */
    select * from orders Where EmployeeID >= 3 and EmployeeID <= 5
    select * from orders where EmployeeID between 3 and 5

   
범위 값 검색 IN
    select * from orders where employeeid=5 or employeeid = 6
    select * from orders where employeeid in (5, 6)

   
검색 LIKE
    select * from orders where CustomerID LIKE 'co%'  /* CustomerID가 co로 시작하는 값만 가져온다. */
   
    /* CustomerID가 co로 시작하는 값 출력 */
    select CustomerID from orders where CustomerID LIKE 'co%'
   
    /* 회사이름이 S가 아닌 회사들을 검색하려면 NOT LIKE를 쓴다. */
    select CustomerID from orders Where CustomerID LIKE 's%'  /* CustomerID가 S로 시작하는 모든 값 */
    select CustomerID from orders where CustomerID Not Like 's%' /* CustomerID가 S로 시작하는 값을 뺀 나머지 모두 출력 */

   
LIKE 와 함께 쓰는 와일드 카드
    %  :  Like 's%'  Like '%s' 와 같이 사용한다.  /* %는 게시판 검색 구문에서 많이 사용되므로 잘 익혀두어야 한다. */
    _   :  Like '_aewoo' 하면 aewoo로 끝나는 단어이고 전체 길이가 6자리인 문자열을 뜻한다.
    [ ] :  Like '[A-D]ome' 하면 A에서 D사이의 한 문자로 시작하고 ome로 끝나는 모든 단어를 찾는다. 현재 경우 Come, Dome 등의 단어가 출력될 것이다.
    [^] : Like 'C[^o]%' 하면 C로 시작되는 단어인데 두 번째 문자가 o가 아닌 모든 단어를 찾으라는 뜻이다
.
   
Distinct는 중복되는 행을 제거하고 자동정렬되어 출력
    select CustomerID from Orders  /* 모든 CustomerID 출력 */
    select Distinct CustomerID from orders  /* CustomerID에서 중복되는 값을 하나 씩만 출력 -> 중복 값 제거 효과 */

   
임시 테이블 만들기 Select INTO (create 권한 있는 사용자)
   select * into tmpT from orders  /* 임시 테이블 tmpT로 값을 가져온다. 그러나 출력되지는 않는다. */
    select customerid from tmpT  /* 임시테이블 tmpT에서 값을 가져와서 출력한다. */
    drop table tmpT  /* 임시 테이블을 다 쓰고 나면 메모리에서 삭제시킨다. */

   
無데이터에 테이블 스키마만 복사하여 사용하고 싶을 때 Select Into 사용법
    select * into tmpT from orders where 1=2  /* 1=2에 해당되는 값은 당연히 없다. 그러나 select * into tmpT 이기 때문에 스키마는 임시 테이블 tmpT에 그대로 복사된다. */
    select * from tmpT  /* 당연히 값은 존재하지 않는다. 그러나 컬럼은 볼 수 있다. */
    drop table tmpT  /* 확인했으면 임시 테이블 삭제 */



 

헬기조종사 휴이(huey) 당부 사항 :
예제는 손호성님이 쓰신 SQL server 2005 가이드와 MSDN의 SQL Documentation을 공부하면서 필자가 요약 정리한 내용들 입니다. 플밍을 제대로 하려는 뜻이 있고 SQL 2005 깊이 있게 공부할 생각이 있다면 반드시 저자 손호성님의 책을 구해서 긋고 형광펜 해가면서 공부하시기 바랍니다.
책 구매 링크 : http://www.yes24.com/24/goods/2708644?scode=032&OzSrank=1 

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 휴이(huey)

댓글을 달아 주세요