posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

MYSQL:
1、多表查询
     超过一个表的综合查询;
     注意:找到表与表之间的纽带(桥梁)
     分类:
        1:内连接:
      等值连接:查询的结果带有重复记录的
      自然连接:查询结果中没有重复的记录
      (distinct|group by)删掉重复记录的查询
2:外连接:
      左连接:
      右连接
      全连接
3:交叉连接:
student_info    学生信息表
s_id s_name     age   area
     Tom      20     北京
     Jack     21     上海
     Lily     19     南京
     Damat    22     北京
     DaiJun   22     上海

1,2,3
marks 成绩表:
s_id c_id mark
    1    60
    2    70
    1    80
    3    60
    2    70
    3    59
class 科目表
c_id c_name
    语文
    数学
    英语
1)等值连接:
    select 字段列表 from 表列表 where 表1.字段1=表2.字段1 and 表2.字段2=表3.字段2 and。。。。。。
    eg:检索出所有的学生信息及其各科目所考试的成绩
        编号,姓名,年龄 地区 科目和成绩;

select s_id,s_name,age,area,c_name,marks
from student_info,marks,class
where student_info.s_id=marks.s_id
       and marks.c_id=class.c_id;
    注意:如果查询涉及到的字段中,在多个表中存在,那么要使用"表名.字段名"的方式来表明是那个表中的;
2)如果重复的字段较多,那么我们给使用的表起个别名:
   表名 as 别名|表名 别名

   select s.s_id,s_name,age,area,c_name,marks
   from student_info as s,marks as m,class as c
   where s.s_id=m.s_id
       and m.c_id=c.c_id;
   eg:查询出各科目的平均成绩?group by
select c_name,avg(marks) as "jjj"
from class,marks
where class.c_id=marks.c_id;
group by c_name;
   eg:统计学生所在地的学生人数?
   eg:统计学生大于70的所在地的学生人数
3)sql语句中中:
内连接:
select 字段列表 from 表1 innerjoin 表2
on 表1.字段1=表2.字段1
eg:
    检索出所有学生的姓名和成绩;
    select s_name,marks from student_info s inner join marks m on s.s_id=m.s_id
外连接:
左连接:
      格式:
       select 字段列表 from 表1 left outerjoin 表2
       on 表1.字段1=表2.字段1     
   注意:以左边的表为参照物,用右边的表进行匹配,如果右边的表中有匹配记录,那么就显示记录,如果没有匹配的记录,那么就填充null;

   eg:
      打印出学生的全部成绩?
     

右连接:
    格式:
       select 字段列表 from 表1 right outerjoin 表2
       on 表1.字段1=表2.字段1     
   注意:以右边的表为参照物,用左边的表进行匹配,如果左边的表中有匹配记录,那么就显示记录,如果没有匹配的记录,那么就填充null;
  
全连接:在mysql中部支持全连接
   格式:
       select 字段列表 from 表1 left outerjoin 表2
       on 表1.字段1=表2.字段1

       union all

       select 字段列表 from 表1 right outerjoin 表2
       on 表1.字段1=表2.字段1
     
        union all:将查询得到得两个记录集合并起来,但是不去除重复的记录;默认使用的情况下没有all---就相当于加了distinct去掉的重复的记录;现在所实现的效果才是全连接的效果;
4)交叉连接:
   cross
   格式:
     select 字段列表 from 表1 cross 表2
    
   供应商    超市
   1   1
   2            2
   3            3
5)自连接:
inner join

person

p_id   p_name   s_id
1 tom       2
     lily      3
     damat     4
     mack

职工   领导   经理
tom    领导   lily
lily   领导   damat
damat 领导   mack
per 职工表
p_id   p_name   s_id
1 tom       2
     lily      3
     damat     4
     mack

cap 经理表
p_id   p_name
1 tom  
     lily  
     damat
     mack

select per.p_name,"领导",cap.p_name
from person per,person cap
where per.s_id=cap.p_id;

6)sql语句中的常量:
   select "字符" from 表
7)成绩大于60的学生姓名:
select s_name from student_info,marks
where student_info.s_id=marks.s_id marks>60;



本文主要列举两张和三张表来讲述多表连接查询。 新建两张表: 表1:student 截图如下: 表2:course 截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。) 一、外连接 外连接可分为
本文主要列举两张和三张表来讲述多表连接查询。
新建两张表:
表1:student  截图如下:
SQL多表连接查询(详细实例)_新客网
表2:course  截图如下:
SQL多表连接查询(详细实例)_新客网
(此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表,实际开发中这两个表会有自己不同的主键。)
一、外连接
外连接可分为:左连接、右连接、完全外连接。
1、左连接  left join 或 left outer join
SQL语句:select * from student left join course on student.ID=course.ID
执行结果:
SQL多表连接查询(详细实例)_新客网
左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).
注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
2、右连接  right join 或 right outer join
SQL语句:select * from student right join course on student.ID=course.ID
执行结果:
SQL多表连接查询(详细实例)_新客网
右外连接包含right join右表所有行,如果左表中某行在右表没有匹配,则结果中对应左表的部分全部为空(NULL)。
注:同样此时我们不能说结果的行数等于右表的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。
3、完全外连接  full join 或 full outer join
SQL语句:select * from student full join course on student.ID=course.ID
执行结果:
SQL多表连接查询(详细实例)_新客网
完全外连接包含full join左右两表中所有的行,如果右表中某行在左表中没有匹配,则结果中对应行右表的部分全部为空(NULL),如果左表中某行在右表中没有匹配,则结果中对应行左表的部分全部为空(NULL)。
二、内连接  join 或 inner join
SQL语句:select * from student inner join course on student.ID=course.ID
执行结果:
SQL多表连接查询(详细实例)_新客网
inner join 是比较运算符,只返回符合条件的行。
此时相当于:select * from student,course where student.ID=course.ID
三、交叉连接 cross join
1.概念:没有 WHERE 子句的交叉联接将产生连接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。
SQL语句:select * from student cross join course
执行结果:
SQL多表连接查询(详细实例)_新客网
如果我们在此时给这条SQL加上WHERE子句的时候比如SQL:select * from student cross join course where student.ID=course.ID
此时将返回符合条件的结果集,结果和inner join所示执行结果一样。
四、两表关系为一对多,多对一或多对多时的连接语句
当然上面两表为一对一关系,那么如果表A和表B为一对多、多对一或多对多的时候,我们又该如何写连接SQL语句呢?
其实两表一对多的SQL语句和一对一的SQL语句的写法都差不多,只是查询的结果不一样,当然两表也要略有改动。
比如表1的列可以改为:
Sno Name Cno
表2的列可以改为:
Cno CName
这样两表就可以写一对多和多对一的SQL语句了,写法和上面的一对一SQL语句一样。
下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。
新建三表:
表A:  student 截图如下:
SQL多表连接查询(详细实例)_新客网
表B:  course 截图如下:
SQL多表连接查询(详细实例)_新客网
表C:  student_course 截图如下:
SQL多表连接查询(详细实例)_新客网
一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。
当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。
SQL语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno
执行结果:
SQL多表连接查询(详细实例)_新客网
此条SQL执行的结果是学生选课的情况。

 

posted @ 2013-03-25 09:12 盛胜 阅读(407) | 评论 (0)编辑 收藏

int iScreenX = GetSystemMetrics(SM_CXSCREEN);
int iScreenY = GetSystemMetrics(SM_CYSCREEN);
CPaintDC *pdc=&dc;
CRect r;
GetClientRect(&r);
CBitmap *pBitmap= new CBitmap;
pBitmap->LoadBitmap(IDB_CAS_MENU);
BITMAP bm;
    // 重绘功能按钮背景
pBitmap->GetBitmap(&bm);
CDC* pDisplayMemDC = new CDC;
pDisplayMemDC->CreateCompatibleDC(pdc);
pDisplayMemDC->SelectObject(pBitmap);
pdc->StretchBlt(0,0,r.right,100,pDisplayMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
pBitmap->DeleteObject();

    //释放资源
ReleaseDC(pDisplayMemDC);
delete pDisplayMemDC;
delete pBitmap;

posted @ 2013-03-21 12:03 盛胜 阅读(450) | 评论 (0)编辑 收藏

// std::map<std::string ,DataInfo>::iterator iter = m_ImageInfoList.begin();
//
// while (iter!=m_ImageInfoList.end())
// {
// CString pathArchiveTemp,pathImageTemp,ImagePath;
// pathImageTemp = iter->second.strPath.c_str();
// pathArchiveTemp = m_DosImage.m_archive.strPath.c_str();
// ImagePath = pathArchiveTemp + pathImageTemp;
// m_DosImage.m_ImagevPath.push_back(ImagePath);
// ++iter;
// }

CString slect_name = m_treeSource.GetItemText(selected_item);
std::string strNodeName = slect_name.GetBuffer();
slect_name.ReleaseBuffer();
               ,std::map<std::string DataInfo>::iterator ite=m_ImageInfoList.find(strNodeName); 
if (ite != m_ImageInfoList.end())
{
CString pathArchiveTemp,pathImageTemp,ImagePath;
pathArchiveTemp = archive.strPath.c_str();
pathImageTemp = ite->second.strPath.c_str();
ImagePath = pathArchiveTemp + pathImageTemp;
}

posted @ 2013-03-19 10:34 盛胜 阅读(161) | 评论 (0)编辑 收藏

string a="d:\\abc\\dd.avi";
string::size_type pos = 0;    

while ((pos = a.find_first_of("\\",pos)) != string :: npos)
{
a.replace(pos,1,"//");
pos++;
}

posted @ 2013-03-15 11:48 盛胜 阅读(1879) | 评论 (3)编辑 收藏

原因:由 directdraw 的升级引起,POINTER_64是一个宏,在64位编译下起作用,它包含在SDK目录下的BASETSD.H中(Microsoft Visual Studio 8\VC\PlatformSDK\Include\basetsd.h(23):#define POINTER_64 __ptr64),但DXSDK自己也带了一个basetsd.h,里面没有定义POINTER_64,从而导致出错。
在网上查了下资料,一般的解决方法是:
在winnt.h中加上以下语句  
  #define POINTER_64 __ptr64
  typedef void *PVOID;
  typedef void * POINTER_64 PVOID64;
个人认为最好不去改winnt.h,有时需要要调整include文件夹的顺序来解决问题,通过调整IDE 工具-> 选项-> 项目vc++目录;包含文件include 的顺序来解决这类问题,使dxsdk需要的winnt.h所在文件夹在最上面。调整后,问题解决!
-----------
DirectX SDK的包含路径导致的。
在工程属性中(不是VC的属性),将包含路径设置为如下的格式,即DirectX SDK的路径放在后面:
$(VCInstallDir)include;$(VCInstallDir)atlmfc\include;$(WindowsSdkDir)include;$(FrameworkSDKDir)\include;D:\Program Files\Microsoft Direct SDK\Extras\DirectShow\Include;D:\Program Files\Microsoft Direct SDK\Extras\DirectShow\Samples\C++\DirectShow\BaseClasses;D:\Program Files\Microsoft Direct SDK\Include;
-----------------

http://blog.sina.com.cn/s/blog_620782850100u57u.html
改动SDK的头文件,不是一个好的办法,会降低代码的移植性。解决办法:
在stdafx.h的开头,加上如下代码:
#ifndef POINTER_64
#if !defined(_MAC) && (defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)) && (_MSC_VER >= 1100) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER_32
#endif
#else
#if defined(_MAC) && defined(_MAC_INT_64)
#define POINTER_64 __ptr64
typedef unsigned __int64 POINTER_64_INT;
#else
#if (_MSC_VER >= 1300) && !(defined(MIDL_PASS) || defined(RC_INVOKED))
#define POINTER_64 __ptr64
#else
#define POINTER_64
#endif
typedef unsigned long POINTER_64_INT;
#endif
#define POINTER_32
#endif
#endif

posted @ 2013-03-13 16:22 盛胜 阅读(660) | 评论 (0)编辑 收藏

BROWSEINFO bInfo;
ZeroMemory(&bInfo, sizeof(bInfo));
bInfo.hwndOwner = m_hWnd;
bInfo.lpszTitle = "请选择路径: ";
bInfo.ulFlags = BIF_RETURNONLYFSDIRS;    
LPITEMIDLIST lpDlist; //用来保存返回信息的IDList
lpDlist = SHBrowseForFolder(&bInfo) ; 
if (lpDlist == NULL)
{
return;
}
if(lpDlist != NULL)  
{
CHAR chPath[MAX_PATH]; //用来存储路径的字符串
SHGetPathFromIDList(lpDlist, chPath);
m_strSavePath    = chPath; //将TCHAR类型的字符串转换为CString类型的字符串
//strOutPath = chPath;
}

posted @ 2013-03-13 15:44 盛胜 阅读(178) | 评论 (0)编辑 收藏

http://blog.sina.com.cn/s/blog_69e905cd0100l5m8.html
http://www.phpfans.net/ask/MTcxNTUyNw.html

posted @ 2013-03-11 17:05 盛胜 阅读(1156) | 评论 (0)编辑 收藏

     摘要: 转自:http://www.cnblogs.com/fangyukuan/archive/2010/09/21/1832364.htmlhttp://www.cplusplus.com/reference/stl/list/STL: C++ standard template library C++标准模板库stl list使用说明使用标准的std::list进行容器数据处理时,操作比较底层。我们...  阅读全文

posted @ 2013-03-09 10:30 盛胜 阅读(511) | 评论 (0)编辑 收藏

标准库 vector 容器 
使用 vector 是必须包含头文件 <vector> 
# include <vector>


vector 是个类模板 可以存放不同的数据类型,包括用户自定义的类型
声明格式如下:
 class_template_name<type_name> obj_name;
ex: 
 vector<int> int_vec;   //int_vec 对象用来存发整型类的数据


vector 对象的定义和初始化
    vector 类的构造函数有如下几种:
      vector<type> v1; 
      vector<type> v2(v1);   对象v2是v1的副本
      vector<type> v3(n, i);   v3包含n 个值为i 的元素 
      vector<type> v4(n);   v4包含n个 值初始化 的副本
 
**值初始化 
   没有指定元素的初始化形式,那么标准库将自行提供一个元素初始化的值
进行 值初始化(value initializationd)具体类型取决于vector存储的类型。
 ex:   vector<int> ivec(10); //10 elements, each initialized to 0;
 
 vector 类中成员函数与基本操作
    1.判断容器是否为空,返回值为 bool类型       obj.empty();         
    2.返回容器中元素的个数                      obj.size();
    3.在容器末尾增加一个值为 type_value 的元素  obj.push_back(type_value);
    4.支持类似于数组的操作
        返回容器中位值为n的元素  obj[n]
        直接赋值替换 obj1 = obj2;  
        支持比较操作符   ==  !=  < > 
**  vector的下标操作与数组的不同之处
  vector 只能通过对确知的元素进行操作
  Ex:  vector<int>  obj;  //obj为空。
       obj[0];  //error    
       
标准库 iterator 迭代器
   除了用数组下标去访问,遍历容器中的元素,还可以通过使用迭代器(iterator)
   iterator 是C++标准库中用来控制对容器元素的访问的特定数据类型。有些容器既支持
下标访问,也可以用 iterator。 迭代器是更加通用的方法。每种容器都对应有不同的迭代器。


每种容器都对应 返回iterator数据成员的操作 begin() 和 end()
ex:  //obj is not empty
     vector<int>::iterator iter = obj.begin()  //用begin()返回迭代器指向容器的第一个元素  


end() 返回的是容器的最后一个元素的下一位。当容器为空时,和begin()的返回值相同
obj.end() 起一个哨兵(sentinel)的作用。表示已处理完容器中的所有元素。


**  vector的迭代器支持自增和解引用操作
       *iter = 0;   obj[0] = 0;  // obj[0] 和 iter 指的是同一个元素


用迭代器iterator编写 loop
for( vecotr<int>::iterator iter = int_vec.begin(); 
        iter != int_vec.end(); ++iter ){
     *iter = 0;   //将容器 int_vec 中所有元素值都置为0。              
}


const_iterator  
该类型迭代器指向的元素解引用后为 const类型的对象 不能被重写。
const_iterator 类型与 const 类的 iterator 不同。 前者自身的值可改变,但其所指的值不能改变。  
而 后者一旦初始化值就不能改变,不可有自增操作。 

posted @ 2013-03-09 10:20 盛胜 阅读(252) | 评论 (0)编辑 收藏

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换【转】

CString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换

VC++ 2010-09-25 21:23:12 阅读457 评论3   字号: 订阅

一.CString与LPCWSTR 

    两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。

    CString转换成LPCWSTR

    方法一:CString strFileName;

                     LPCWSTR lpcwStr = strFileName.AllocSysString();

    方法二:CString str=_T("TestStr"); 
                    USES_CONVERSION; 
                    LPCWSTR lpcwStr = A2CW((LPCSTR)str);

    MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR)  -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。

    LPCWSTR转换成CString

    LPCWSTR lpcwStr = L"TestWStr"; 
    CString str(lpcwStr);

 CString str;

LPWSTR  lpstr = (LPWSTR)(LPCWSTR)str;

二.CString与LPSTR转换

     CString转换成LPSTR:

    方法一:CString strFileName;

                    LPSTR lpStr = strFileName.GetBuffer();

                    strFileName.ReleaseBuffer();

     方法二:CString strFileName;

                     LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;

      LPSTR转换成CString:

                      LPSTR lpStr = L"TestStr"; 
                      CString str(lpStr);

      注意:CString和LPCSTR可直接转换,如下:

                     CString str;

                     LPCSTR lpcStr = (LPCSTR)str;

三.CString和char*转换
       CString转换成char*
       方法一:CString str;
                       char* p = str.GetBuffer();
       方法二:CString str;
                       char* p = (LPSTR)(LPCSTR)str;
       char*转换成CString
                       char* p = "test";
                       CString str = ("%s",p);

四.String和int、float的转换

        可以使用atoi,atof,atol等函数来完成。

五.LPSTR(char*)和LPWSTR的转换

        可以使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,可以避免转换。

ATL宏介绍:

     A2BSTR   OLE2A             T2A            W2A 
     A2COLE   OLE2BSTR    T2BSTR    W2BSTR 
     A2CT         OLE2CA         T2CA          W2CA 
     A2CW        OLE2CT         T2COLE    W2COLE 
     A2OLE       OLE2CW       T2CW         W2CT 
     A2T            OLE2T            T2OLE        W2OLE 
     A2W           OLE2W          T2W             W2T

    A :ANSI 字符串,也就是 MBCS。 
    W、OLE 宽字符串,也就是 UNICODE。 
    T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A 
    C const 的缩写

利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:

    1、只适合于进行短字符串的转换; 
    2、不要试图在一个次数比较多的循环体内进行转换; 
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的; 
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

void Func1(LPSTR lpStr);

void Func2(LPWSTR lpwStr);

TCHAR   name[256];

TCHAR*   pName = new  TCHAR[256];

Func1(name); // Func1(pName);

Func2(name); // Func2(pName);

注意在VS2005中上面用红色标记的代码已经不成立。

VS2005中CString已经改为宽字符型,一些转换如下:

char name[10];
 TCHAR sex[5] ;
 char *p = name;
 TCHAR *pw = sex;

 LPSTR lpstr = name;
 LPCSTR lpcstr = name;
 lpcstr = lpstr;
 
 lpstr = p;
 p = (char*)sex;
 pw = (WCHAR*)name;
 LPWSTR lpwstr = (LPWSTR)lpstr;
 lpwstr = (LPWSTR)lpcstr;
 LPCWSTR lpcwstr = (LPCWSTR)lpstr;
 lpcwstr = (LPCWSTR)name;

 CString str(lpstr);
 CString str1(lpcstr);
 CString str2(lpwstr);
 CString str3(lpcwstr);
 CString str4(name);
 CString str5(sex);

 lpwstr = (LPWSTR)(LPCWSTR)str;
 lpstr = (LPSTR)(LPCWSTR)str;
 lpcstr = (LPCSTR)(LPCWSTR)str;

 p = (char*)str.GetBuffer();
 pw = str.GetBuffer();

可以看出转换更加简单了,基本上可以直接转换,A2W等宏基本上不需要啦

(摘自)

http://blog.csdn.net/sl159/article/details/6412171

标签: C++

posted @ 2013-03-08 16:51 盛胜 阅读(4282) | 评论 (0)编辑 收藏

仅列出标题
共14页: 1 2 3 4 5 6 7 8 9 Last