??xml version="1.0" encoding="utf-8" standalone="yes"?> #include <conio.h>//getch() //#include "sqltypes.h"
// //创徏ODBC句柄,分配odbc环境 //执行SQL查询语句 //释放句柄 联系Q约束ƈ发控Ӟ(x)多用戯问共享数据的冲突问题 客户端网l实用工?Client Network Utility)Q用来配|客L(fng)的网l连接,理和测定客L(fng)的数据库?/p>
事g探察器:(x)监视事g处理日志QƈҎ(gu)志进行分析和重播?/p>
服务端网l实用工?Server Network Utility):配置服务器端|络q接和设|相兛_数?/p>
导入和导出数?Imput and Export Data):采用DTC(data transformation services)向导来完成,实现其他数据和SQL 2000数据的{换?/p>
企业?win2000 advanced server 首要数据文g .mdf windowsw䆾验证模式 ?混合模式h更高的安全性,windowsw䆾验证模式下必L本地用户和域用户才能使用SQL Server 2000 升SQL SERVER:备䆾(包括pȝ库在内的)所有数据库Q备份注册表 日志文gQ?br />sqlstp.log 在\windows或\winnt?br />setup.log 在\windows或\winnt?br />searchsetup.log 在\winnt\temp?br />errorlog 在mssql\log?/p>
pȝ数据库:(x) pȝ表:(x) (d键字(主键)Q?br />候选关键字Q?br />公共关键字:(x) 数据库对象:(x) 范式Q构造数据库必须遵守的规则,目前关系数据库有6U范式,W一范式(1NF)....Q一般需要满?NF SQL(structured query language)l构化查询语a 9U语?br />( SQL语言分类Q?br />( 常用dll语句Q?br />( 常用dml语句: 常用dcl语句: 事务处理语句Q?br />( 数据表名U?as 数据表别名,如果已经l表定了别名Q在T-SQL语句中应引用别名Q而不能用数据表名
select cost*quantity as sum select 数据?join on (员工数据?员工~号=目数据?负责? //联接条g 嵌套select:
like通配W:(x) in的用例:(x) escape的用例:(x) select id,count(*) //group by Ҏ(gu)询结果分l?br />select id,name having 指定分组搜烦(ch)条gQ通常与group by一L(fng) select * asc:升箋 //compute计算 avg,sum,min,max,count (都会(x)忽律null)
union 子查询中一般不用Order by子句QOrder by子句用于最l的l果 >all,<all, 不要把If..exists和聚合函C起?br /> 数据完整性:(x) UNIQUE 和Primary key的差?br />1、?UNIQUE允许输入NULL|最多ؓ(f)一个)(j)Q而Primary key不允许; 建立计算列:(x) 修改数据表:(x) 删除U束字段Q?br />ALTER TABAL订购目A 临时数据表以#?#开_(d)用户断开q接后表被自动删?/p>
数据表中字段的种c:(x) 用查询结果徏立新数据?br />Select * into newtablename from table_source where 条g 重复记录采用DISTINCT来获取单独的数据?/p>
TOP N 为显C前N个数据,TOP N 30 PERSENT * FROM 表名 表示昄N的前30%的数?/p>
ORDER BY 按什么方式排序显C结果,ASC升DESC?/p>
JOIN QSELECT A,B,C FROM T1 JOIN T2 ON T1.NO=T2.NO JOIN 的类型有多种QINNERQ默认)(j)LEFTQ以左边为条Ӟ如果双没有W合的条Ӟ则以NULLQ?br /> SELECT ?产品名称AS旗旗公司产品名称Q旗.hQ标.成品名称AS标标公司产品名称Q标.h FROM 旗旗公司 AS ?LEFT JOIN 标标公司AS?ON?产品名称=标品名U?RIGHTQ以双为条Ӟ如果左边没有W合的条Ӟ则以NULLQFULLQ左边右辚w昄Q如果没有则以NULLQ?CROSSQ将两个表的数据q行比较Q全部显C出来)(j) 有时需要自己JOIN自己 查询Qselect name AS出版CU?bookname AS 书名,sum(quantity) AS 数量 from table group by name,bookname with cube 查询时改变要昄的数据:(x)Q?代表“男”,0代表“女”)(j)要求查询时如果是1则显C“男”,否则昄“女?/p>
Select name AS 姓名,case sex when 0 then “女?else “男”?End AS 性别 From table 比较清单有:(x)INQALLQANYQSOMEQ结果ؓ(f)TRUE或FALSE 索引分ؓ(f)聚集索引和非聚集索引 聚焦索引数据的存放会(x)依照该烦(ch)引的序来存?/p>
非聚焦烦(ch)引数据的存放不会(x)依照索引的顺序来存放 因ؓ(f)非聚焦烦(ch)引不影响数据排列序Q则可以讄多个非聚焦烦(ch)引,而聚焦烦(ch)引则最多只能设|一个,因ؓ(f)实际数据只能有一U排列顺序?/p>
(Unique index)索引值是否唯一Q如果烦(ch)引gؓ(f)唯一Q则成ؓ(f)唯一索引 多个字段做ؓ(f)索引UCؓ(f)复合索引QComposite indexQ?/p>
Create [UNIQUE] -----指定唯一 使用DBCC DBREINDEX重徏索引 如果只想重徏索引Q而不修改索引的相兌|)(j)Q那么用DBCC DBREINDEX语句比较方便Q而且使用时也可指定重建的填充因子?/p>
DBCC DBREINDEXQ’database_name.owner.table_name? index_name, fillfactorQ数据库 数据库所有?表名 重徏的烦(ch)引名 讄新的填充因子[WITH NO_INFOMSGS] -------有此,则重建烦(ch)引不?x)显C出信息 存储q程 变量的声明:(x) 建立存储q程 EXEC lookup ‘杨雄’,@地址 OUTPUT---OUTPUT表示参数的值是可以q回?/p>
一个存储过Eؓ(f)一个批Q因此在查询分析器中遇到GOӞ表示存储q程的定义已l束.在存储过E中,有些创徏对象的语句不可?br />CREATE DEFAULT CREATE TRIGGER 临时存储q程分ؓ(f)局部和全局 修改存储q程ALTER PROC 建立函数CREATE FUNCTION q回单个数据的函数和一般函C?br />q回大量数据集的函数如下例:(x) SELECT * FROM依售h询书c(400Q?00Q?br />ORDER BY 单h(hun) 函数分ؓ(f)定性函数和非确定性函?br />定性函Cؓ(f)当传入的参数不变Ӟq回g变,而非定性函Cؓ(f)传入参数不变Q但每次q回的g(x)改变Q如QGETDATEQ)(j)函数Q?/p>
触发器(TriggerQ是一U与数据表紧密结合的存储q程Q当该数据表有新建(INSERTQ更改(UPDATEQ或删除QDELETEQ事件发生时Q所讄的触发器?x)自动被执行Q以q行数据完整性,或其他一些特D的数据处理工作?/p>
触发器是针对单一数据表所撰写的特D存储过E。触发器的种cM操作Q触发器分ؓ(f)2c?br />AFTER触发器:(x)q类触发器要在数据已变动完成之后QAFTERQ,才会(x)被激zdƈq行必要的善后处理或(g)查。若发现错误Q则可用ROLLBACK TRANSATION回滚全部数据?br />INSTEAD OF触发器:(x)INSTEAD OF 是取代的意思,是q类触发器会(x)取代原本要进行的操作Q例如新建或更改数据库操作)(j)Q因此会(x)在数据变动前发生,而且数据要如何变动也完全取决于触发器。(该触发器能应用与数据表与视图Q?/p>
建立触发?br />CREATE TRIGGER trigger_name 例如Q下面对一个表建立2个触发器Q?br />CREATE TRIGGER 订单修改通知
删除触发器:(x)DROP TRIGGER trigger_name 事务通常是由BEGIN TRAN 语句开始,一直执行到COMMIT TRAN或ROLLBACK TRAN语句时才l束?/p>
当执行完事务中的最后一Ҏ(gu)据库的操作后Q若没有M错误Q我们可以用COMMIT TRAN提交事务。反之,若发现在事务中有M的错误,则执行ROLLBACK TRAN取消事务Qƈ回滚至事务执行前的状态?/p>
每执行完一Ҏ(gu)据库的操作后Q要立即(g)查@@ERROR和@@ROWCOUNTQ否则再执行下一Ҏ(gu)据库操作Ӟq?个系l变量将?x)被新的gѝ在更改或删除数据时Q若因指定条件不W或其他原因而没有更改到M一条记录,׃q种情况q不是错误(@@ERROR仍ؓ(f)0Q,因此我们q要(g)查@@ROWCOUNT的更Ҏ(gu)敎ͼ以确定数据已正确更改?/p>
无论是COMMIT TRANq是ROLLBACK TRAN而结束的事务后,如果后面q有其他未执行的语句Q则q会(x)l箋执行q些语句Q直到批l束。不q已COMMIT的事务就无法再ROLLBACK了,同理Q已ROLLBACK的事务也无法再COMMIT了?/p>
在事务中Q把事务中所有的语句看成是一个数据处理单元,因此单元必须全部做完或全部不做?/p>
事务?大特性:(x)
嵌套事务是以最外层的事务ؓ(f)提交或回滚对象的?br />虽然嵌套事务是以最外层为提交对象的Q但其中的每个事务都有自qBEGIN TRAN 和COMMIT @@TRANCOUNT事务计数 游标的状态:(x) UPDATE 标标公司 SET h=100 WHERE CURRENT OF 游标?br />DELETE 标标公司 WHERE CURRENT OF 游标?/p>
范例Q?br />DECLARE MyCursor CURSORLOCAL SCROLL_LOCKS 游标变量Q用SET已l声明好的游标给游标变量。在使用上,游标变量和游标是一样用的
//所有的ODBC函数都以SQL开?/p>
#include <stdio.h>
#include <afxwin.h>//// MFC core and standard components
#include <sqlext.h> //包含有扩展的ODBC的定?br />#include <sql.h> //包含有基本的ODBC API的定?br />#include <odbcinst.h>
#pragma comment(lib, "odbc32.lib")
#pragma comment(lib, "odbccp32.lib")//SQLConfigDataSource()函数
//#include "sqlucode.h"
//#include "odbcss.h"
int main(int argc, char* argv[])
{
SQLRETURN sr=SQL_SUCCESS;
SQLHENV hEnv=0; //分配odbc环境
SQLHDBC hDbc=0;//
SQLHSTMT hStmt;//
SQLINTEGER iID;//W一?br /> SQLCHAR tmJoin[20];//W二?br /> SQLCHAR szName[10];//W三?br /> SQLREAL fTall;//W四?br /> SQLINTEGER cbID,cbJoin,cbName,cbTall;//保存得到的数据的长度
//
int i=0;
SQLCHAR SqlState[6];
SQLINTEGER NativeError;
SQLCHAR ErrMsg[SQL_MAX_MESSAGE_LENGTH];
//
char szDSN[] = "TestDB";//ODBC数据?
char szUID[] = "sa"; //SQL用户
char szPWD[] = ""; //口o(h)
LPCSTR svSQL="select * from [ApiOdbc]";
/*对于MODBC应用E序来说Q第一步的工作是装载驱动程序管理器Q然后初始化ODBC环境Q分配环境句柄?br /> 首先Q程序中声明一个SQLHENVcd的变量,然后调用函数SQLAllocHandleQ向其中传递分配的上述SQLHENVcd
的变量地址和SQL_HANDLE_ENV选项。如下代码所C:(x)SQLHENV henv;SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
执行该调用语句后Q驱动程序分配一个结构,该结构中存放环境信息Q然后返回对应于该环境的环境句柄?br /> SQLRETURN SQLAllocHandle(
SQLSMALLINT HandleType,
SQLHANDLE InputHandle,W二个参Cؓ(f)输入句柄
SQLHANDLE * OutputHandlePtr W三个参Cؓ(f)输出句柄
);
SQL_HANDLE_ENVQ申L(fng)境句柄?br /> SQL_HANDLE_DBCQ申h据库q接句柄
SQL_HANDLE_STMTQ申请SQL语句句柄Q每ơ执行SQL语句都申误句句柄,q且在执行完成后释放*/
//利用动态链接库Odbcinst.dll动态创建DSN
if(SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"SQL Server","DSN=TestDB\0Description=TestAPIODBC\0SERVER=(local)\0DATABASE=TestDB"))
{
printf("32位ODBC数据源配|?Success!\n\n");
}
sr = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&hEnv);
if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
{
printf("1~~创徏环境句柄SQLAllocHandle Success!\n");
}
//讑֮odbc版本,ODBC讄成ؓ(f)版本3Q否则某些ODBC API 函数不能被支?br /> sr = SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER);
if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
{
printf("2~~SQLSetEnvAttr Success!\n");
}
//分配odbcq接句柄
/*分配环境句柄后,在徏立至数据源的q接之前Q我们必d配一个连接句柄,每一个到数据源的q接对应于一个连接句柄?br /> 首先Q程序定义了一个SQLHDBCcd的变量,用于存放q接句柄Q然后调用SQLAllocHandle函数分配句柄。如下代码所C:(x)
SQLHDBC hdbc;SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);henv为环境句柄?/
sr = SQLAllocHandle(SQL_HANDLE_DBC,hEnv,&hDbc);
if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
{
printf("3~~创徏q接句柄SQL_HANDLE_DBC Success!\n");
}
//q接q接属?
/*当连接句柄分配完成后Q我们可以设|连接属性,所有的q接属性都有缺省|但是我们可以通过调用函数SQLSetConnectAttr()
来设|连接属性。用函数SQLGetConnectAttr()获取q些q接属性。函数格式如下:(x)
SQLRETURN SQLSetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
SQLRETURN SQLGetConnectAttr(SQLHDBC ConnectionHandle,SQLINTEGER Attribute,SQLPOINTER ValuePtr,SQLINTEGER StringLength);
应用E序可以Ҏ(gu)自己的需要设|不同的q接属性?/
sr = SQLSetConnectAttr(hDbc,SQL_ATTR_LOGIN_TIMEOUT,(void*)7,0);
if(sr==SQL_SUCCESS||sr==SQL_SUCCESS_WITH_INFO)
{
printf("4~~讄q接属性SQLSetConnectAttr Success!\n");
}
//q接
/*完成对连接属性的讄之后Q就可以建立到数据源的连接了。对于不同的E序和用h口,可以用不同的函数建立q接Q?br /> SQLConnect、SQLDriverConnect、SQLBrowseConnect?br /> SQLConnect该函数提供了最为直接的E序控制方式Q我们只要提供数据源名称、用户ID和口令,可以进行连接了?br /> 函数格式:SQLRETURN SQLConnect(SQLHDBC ConnectionHandle,SQLCHAR ServerName,SQLSMALLINT NameLength1,SQLCHAR UserName,SQLSMALLINT NameLength2,SQLCHAR *Authentication,SQLSMALLINT NameLength3);
参数:ConnectionHandle q接句柄QServerName 数据源名UͼNameLength1 数据源名U长度,UserName 用户ID
NameLength2 用户ID长度QAuthentication 用户口o(h)QNameLength3 用户口o(h)长度
q回?SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, or SQL_INVALID_HANDLE.
成功q回SQL_SUCCESS*/
sr = SQLConnect(hDbc,(SQLCHAR *)szDSN, SQL_NTS,(SQLCHAR *)szUID,SQL_NTS,(SQLCHAR *)NULL,SQL_NTS);
/*如果q回gؓ(f)SQL_ERROR或SQL_SUCCESS_WITH_INFOQ可以用函数SQLGetDiagRec获取相应SQLSTATE的?/
if(sr != SQL_SUCCESS && sr != SQL_SUCCESS_WITH_INFO)
{
TRACE("ERROR");
while(SQLGetDiagRec(SQL_HANDLE_DBC,hDbc,i,SqlState, &NativeError,ErrMsg,sizeof(ErrMsg),NULL)!= SQL_NO_DATA)
TRACE("Diag : %d SQLSTATE :%s NativeError : %d ,ErrMsg : %s\n",i ++,SqlState,NativeError,ErrMsg);
}
else
{
printf("5~~q接Connect Success!\n");
}
//分配语句句柄sr = SQLAllocStmt(hDbc,&hStmt);SQLAllocStmt() 已被废弃Q且替换?SQLAllocHandle()Q?br /> sr=SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
if(sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
{
printf("6~~分配语句句柄SQL_HANDLE_STMT Success!\n");
}
sr=SQLExecDirect(hStmt,(UCHAR *)svSQL,SQL_NTS);
if (sr == SQL_SUCCESS||sr == SQL_SUCCESS_WITH_INFO)
{
printf("7~~执行SQL查询语句SQLExecDirect Success!\n");
printf("\n-------------get date from db-------------\n");
while ((sr=SQLFetch(hStmt))!=SQL_NO_DATA)
{
//执行SQL语句后遍历结果集来得到数?br /> SQLGetData(hStmt, 1, SQL_C_ULONG, &iID, 0, &cbID);
SQLGetData(hStmt, 2, SQL_C_CHAR, tmJoin, 20, &cbJoin);//datatimecd攑֜SQLCHAR数组中,数组length要?br /> SQLGetData(hStmt, 3, SQL_C_CHAR, szName, 10, &cbName);
SQLGetData(hStmt, 4, SQL_C_FLOAT, &fTall, 0, &cbTall);
printf("%d~~~%s~~~%s~~~%f\n",iID,tmJoin,szName,fTall);
}
}
if(hStmt!=SQL_NULL_HANDLE)
{
SQLFreeHandle( SQL_HANDLE_STMT, hStmt );
hStmt=NULL;
}
if(hDbc != SQL_NULL_HANDLE)
{
sr = SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC,hDbc);
hDbc=NULL;
}
if(hEnv != SQL_NULL_HANDLE)
{
SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
hEnv=NULL;
}
//
printf("API ODBC Success!\n");
system("PAUSE");
return 0;
}
]]>
数据模型:概念数据模型 ----设计
逻辑数据模型Q关pL据模型,|状数据模型Q层ơ数据模型,Q?---实现
物理数据模型
数据模式Q描q?/p>
实体—联p:(x)er模型
rdbms (关系数据? : sql server ,oracle ,db/2,sybase,informix
Non-rdbms (file-based) : foxpro,access
标准?win2000 server
ơ要数据文g .ndf
日志文g .ldf
master:
model: 是用h据库和tempdb数据库的摸板数据库,是创建新数据库的摸板
msdb: 是代理服务数据库
tempdb: 临时数据库,默认大小8mbQؓ(f)临时操作提供存储I间
pubs: C学习(fn)
(
sysobjects?br />syscolumns?br />sysindexes?br />sysusers?br />sysdatabases?br />sysdepends?br />sysconstraints?br />)
外关键字Q确定主表和从表)
(
?br />索引
视图Q其实是虚表Q是查询表生的
图表Q是表之间的关系C意?br />省|(x)
规则Q?br />触发器:(x)
存储q程Q?br />用户Q?br />)
数据查询Qselect
数据定义Qcreate,drop(删除),alter(修改)
数据操作Qinsert,update,delete
数据控制Qgrant,revoke
)
数据定义语言(dll),用于定义数据l构
数据控制语言(dml)Q用于检索和修改数据l构
数据控制语言(dcl),用于规定数据库用L(fng)权限
数据库事务处理,用来保证数据库的完整?br />)
create table
create index
drop table 删除数据库表
drop index
truncate 删除表中所有的?br />alter table 增加表列Q重定义表列Q更改存储分?br />alter table add constraint 在已有的表上增加U束
)
(
insert
delete
update
selete
)
(
grant 权限或角色授予用户或其他角?br />revoke 从用h数据库角色回收权?br />set role 止或允许角?br />)
commit work 把当前事务所作的更改怹?br />rollback 作废上次提交以来的所有更?br />)
select e.id,e.name from 用户?as e
select [all | distinct] [top n] selectlist [into[NewtAbleName]] //distinct:无重复的,selectlist:可以是表辑ּ
from {TableName | ViewName,....}
where conditions
[group by group_by_list] // 分组
[having conditions] // 分组条g
[order by order_by_list [asc | desc]]
select table1.a,tmptable.b
from table1,
(select table2.c,table2.d
from table2
where table2.id>2) as tmptable
where table1.id=tmptable.id
where:
比较Q?lt;,<=,>,>=,=,!=,!<,!>
范围Qbetween a and b , not between a and b
可选择Qin,not in
模式匚wQlikeQnot like
是否I|(x)is null,is not null
逻辑Qand,or,not
% Q?like 'wang%' like '%yi'
- Q?like '_angyi'
[] Qlike '[a-z]angyi'
[~] Qlike '[~w]angyi'
select name
from table
where id in ('4','20')
select *
from table
like 'wang#_yi' escape '#'
from table
where wage>=6000
group by id
from table
where level='2'
group by id,name //先按id分,在按name?br />with cube //对group产生的组再按l统?br />with rollup //只返回第一个分l条件下的再按组l计
having count(*)>1
from table
where col like '%50[%]%' q回包含50%的字W串
select id,wage
from table
order by 部门
compute sum(wage) by 部门
count(distinct 列名)
<>all{h(hun)于not in
>some,<some
=some {h(hun)于in <>some{h(hun)?not in
实体完整?--表中数据的唯一?br />区域完整?--字段数据范围的完整?br />参考完整?---表与表之间关联的完整?br />
使用者定义的完整?---用户自己定义的完整性。如Q客h6个月的钱Q下ơ再下定单的时候就不卖l他?br />
数据库分:(x)使用SQL语句分离为EXEC sp_detach_db ‘销售数据库?指明Ʋ分ȝ数据库名U即可。分d惛_用该数据库,则需要附加该数据库,具体SQL语句为:(x)
CREATE DATABASE 销售数据库 ON PRIMARYQF(tun)ILENAME=’C(j):\SQLTEST\销售数据文件_1。MDF’)(j)
FOR ATTACH 或者用sp_attach_dbpȝ存储q程来附加数据库Q?br />sp_attach_db 销售数据库
‘C:\SQLTEST\销售数据文件_1.MDF?/p>
2、?一个数据表中可以定义多个UNIQUE条gU束Q但只能定义一个Primary key条gU束?br />
CHECKU束可用来限制字D值是否在所允许的范围内Q例如:(x)
CREATE TABLE 客户02
(
客户~号 int IDENTITY NULL UNIQUE,
w䆾证号 char[10] NOT NULL UNIQUE,
q龄 int CHECK (q龄>0) DEFAULT 2
)
CREATE TABLE Ch(hun)
(
~号 int IDENTITY, //自动~号
单h(hun) numeric(5,1),
数量 int,
Mh(hun) AS 单h(hun)*数量
)
insert Ch(hun) values(21.5,8)
insert Ch(hun) values(12,3)
delete from Ch(hun) where ~号=5 or ~号=6
drop table Ch(hun)
创徏U束字段Q?br />Create table 客户
{
客户~号 int IDENTITY Primary Key,------------------------IDENTITY自动产生~号
w䆾证号 char 18 NOT NULL UNIQUE,
地址 char(50),
?sh)话 ?char (12),
杂志~号 int REFERENCES 杂志U类Q杂志编P(j),
订单~号 int NOT NULL,FOREIGN Key(杂志~号Q订L(fng)?
REFERENCES 杂志订户Q杂志编P订户~号Q,
Check(地址 is NOT NULL OR ?sh)话?is NOT NULL)
}
ALTER TABLE 客户A
ADD
cd~号 int
DEFAULT 1 WITH VALUES
CONSTRAINT FK_cd~号
FOREIGN KEY
REFERENCES 客户cdQ类别编P(j)
DROP CONSTRAINT PK_订购目A
下面删除订购目A的两个字D?br />ALTER TABLE 订购目A
DROP COLUMN 定单~号Q项目编?br />
Ȁz?关闭U束
ALTER TABLE table
{ CHECK | NOCHECK} CONSTRAINT
{ALL | constrant_name{,…?n}}
Primary key, Foreign Key, NULL, NOT NULL, DEFAULT, UNIQUE, CHECK
SELECT 员工.姓名Q员?职位Q长?姓名ASȝ
FROM 员工 LEFT JOIN 员工AS 长官
ON 员工.ȝ~号=ȝ.~号 姓名 职位 ȝ
1
a
b
c
2
d
e
NULL
GROUP BY 按什么分l显C?br />
UNION把两个查询结果合q到一个表中显C出来查询时Group的用,
Select name AS名称,Sum(Quantity)数量 Form table Group By name
GROUP BY后面如果有WITH CUBE则把各个l进行汇总计后昄l果
试存在用EXISTSl果q回TRUEQFALSE
CREATE TABLE t
(
ProductID smallint not null primary key,
ProductName char(30),
Price smallmoney,
Manufacturer char(30)
)
//创徏索引
CREATE UNIQUE NONCLUSTERED INDEX indexname
ON t (Price DESC)
WITH PAD_INDEX, FILLFACTOR=30,IGNORE_DUP_KEY
//删除索引
DROP INDEX table.index_name
//修改索引
使用DROP_EXISTING修改索引,如果要修改烦(ch)引,只要在CREATE INDEX语句的最后加上DROP_EXISTING卛_Q如果存在该索引Q则修改之,否则?x)发生错误?j)
pȝ存储q程都是?sp_开?br />扩展存储q程通常以xp_开?br />EXECUTE 执行存储q程或SQL字符ԌEXECQ?br />EXEC 存储q程名 ?参数1 参数2 参数3…?/p>
DECLARE @A int -------------- 生命了一个ؓ(f)int cd的A 变量?/p>
使用CREATE PROC或者CREATE PROCEDURE + q程?+ AS +SQL语句
CREATE PROC MyProcl
AS SELECT * FROM 标标公司 WHERE h >5
GO
EXEC MyProcl
CREATE PROCEDURE CREATE VIEW
CREATE RULE
局部要?开?br />全局要以##开?/p>
删除存储q程DROP PROC
修改函数 ALTER FUNCTION
删除函数DROP FUNCTION
CREATE FUNCTION 依售h询书c?br />Q@?money, @到moneyQ?br />RETURNS TABLE
RETURN QSELECT 书籍~号Q书c名Uͼ单h(hun) FROM 书籍 WHERE 单h(hun)>=@由AND单h(hun)<=@刎ͼ(j)
GO
在调用系l内|的函数Ӟ需要加上 ?Q:(x)如:(x)SELECT * FROM Q:(x)fn_helpcollations()在创时可以用这些函数?/p>
ON {table|view}
[with encryption] ------加密
{FOR|AFTER|INSTEAD OF} ------FOR和AFITER都是要等到数据完全操作完后才Ȁz触发器QINSTEAD OF则表C建立INSTEAD OF触发器,此时触发器将取代原来要执行的数据操作?br />{[DELETE][,][INSERT][,][UPDATE]}-----指定触发器的触发操作Q必L定一个,多个时以逗号隔开Q在同一数据表中QAFTER触发器数目没有限Ӟ但对INSTEAD OF 触发器来说则限制DELETE、INSERT、UPDATE每项最多只能有一个?br />AS
Sql_statements ------用来定义触发器的内容?/p>
ON 订单
AFTER INSERT QUPDATE
AS
PRINT ‘又有订单被修改了!?br />GO
CREATE TRGGER 订单删除通知
ON 订单
AFTER DELETE
AS
PRINT ‘又有订单被删除了!?br />GO
INSERT 订单(日期Q客L(fng)?
Values(?000/1/1?3)
Delete订单
Where 日期=?000/1/1?/p>
1Q?原子性:(x)整个事务被看成一个执行单元,要么全部成功Q要么全部取消?br />2Q?一致性:(x)当事务完成后Q数据库的内容必d部更新妥当,而且仍然具备正确性及(qing)完整性?br />3Q?隔离性:(x)在事务中所使用到的数据Q必M其他同时在进行的事务适度隔离Q用锁定数据的Ҏ(gu)来隔M务)(j)
4Q?怹性:(x)事务一旦提交后Q其所作的数据修改被视ؓ(f)怹性的Q无法再用ROLLBACK回滚了?/p>
事务是以q接为单位,每个q接都可以有自己的事务?br />事务的执行有3U模式:(x)
1Q?外显事务2Q?自动提交事务3Q?隐含事务
其实事务是ؓ(f)存储q程而设计的Q因h们就可以在存储过E中撰写事务E序Q而不用担心该E序被调用时是否已在另一个事务之中?/p>
无论是那里调用ROLLBACKQ都?x)蟩转到最外层的BEGIN TRAN处,@@TRANCOUNT都会(x)变ؓ(f)0。?br />有时在事务中发生错误Ӟ我们希望只要回滚一部分就可以?br />则用SAVE TRANSACTION来设|“事务保存点”,然后在必要时使用ROLLBACK来回滚到所保存的位|,而不?x)中断事务?br />
ROLLBACK 后的事务名称只能是由SAVATRAN或最外层的BEGIN TRAN所声明的事务名U?/p>
1
Cursor已打开Q其内有0Q?或多条记?br /> 0
Cursor已打开Q但定其内没有查询CQ何一条信息记?br /> -1
Cursor已关?br /> -2
Cursor变量名未参照到时间Cursor或参照的Cursor已被DeAllocale
-3
指定的游标变量名不存?br />
Cursor主要是用于SQL扏V存储过E和出发器中?br />游标的格式:(x)
DECLARE 游标名?CURSOR -------声明游标
FOR SELECT 姓名 FROM 通讯薄?WHERE 地址=台北 -------------游标的数据来?br />OPEN 游标名 ?-----------打开游标
DECLARE @name varchar(20)
FETCH NEXT FROM 游标名 ?------------第一条数据存入@name
INTO @name
WHILE(@@FETCH_STATUS=0) -------------判断是否d数据Q?表示d数据
BEGIN
FETCH NEXT FROM 游标?br /> INTO @name
END
CLOSE 游标名 ?----------------关闭游标与数据的兌
DEALLOCATE 游标名?---------------游标对象删?br />除了Cursor中FETCH数据外,可以通过Cursor来UPDATE或DELETE一条目前所指定的记?/p>
FOR SELECT hFROM 标标公司
FOR UPDATE
OPEN MyCursor
DECLARE @money money
FETCH MyCursor INTO @money
WHILE(@@FETCH_STATUS=0)
BEGIN
IF @money<=10
BEGIN
SET @money=money*1.1
UPDATE 标标公司
SET h=@money -----------------更新h信息
WHERE CURRENT OF MyCursor
END
FETCH MyCursor INTO @money
END
全局游标和本地游标有相同的变量时Q以本地游标Z先调?/p>
]]>
ATL(Activeh?
UDA通用数据讉KQ用OLE DB讉KM数据?由O(jin)LE DB,ADO,ODBCl成
RDOq程数据对象
DAO数据讉K对象
ODBC开放数据库互连
ADO(Active Data Object)是一个访问OLE DB的类?br />OLE DB有一lCOM接口l成
ODBC的框?br />1。用驱动器理器和特定的数据库驱动器来获得ODBC,
2。利用ODBC来调用应用程序,讉KODBC驱动器管理器(ODBC32DLL)Q?br />3。利用ODBC驱动器管理器调用数据库指定的ODBC驱动器,
4。利用数据库指定的ODBC驱动器来讉K数据?/p>
ODBC讉K多种数据?br /> |->Oracle ODBC数据库驱动器
ODBC应用E序-->ODBC驱动器管理程?->| -->关系数据库数据源
|->SQL Server数据库驱动器
CObjectc?CDatabase CRecordset讉K数据库源
DSN共分Zc:(x)
用户DSNQ对当前d用户可见Q只能够用于当前计算机?br />pȝDSNQ对当前pȝ上所有用户可见,包括NT中的服务?br />文gDSNQDSN信息存放在文件中Q对能够讉K到该文g的用户可见?/p>
一个用Access数据库的DSN中的信息如下Q?br />[ODBC]
DRIVER=Driver do Microsoft Access (*.mdb)
UID=Admin
DefaultDir=C:\DB
DBQ=C:\DB\1.mdb
在用ODBC开发时一个重要的问题是数据转换的问?在程序运行过E中数据需要经历两ơ{换:(x)C语言的数据或l构cd与ODBC的数据类型的转换QODBC与SQL间数据类型的转换
ODBC中的句柄分ؓ(f)三类Q环境句柄,数据库连接句柄,SQL语句句柄