SQL语句大全
一、基础
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不相等