1999.2.10 조경민

================================  조경민  ===============================

  SQL (Structured Query Language)

  SQL은 말 그대로 구조적인 쿼리(질의) 언어 이다.
  
  다음은 SQL의 추가적 장점이다.
  

  - 명시적인 록킹문장이 필요없다. 서버가 모든 록킹을 관리하기 때문이다.
  
  - 데이터의 실제 주소를 참조할 필요없다. 서버가 논리적인 이름을 살펴
  
    실제 주소의 연결된 집합으로 번역해 주기 때문이다.
  
  - 인덱싱이나 탐색 기법을 정의할 필요없다. 요구된 데이터를 탐색하는 가장

    효율적인 기법을 서바가 제공하기 때문이다.


  => 따라서 SQL에서는 루프문을 만들 필요없다.
    
  표준 SQL 즉 ANSI-SQL은 다음과 같은 것을 지원한다.

  자료 구조의 생성과 삭제, 오브젝트 단위의 보안을 위한 데이타 정의 언어
  (Data Definition Language: DDL)

  자료를 테이블에 삽입, 변경, 삭제하기 위한 데이타 변경 언어
  (Data Modification Language:DML)

  sQL은 쿼리-수행 언어였으나 T-SQL은 if나 while 지역변수등. 여러가지를

  추가한 언어이다.


  SQL쿼리들을 테스트 하기 위한 프로그램

  ISQL/w
  SQL 엔터 프라이즈 관리자 (SQL-EM)의 일부로 제공되는 쿼리 툴을 사용
  
   T-SQl의 문장, 일괄 작업
  
  select phone,name          
  from authors
  where state = "CA"
  go      
  
  세개의 문장이 go를 씀으로써 서버에 보내어져 일괄 처리를 하게 된다.



  SELECT문 사용 데이타 검색
  =========================

  select를 실행하면 결과 집합 테이블이 생긴다. 이때 결과 집합 테이블의 컬럼은

  select 선택된 컬럼1, 컬럼2,.. 로 하며

  결과집합의 컬럼1의 이름을 바꾸고 싶을때는

  select name,age "이름"           /* 또는 age AS "이름 */

  from student
   =>
        name     이름
       ------------------
         :        :

      
  대부분의 SQL 문장들은 테이블에 영향을 미친다.


  - 테이블에서 테이터 선택하기

  select column-list
  from table-name

  ex 다음은 author ㅌ[이블의 모든 행에서 제일 처음 이름과 마지막 이름을 검색한다.

  select au_iname , au_fname
  from author

  select *
  from athour  // 모든 행을 선택한다.

  수식에서 연산자 (+,-,*,/,%)와 비트 논리 연산자 (AND &,OR |,XOR ^,NOT ~)문자열

  연결 연산자 (+) 사용가능


  SQL의 결과 집합

  -> 대부분의 쿼리들로 부터 반환되는 결과는 데이터의 행으로 구성되고(존재여부)

    하나 이상의 열로 구성된 테이블 그 자체와 같다.

     into 키워드 = 표준 결과 집합을 새로운 테이블에 다시 나타낼수 있다.
     compute - 열/행의 구조체  에 적합하지 않는 추가적인 결과 행을 생성
  


  distinct => 정령을 서버에게 재 요청하게 되므로 느려진다.
  =========================
  결과집합으로부터 중복된 행을 제거한다.

  또는

  select distinct city, state
  from author

  하게 되면 author테이블의 city가 중복된 또는 state가 중복된 행을 지우고

  이를 결과 집합으로 나타내게된다.



  where
===========================

  select는 디폴트로 모든 행에 대한 검색을 하게 된다.

  이를 제한 하는 것이 이것이다.

  select au_lname,au_fname
  from author
  where state = "CA"        
  => 검색을하돼 state필드가 CA인것으로 제한을 한다.

  select type,title_id,price
  from titles
  where price * yrd_sales < afvance
  => tiltes 테이블안에 가격,연월일 판매, 그리고 증가된 판매를 비교하는 예제이다.

  select au_lname,au_fname
  from author
  where state ="CA" or city = "Inchon City"
  -> 다중 탐색


  in()
  ===========================
  select title_id,price
  from titles
  where type in ("cook","duck")

   서버는 type in 각 행의 값을 조사한다. 만일 그 값이 리스트에서 발견되면 그행에 대한

  조건은 참이 되다. or 과 같은 의미
  
  select title_id,price
  from titles
  where type = "cook"
        or type = "duck"

  like
  ===========================
  like 와일드 카드
  % 다음 쭉
  _ 한자
  [] 괄호안에 열거된 리스트중에 어떠한 한 문자

  select name ,city
  from author
  where city like "Spring%"
  => 도시명이 Spring으로 시작하는 것을 찾는다.


  select name ,city
  from author
  where city like "B_A1"
  => 도시명이 B?A1인것을 찾는다.


  select name ,city
  from author
  where city like "B[123]A1"
  => 도시명이 B1A1,B2A1,B3A1인것을 찾는다.


  select name ,city
  from author
  where city like "\%%" escape "\"
  => 자료안의 문자%와 와일드를 혼동하지 않기 위해 excape을 쓴다.
  
  order by
  ===========================
  
  select name ,city
  from author
  order by name
  => 이름순으로 정렬한다.


  select name ,book
  from author
  order by preice*interest dess
  => 가격과 이율을 곱한 것에대한 내림차순 정렬을 한다. ass는 올림
        

  계산하여 결과집합 만들기
  ===========================
  
  sum()  숫자 표현 수식 합계
  avg()      "          평균
  min()  숫자,문자열,시간 작은거
  max()
  count() 널 수식이 아닌 수를 반환
  count(*) 발견된 행의 수를 반환한다.
  
  select avg(price)
  from book
  -----------------
             14.33


  여러 테이블에 공통으로 검색하기
===================================
  select name ,book
  from author JOIN tiltes
  order by preice*interest dess
  => author와 titles테이블에서 검색을 한다.


  서브 쿼리
  ==================================

  select title
  from titles
  where pub_id =
       {select pub_id
        from publishers
        where pub_name = "ALL PER"}

  
  여러 결과 집합을 융합하기
  ==================================
  select cuty, atate
  from author
  union
  select city,state
  from publisher
  
  => 자동으로 중복된 행은 삭제가 된다. union all을 하면 삭제를 막을수 있다.


  추가 하기
  ==================================
  insert author
   { name, age,phone}
  value
   { "경민",21,"015-213")
  => 인서트를 한다.

  insert author
  value
   { "경민",21,"015-213")
  
  이것이 SQL 6.5 EM (Enterprise Maneger)에서 DBTool을 이용한 실제 추가 예
  insert into mans
        values ("조경민",22,"학생","asdf")

  편집 update
  ===================================  
  update publisher
  set pub_name = "새로운이름"
  where pub_id = "1234"
  
  삭제 delete
  ===================================
  
  delete titles
  where type = "business"

  테이블 생성
  ===================================

  CREATE TABLE 테이블명 ( 필드명 CHAR(4) , 필드명 LONG );
  
  테이블을 생성한다. LONG은 기본 11칸 짜리 숫자를 넣수 있다.
  
  ex) CREATE TABLE NEW ( ID CHAR(4), AGE INT );

  
  
  테이블 추가
  ===================================
  
  INSERT TABLE ... SELECT 결과집합
  
  다른 테이블과 추가할 테이블이 필드구조가 같을 경우
  
  기존 테이블의 결과집합을 테이블에 추가 할수 있다.
  
  테이블 삭제
  ==================================

  DROP TABLE

  MFC와 SQL의 만남
  ===================================
  이제는 MFC와 SQL의 만남을 위한 준비를 하자.

  먼저 OBDC를 등록해야 한다. 제어판의 32bitODBC 관리자를 실행한다.

  여기서 사용자DSN, 시스템DSN, 파일DSN이 있는데 각각 사용자 DSN은

  지정한 컴퓨터에만 영향을 미치며 현재 사용자만 사용할 수 있는것이고

  시스템DSN은 사용자보다 지역 컴퓨터의 영향을 받는것이고 권한이 있는

  사용자나 시스템은 시스템 DSN으로 설정한 데이터 원본을 사용할 수 있다.

  파일DSN은 같은 드라이버를 설치하여 데이터베이스에 액세스할 수 있는

  사용자라면 모두가 공유할 수 있는 파일 기준 데이터 원본이 있다.

  이 데이터 원본은 사용자나 컴퓨터에 국한될 필요가 없다.

  이 말은 즉, SQL은 네트워크를 기본 지원하며 ODBC(Open DataBase Connectivity)

  는 말 자체가 네트워크를 지원하는 것을 더 쉽게 해주는 역활을 하는것이다.

  이 ODBC를 사용함으로써 ODBC관리자에서 DSN의 경로를 네트워크로 해주기만

  하면 되는 것이다. 이때 네트워크는 네트워크 드라이브로 생성되게 된다.


  MFC에서는 ODBC라는 데이타 베이스 드라이버들을 지원하는

  CDataBase 클래스와 (여러 테이블을 갖는 데이타베이스 클래스)

  CRecordset 클래스를 갖는다. (하나의 테이블안의 하나의 레코드 셋을 의미)


  MFC를 알려면 먼저 API를 알아야 하듯이

  MFC의 DB 클래스 사용법을 알려면 먼저 SQL을 알아야 한다.

  검색을 쉽게......

  SQL에서는 검색을 SELECT를 쓴다.

  물론 MFC DB클래스도 SELECT쿼리를 SQL서버에게 전하는 일만 한다.

  그런데 TableName은 CRecordset::DefaultGetSQL()에 의해 문자열이 자동 반환

  되고 Coumn-list 또한 CRecordset::DoFieldExchange(CFieldExchange* pFX)에서

  하게 된다.

   그렇다면 남은 것은 SELECT시 where과 order by같은 것인데 이또한

  m_strFilter가 where의 역활을 order by는 m_sort가 미리 기억하는 것으로 하게된다.

  그렇다면 프로그래머는 단지 Open()만 하면 되는것이다.

        void CPostSet::DoFieldExchange(CFieldExchange* pFX)
        {
                //{{AFX_FIELD_MAP(CPostSet)
                pFX->SetFieldType(CFieldExchange::outputColumn);
                RFX_Text(pFX, _T("[ZIPCODE]"), m_ZIPCODE);
                RFX_Text(pFX, _T("[COUNTRY]"), m_COUNTRY);
                RFX_Text(pFX, _T("[COUNTY]"), m_COUNTY);
                RFX_Text(pFX, _T("[DONG]"), m_DONG);
                //}}AFX_FIELD_MAP
        }


   다음은 테이블에서 NAME컬럼이 "이순신"이고 AGE가 30인 레코드를 검색하는 예제이다.

   CMySet *set = &CMyDoc.m_myset; //어쨋든 다큐먼트의 Set을 받아오기만하면된다.
   set->Close();                  // 기존의 레코드셋을 닫는다.
   set->m_steFilter.Format("NAME = '이순신' AND AGE = '30'");
   set->Open();


   그리고 CRecordView에서 상속받은 CMyView도 다시 그려야 함으로

   CMyView* view = (CMyView*)((CMainFrame*)AfxMainwnd())->GetActiveView();

   view->UpdateDate(TRUE);

   를 하면 된다. 이때 나오는 컬럼은 CMySet::DoFieldExchange의 필드를 따른다.

'KB > MFC/Win32' 카테고리의 다른 글

언리쉬드 9장 윈도우 다이얼로그 박스 컨트롤  (0) 2004.03.19
Unleashed Visual C++ 5.0 ????  (0) 2004.03.19
[db] ODBC 파일 등록하기  (0) 2004.03.19
dll 설명  (0) 2004.03.19
[api] 폰트크기,프린트  (0) 2004.03.19

+ Recent posts