一、基础 1、说明:创建数据库CREATEDATABASEdatabasename 2、说明:删除数据库dropdatabasedbname 3、说明:备份sqlserver创建备份数据的deviceUSEmasterEXECspaddumpdevicedisk,testBack,c:mssql7backupMyNwind1。dat开始备份BACKUPDATABASEpubsTOtestBack 4、说明:创建新表createtabletabname(col1type1〔notnull〕〔primarykey〕,col2type2〔notnull〕,。。) 根据已有的表创建新表: A:createtabletabnewliketabold(使用旧表创建新表) B:createtabletabnewasselectcol1,col2fromtabolddefinitiononly 5、说明:删除新表droptabletabname 6、说明:增加一个列Altertabletabnameaddcolumncoltype 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键:Altertabletabnameaddprimarykey(col) 说明:删除主键:Altertabletabnamedropprimarykey(col) 8、说明:创建索引:create〔unique〕indexidxnameontabname(col。)删除索引:dropindexidxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:createviewviewnameasselectstatement 删除视图:dropviewviewname 10、说明:几个简单的基本的sql语句 选择:selectfromtable1where范围 插入:insertintotable1(field1,field2)values(value1,value2) 删除:deletefromtable1where范围更新:updatetable1setfield1value1where范围 查找:selectfromtable1wherefield1like’value1’like的语法很精妙,查资料! 排序:selectfromtable1orderbyfield1,field2〔desc〕 总数:selectcountastotalcountfromtable1 求和:selectsum(field1)assumvaluefromtable1 平均:selectavg(field1)asavgvaluefromtable1 最大:selectmax(field1)asmaxvaluefromtable1 最小:selectmin(field1)asminvaluefromtable1 11、说明:几个高级查询运算词 A:UNION运算符UNION运算符通过组合其他两个结果表(例如TABLE1和TABLE2)并消去表中任何重复行而派生出一个结果表。当ALL随UNION一起使用时(即UNIONALL),不消除重复行。两种情况下,派生表的每一行不是来自TABLE1就是来自TABLE2。 B:EXCEPT运算符 EXCEPT运算符通过包括所有在TABLE1中但不在TABLE2中的行并消除所有重复行而派生出一个结果表。当ALL随EXCEPT一起使用时(EXCEPTALL),不消除重复行。 C:INTERSECT运算符 INTERSECT运算符通过只包括TABLE1和TABLE2中都有的行并消除所有重复行而派生出一个结果表。当ALL随INTERSECT一起使用时(INTERSECTALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 12、说明:使用外连接 A、left(outer)join:左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。SQL:selecta。a,a。b,a。c,b。c,b。d,b。ffromaLEFTOUTJOINbONa。ab。c B:right(outer)join:右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。C:fullcross(outer)join:全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。12、分组:Groupby: 一张表,一旦分组完成后,查询后只能得到组相关的信息。组相关的信息:(统计信息)count,sum,max,min,avg分组的标准)在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据在selecte统计函数中的字段,不能和普通的字段放在一起; 13、对数据库进行操作: 分离数据库:spdetachdb; 附加数据库:spattachdb后接表明,附加需要完整的路径名 14。如何修改数据库的名称:sprenamedboldname,newname 二、提升 1、说明:复制表(只复制结构,源表名:a新表名:b)(Access可用)法一:selectintobfromawhere11(仅用于SQlServer) 法二:selecttop0intobfroma 2、说明:拷贝表(拷贝数据,源表名:a目标表名:b)(Access可用) insertintob(a,b,c)selectd,e,ffromb; 3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用) insertintob(a,b,c)selectd,e,ffrombin‘具体数据库’where条件例子:。。frombinServer。MapPath(。)data。mdbwhere。。 4、说明:子查询(表名1:a表名2:b) selecta,b,cfromawhereaIN(selectdfromb)或者:selecta,b,cfromawhereaIN(1,2,3) 5、说明:显示文章、提交人和最后回复时间 selecta。title,a。username,b。adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable。titlea。title)b 6、说明:外连接查询(表名1:a表名2:b) selecta。a,a。b,a。c,b。c,b。d,b。ffromaLEFTOUTJOINbONa。ab。c 7、说明:在线视图查询(表名1:a) selectfrom(SELECTa,b,cFROMa)Twheret。a1; 8、说明:between的用法,between限制查询数据范围时包括了边界值,notbetween不包括 selectfromtable1wheretimebetweentime1andtime2selecta,b,c,fromtable1whereanotbetween数值1and数值2 9、说明:in的使用方法 selectfromtable1wherea〔not〕in(‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 deletefromtable1wherenotexists(selectfromtable2wheretable1。field1table2。field1) 11、说明:四表联查问题: selectfromaleftinnerjoinbona。ab。brightinnerjoincona。ac。cinnerjoindona。ad。dwhere。。。。。 12、说明:日程安排提前五分钟提醒 SQL:selectfrom日程安排wheredatediff(minute,f开始时间,getdate())5 13、说明:一条sql语句搞定数据库分页 selecttop10b。from(selecttop20主键字段,排序字段from表名orderby排序字段desc)a,表名bwhereb。主键字段a。主键字段orderbya。排序字段 具体实现:关于数据库分页: declarestartint,endintsqlnvarchar(600)setsql’selecttop’str(endstart1)’fromTwhereridnotin(selecttop’str(str1)’RidfromTwhereRid1)’execspexecutesqlsql 注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 selecttop10formtable1where范围 15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等。) selecta,b,cfromtablenametawherea(selectmax(a)fromtablenametbwheretb。bta。b) 16、说明:包括所有在TableA中但不在TableB和TableC中的行并消除所有重复行而派生出一个结果表(selectafromtableA)except(selectafromtableB)except(selectafromtableC) 17、说明:随机取出10条数据 selecttop10fromtablenameorderbynewid() 18、说明:随机选择记录 selectnewid() 19、说明:删除重复记录 1)deletefromtablenamewhereidnotin(selectmax(id)fromtablenamegroupbycol1,col2,。。。)2)selectdistinctintotempfromtablenamedeletefromtablenameinsertintotablenameselectfromtemp 评价:这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段 altertabletablename添加一个自增列addcolumnbintidentity(1,1)deletefromtablenamewherecolumnbnotin(selectmax(columnb)fromtablenamegroupbycolumn1,column2,。。。)altertabletablenamedropcolumncolumnb 20、说明:列出数据库里所有的表名selectnamefromsysobjectswheretypeUU代表用户 21、说明:列出表里的所有的列名selectnamefromsyscolumnswhereidobjectid(TableName) 22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select中的case。selecttype,sum(casevenderwhenAthenpcselse0end),sum(casevenderwhenCthenpcselse0end),sum(casevenderwhenBthenpcselse0end)FROMtablenamegroupbytype 显示结果: typevenderpcs 电脑A1 电脑A1 光盘B2 光盘A2 手机B3 手机C3 23、说明:初始化表table1TRUNCATETABLEtable1 24、说明:选择从10到15的记录selecttop5from(selecttop15fromtableorderbyidasc)table别名orderbyiddesc 三、技巧 1、11,12的使用,在SQL语句组合时用的较多 where11是表示选择全部where12全部不选, 如:ifstrWhere!beginsetstrSQLselectcount()asTotalfrom〔tblName〕wherestrWhereendelsebeginsetstrSQLselectcount()asTotalfrom〔tblName〕end 我们可以直接写成setstrSQLselectcount()asTotalfrom〔tblName〕where11安定strWhere 2、收缩数据库 重建索引 DBCCREINDEX DBCCINDEXDEFRAG 收缩数据和日志 DBCCSHRINKDB DBCCSHRINKFILE 3、压缩数据库dbccshrinkdatabase(dbname) 4、转移数据库给新用户以已存在用户权限execspchangeusersloginupdateone,newname,oldnamego 5、检查备份集RESTOREVERIFYONLYfromdiskE:dvbbs。bak 6、修复数据库 ALTERDATABASE〔dvbbs〕SETSINGLEUSER GO DBCCCHECKDB(dvbbs,repairallowdataloss)WITHTABLOCK GO ALTERDATABASE〔dvbbs〕SETMULTIUSER GO 7、日志清除SETNOCOUNTON DECLARELogicalFileNamesysname, MaxMinutesINT, NewSizeINT USEtablename要操作的数据库名 SELECTLogicalFileNametablenamelog,日志文件名 MaxMinutes10,Limitontimeallowedtowraplog。 NewSize1你想设定的日志文件的大小(M) Setupinitialize DECLAREOriginalSizeint SELECTOriginalSizesize FROMsysfiles WHEREnameLogicalFileName SELECTOriginalSizeofdbname()LOGis CONVERT(VARCHAR(30),OriginalSize)8Kpagesor CONVERT(VARCHAR(30),(OriginalSize81024))MB FROMsysfiles WHEREnameLogicalFileName CREATETABLEDummyTrans (DummyColumnchar(8000)notnull) DECLARECounterINT, StartTimeDATETIME, TruncLogVARCHAR(255) SELECTStartTimeGETDATE(), TruncLogBACKUPLOGdbname()WITHTRUNCATEONLY DBCCSHRINKFILE(LogicalFileName,NewSize) EXEC(TruncLog) Wrapthelogifnecessary。 WHILEMaxMinutesDATEDIFF(mi,StartTime,GETDATE())timehasnotexpired ANDOriginalSize(SELECTsizeFROMsysfilesWHEREnameLogicalFileName) AND(OriginalSize81024)NewSize BEGINOuterloop。 SELECTCounter0 WHILE((CounterOriginalSize16)AND(Counter50000)) BEGINupdate INSERTDummyTransVALUES(FillLog)DELETEDummyTrans SELECTCounterCounter1 END EXEC(TruncLog) END SELECTFinalSizeofdbname()LOGis CONVERT(VARCHAR(30),size)8Kpagesor CONVERT(VARCHAR(30),(size81024))MB FROMsysfiles WHEREnameLogicalFileName DROPTABLEDummyTrans SETNOCOUNTOFF 8、说明:更改某个表execspchangeobjectownertablename,dbo 9、存储更改全部表CREATEPROCEDUREdbo。UserChangeObjectOwnerBatch OldOwnerasNVARCHAR(128), NewOwnerasNVARCHAR(128) AS DECLARENameasNVARCHAR(128) DECLAREOwnerasNVARCHAR(128) DECLAREOwnerNameasNVARCHAR(128) DECLAREcurObjectCURSORFOR selectNamename, Ownerusername(uid) fromsysobjects whereusername(uid)OldOwner orderbyname OPENcurObject FETCHNEXTFROMcurObjectINTOName,Owner WHILE(FETCHSTATUS0) BEGIN ifOwnerOldOwner begin setOwnerNameOldOwner。rtrim(Name) execspchangeobjectownerOwnerName,NewOwner end selectname,NewOwner,OldOwner FETCHNEXTFROMcurObjectINTOName,Owner END closecurObject deallocatecurObject GO 10、SQLSERVER中直接循环写入数据 declareiint seti1 whilei30 begin insertintotest(userid)values(i) setii1 end 案例: 有如下表,要求就裱中所有沒有及格的成績,在每次增長0。1的基礎上,使他們剛好及格:NamescorZhangshan80Lishi59Wangwu50Songquan69while((selectmin(score)fromtbtable)60) begin updatetbtablesetscorescore1。01 wherescore60 if(selectmin(score)fromtbtable)60 break else continue end 数据开发经典 1。按姓氏笔画排序:SelectFromTableNameOrderByCustomerNameCollateChinesePRCStrokecias从少到多 2。数据库加密: selectencrypt(原始密码) selectpwdencrypt(原始密码) selectpwdcompare(原始密码,加密后密码)1相同;否则不相同encrypt(原始密码) selectpwdencrypt(原始密码) selectpwdcompare(原始密码,加密后密码)1相同;否则不相同 3。取回表中字段: declarelistvarchar(1000), sqlnvarchar(1000) selectlistlist,b。namefromsysobjectsa,syscolumnsbwherea。idb。idanda。name表A setsqlselectright(list,len(list)1)from表A exec(sql) 4。查看硬盘分区:EXECmaster。。xpfixeddrives 5。比较A,B表是否相等: if(selectchecksumagg(binarychecksum())fromA) (selectchecksumagg(binarychecksum())fromB) print相等 else print不相等 头条创作挑战赛