요즘 2008에서 코딩하고 있는데 이녀석은 디폴트 인코드 값이 UNICODE인지라 1바이트 짜리 char 데이터가 필요 하면 wide charactor에서 multibyte로 변경해주어야만 한다. 매번 쓸때마다 함수들의 파라메터를 찾기 위해 msdn을 찾아 보게 만드는 귀찮은 함수다. 그래서 나름 간단하게 만든다고 만들어 보았다(요걸 라이브러리로 만들면 안되냐고 따지지 마세요..안하는게 아니라 못할만한 이유가 있어서 못하는 것이니..ㅠㅠ)

#include <string>
std::string wstringTostring(const std::wstring& strSrc)
{
    char* szRet = NULL;
    int len = ::WideCharToMultiByte(CP_ACP, 0, strSrc.c_str(), -1, szRet, 0, NULL, NULL);
    if(0 < len)
    {
        szRet = new char[len];
        ::ZeroMemory(szRet, len);
        ::WideCharToMultiByte(CP_ACP, 0, strSrc.c_str(), -1, szRet, len, NULL, NULL);
        std::string strRet(szRet);
        delete [] szRet;
        return strRet;
    }
    return std::string(""); 
}

참고적으로 mutibyte 의 길이 값으로 0을 주면 필요한 만큼의 길이가 계산되어 리턴된다.
저작자 표시 비영리 동일 조건 변경 허락
Posted by kukuta
TAG C/C++, unicode

트랙백 주소 : http://kukuta.tistory.com/trackback/129 관련글 쓰기

댓글을 달아 주세요

서브쿼리란?
하나의 테이블에서 검색한 결과를 다른 테이블에 전달하여 새로운 결과를 검색하는 것입니다. 예를 들어 A라는 테이블에서 검색해 나온 결과만을 대상으로 다시 한번 더 쿼리를 날린다는 것입니다. 참고로 하나 이상의 테이블을 연결하여 검색하는 기능은 조인(Join) 쿼리라고 합니다.

기본 문법

SELECT coulmn_name FROM table_name WHERE column_name = (
    SELECT column_name FROM table_name WHERE column_name = some_value
);

생각 보다 간단하지 않나요? 기본적인 것은 일반 쿼리와 동일 합니다. 다만, where 에 조건으로 오는 것이 일반 컬럼이 아니라 또 다른 쿼리라는 것이 차이점 입니다. 실행 순서는 괄호 안에 있는 쿼리를 먼저 실행 하고 해당 쿼리에서 나오는 결과를 이용해 괄호 바깥쪽의 쿼리를 실행 합니다. 물론, 서브 쿼리 안에 또 다른 서브 쿼리를 얼마든지 중첩해서 쓸 수 있습니다. 다만 쿼리가 좀 복잡 해지겠지요

예를 들어 볼까요?
professor라는 테이블이 있다고 생각 해 봅시다. 이 테이블에는 교수의 지위(정교수, 부교수, 시간강사, 전임강사 등등..)와 각 교수들의 이름이 들어 있습니다. 이 테이블을 대상으로 'kukuta'라는 사람의 지위와 같은 위치에 있는 사람들을 검색하고 싶다..라고 상황을 만들어 봅시다. 만일 서브 쿼리가 없다면 아래와 같이 쿼리를 두 번 작성 하겠지요 :

SQL> SELECT position  FROM professor  WHERE name = 'kukuta';

POSITION
--------------------
전임강사

SQL> SELECT name  FROM professor  WHERE position = '전임강사';

NAME
----------
kukuta
염일웅
전은지
백미선

사람이 직접 한다면야 눈으로 보고 첫 번째 쿼리의 결과를 기억했다가 두 번째 쿼리를 만들면 됩니다만...프로그램(C/C++ API 같은..)을 이용 한다면 첫번째 결과를 어딘가에 저장했다가 두 번째 쿼리를 만들 때 넣어 줘야만 합니다. 마냥 불편 하지요.
하지만 서브 쿼리가 있다면 다음 처럼 한번의 쿼리로 모든 것을 해결 할 수 있습니다 :

 SQL> SELECT name  FROM professor  WHERE position = (
                 SELECT position  FROM professor WHERE name = 'kukuta'
          );

NAME
----------
kukuta
염일웅
전은지
백미선

보다 더 간단해 지지요? 프로그램을 짤 때는 이것만큼 고마운게 없답니다.

저작자 표시 비영리 동일 조건 변경 허락
Posted by kukuta
TAG Database, SQL

트랙백 주소 : http://kukuta.tistory.com/trackback/128 관련글 쓰기

댓글을 달아 주세요

  1. 추종자 2009/02/26 10:32  댓글주소  수정/삭제  댓글쓰기

    SELECT a.name
    FROM professor a, professor b
    WHERE a.position = b.position
    and b.name = 'kukuta'
    ..................................
    간혹 서브쿼리 가 안먹는 DB가 있었던듯...

  2. BlogIcon Rhea君 2009/03/12 00:30  댓글주소  수정/삭제  댓글쓰기

    Delete * FROM USER WHERE id = 'kukuta'

    이것만 있으면 됩니다... .

조인(Join)의 개념
여러개의 테이블을 결합하여 데이터를 검색 하는 것입니다. 예를 들어 A와 B라는 테이블을 따로 select하는 것이 아니라 동시에 select를 한다고 생각하시면 됩니다. 그 결과 중 특정 컬럼들의 값을 비교해서 같은 것들(혹은 다른 것들)만 select한다던지 하는 것을 조인이라고 합니다. where 절로 구분 하는 방법에 따라 여러가지 이름으로 불리고 있지만 간단한 개념이 이렇다는 것입니다.

조인(Join)의 종류
EQUI JOIN, NON-EQUI JOIN, OUTER JOIN, SELF JOIN 등 여러가지 조인이 있지만, 여기서는 Equi Join에 대해서만 다루도록 하겠습니다(제가 DB쪽 일을 하는게 아니라서 그런지 다른 Join은 잘 안쓰더군요..-0-)

EQUI JOIN
조인 대상 테이블에서 공통 칼럼을 '=' 비교를 통해, 같은 값을 가지는 행을 연결하여 결과를 생성하는 조인 방법 입니다. 

예를 들기 이전에 설명의 편의를 위해 EQUI JOIN에서 테이블 간의 연결 고리가 되는 공통 칼럼을 Join Attribute라고 정의 하겠습니다. 이 Join Attribute는 참조 무결성을 가져야 하며 한쪽 컬럼의 값이 NULL일경우 조인 결과에서 제외 됩니다.

SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1 = table2.column2;

주목 할것은 : 

  • column 이름 앞에 테이블 이름으로 컬럼의 스코프를 지정 줘 스코프를 구분 했다는 것.
  • FROM 절에서 테이블이 하나가 아니라 두 개(사실 N개도 가능)를 썼다는 것.
  • WHERE에서 서로 다른 두 테이블의 컬럼을 비교 하고 있다는 것.

정도 입니다.

참고로 말씀드리면, 꼭 다른 테이블에 있는 컬럼끼리 조인 쿼리의 대상이 될 필요는 없다는 것입니다. 동일한 테이블의 컬럼들 내에서도 조인은 가능 합니다. 보통 이런 것을 Self join이라고도 하더군요.

저작자 표시 비영리 동일 조건 변경 허락
Posted by kukuta
TAG Database, SQL

트랙백 주소 : http://kukuta.tistory.com/trackback/127 관련글 쓰기

댓글을 달아 주세요