【网学网提醒】:网学会员为您提供sql小技巧参考,解决您在sql小技巧学习中工作中的难题,参考学习。
把长日期转换为短日期
Convert(char(10),getdate(),120)
MS-SQL数据库开发常用汇总1.按姓氏笔画排序:Select*FromTableNameOrderByCustomerNameCollateChinese_PRC_Stroke_ci_as2.数据库加密:selectencrypt('原始密码')selectpwdencrypt('原始密码')selectpwdcompare('原始密码','加密后密码')=1--相同;否则不相同encrypt('原始密码')selectpwdencrypt('原始密码')selectpwdcompare('原始密码','加密后密码')=1--相同;否则不相同3.取回表中字段:declare@listvarchar(1000),@sqlnvarchar(1000)select@list=@list+','+b.namefromsysobjectsa,syscolumnsbwherea.id=b.idanda.name='表A'set@sql='select'+right(@list,len(@list)-1)+'from表A'exec(@sql)4.查看硬盘分区:EXECmaster..xp_fixeddrives5.比较A,B表是否相等:if(selectchecksum_agg(binary_checksum(*))fromA)=(selectchecksum_agg(binary_checksum(*))fromB)print'相等'elseprint'不相等'6.杀掉所有的事件探察器进程:DECLAREhcforeachCURSORGLOBALFORSELECT'kill'+RTRIM(spid)FROMmaster.dbo.sysprocessesWHEREprogram_nameIN('SQLprofiler',N'SQL事件探查器')EXECsp_msforeach_worker'?'7.记录搜索:开头到N条记录SelectTopN*From表------------------------------N到M条记录(要有主索引ID)SelectTopMN*From表WhereIDin(SelectTopMIDFrom表)OrderbyIDDesc
---------------------------------N到结尾记录SelectTopN*From表OrderbyIDDesc8.如何修改数据库的名称:sp_renamedb'old_name','new_name'9:获取当前数据库中的所有用户表selectNamefromsysobjectswherextype='u'andstatus>=010:获取某一个表的所有字段selectnamefromsyscolumnswhereid=object_id('表名')11:查看与某一个表相关的视图、存储过程、函数selecta.*fromsysobjectsa,syscommentsbwherea.id=b.idandb.textlike'%表名%'12:查看当前数据库中所有存储过程selectnameas存储过程名称fromsysobjectswherextype='P'13:查询用户创建的所有数据库select*frommaster..sysdatabasesDwheresidnotin(selectsidfrommaster..sysloginswherename='sa')或者selectdbid,nameASDB_NAMEfrommaster..sysdatabaseswheresid<>0x0114:查询某一个表的字段和数据类型selectcolumn_name,data_typefrominformation_schema.columnswheretable_name='表名'[n].[标题]:Select*FromTableNameOrderByCustomerName[n].[标题]:来自dev.csdn.net/develop/article/83/83138.shtm一、只复制一个表结构,不复制数据
selecttop0*into[t1]from[t2]
二、获取数据库中某个对象的创建脚本1、先用下面的脚本创建一个函数ifexists(select1fromsysobjectswhereid=object_id('fgetscript')andobjectproperty(id,'IsInlineFunction')=0)dropfunctionfgetscriptgo
createfunctionfgetscript(@servernamevarchar(50),@useridvarchar(50)='sa',@passwordvarchar(50)='',@databasenamevarchar(50),@ob
jectnamevarchar(250)--服务器名--用户名,如果为nt验证方式,则为空--密码--数据库名称--对象名
)returnsvarchar(8000)asbegindeclare@revarchar(8000)declare@srvidint,@dbsidintdeclare@dbidint,@tbidint--返回脚本--定义服务器、数据库集id--数据库、表id
declare@errint,@srcvarchar(255),@descvarchar(255)--错误处理变量
--创建sqldmo对象exec@err=sp_oacreate'sqldmo.sqlserver',@srvidoutputif@err<>0gotolberr--连接服务器ifisnull(@userid,'')=''--如果是Nt验证方式beginexec@err=sp_oasetproperty@srvid,'loginsecure',1if@err<>0gotolberr
exec@err=sp_oamethod@srvid,'connect',null,@servernameendelseexec@err=sp_oamethod@srvid,'connect',null,@servername,@userid,@password
if@err<>0gotolberr--获取数据库集exec@err=sp_oagetproperty@srvid,'databases',@dbsidoutputif@err<>0gotolberr
--获取要取得脚本的数据库idexec@err=sp_oamethod@dbsid,'item',@dbidoutput,@databasenameif@err<>0gotolberr--获取要取得脚本的对象idexec@err=sp_oamethod@dbid,'getobjectbyname',@tbidoutput,@objectnameif@err<>0gotolberr--取得脚本exec@err=sp_oamethod@tbid,'script',@reoutputif@err<>0gotolberr
--print@rereturn(@re)
lberr:execsp_oageterrorinfoNULL,@srcout,@descoutdeclare@errbvarbinary(4)set@errb=cast(@errasvarbinary(4))execmaster..xp_varbintohexstr@errb,@reoutset@re='错误号:'+@re+char(13)+'错误源:'+@src+char(13)+'错误描述:'+@descreturn(@re)endgo
2、用法如下用法如下,printdbo.fgetscript('服务器名','用户名','密码','数据库名','表名或其它对象名')
3、如果要获取库里所有对象的脚本,如如下方式declare@namevarchar(250)declare#aacursorforselectnamefromsysobjectswherextypenotin('S','PK','D','X','L')open#aafetchnextfrom#aainto@name
while@@fetch_status=0beginprintdbo.fgetscript('onlytiancai','sa','sa','database',@name)fetchnextfrom#aainto@nameendclose#aadeallocate#aa
4、声明,此函数是csdn邹建邹老大提供的三、分隔字符串如果有一个用逗号分割开的字符串,比如说"a,b,c,d,1,2,3,4",如何用t-sql获取这个字符串有几个元素,获取第几个元素的值是多少呢?因为t-sql里没有split函数,也没有数组的概念,所以只能自己写几个函数了。1、获取元素个数的函数createfunctiongetstrarrlength(@strvarchar(8000))returnsintasbegindeclare@int_returnintdeclare@startintdeclare@nextintdeclare@locationintselect@str=','+@str+','select@str=replace(@str,',,',',')select@start=1select@next=1select@location=charindex(',',@str,@start)while(@location<>0)beginselect@start=@location+1select@location=charindex(',',@str,@start)select@next=@next+1endselect@int_return=@next-2return@int_returnend
2、获取指定索引的值的函数
createfunctiongetstro
findex(@strvarchar(8000),@indexint=0)returnsvarchar(8000)asbegindeclare@str_returnvarchar(8000)declare@startintdeclare@nextintdeclare@locationintselect@start=1select@next=1--如果习惯从0开始则select@next=0select@location=charindex(',',@str,@start)while(@location<>0and@index>@next)beginselect@start=@location+1select@location=charindex(',',@str,@start)select@next=@next+1endif@location=0select@location=len(@str)+1--如果是因为没有逗号退出,则认为逗号在字符串后select@str_return=substring(@str,@start,@location-@start)--@start肯定是逗号之后的位置或者就是初始值1if(@index<>@next)select@str_return=''--如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。return@str_returnend
3、测试SELECT[dbo].[getstrarrlength]('1,2,3,4,a,b,c,d')SELECT[dbo].[getstrofindex]('1,2,3,4,a,b,c,d',5)
四、一条语句执行跨越若干个数据库我要在一条语句里操作不同的服务器上的不同的数据库里的不同的表,怎么办呢?第一种方法:select*fromOPENDATASOURCE('SQLOLEDB','DataSource=远程ip;UserID=sa;Password=密码').库名.dbo.表名
第二种方法:先使用联结服务器:EXECsp_addlinkedserver'别名','','MSDASQL',NULL,NULL,'DRIVER={SQLServer};SERVER=远程名;UID=用户;PWD=密码;'execsp_addlinkedsrvlogin@rmtsrvname='别名',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='密码'GO
然后你就可以如下:select*from别名.库名.dbo.表名insert库名.dbo.表名select*from别名.库名.dbo.表名select*into库名.dbo.新表名from别名.库名.dbo.表名go
五、怎样获取一个表中所有的字段信息蛙蛙推荐:怎样获取一个表中所有字段的信息先创建一个视图Createviewfielddescasselecto.nameastable_name,c.nameasfield_name,t.nameastype,c.lengthas
length,c.isnullableasisnullable,convert(varchar(30),p.value)asdespfromsyscolumnscjoinsystypestonc.xtype=t.xusertypejoinsysobjectsoono.id=c.idleftjoinsyspropertiesponp.smallid=c.colidandp.id=o.id
whereo.xtype='U'
查询时:Select*fromfielddescwheretable_name='你的表名'
还有个更强的语句,是邹建写的,也写出来吧SELECT(casewhena.colorder=1thend.nameelse''end)N'表名',
a.colorderN'字段序号',a.nameN'字段名',(casewhenCOLUMNPROPERTY(a.id,a.name,'IsIdentity')=1then'√'else''end)N'标识',(casewhen(SELECTcount(*)FROMsysobjectsWHERE(namein(SELECTnameFROMsysindexesWHERE(id=a.id)AND(indidin(SELECTindidFROMsysindexkeysWHERE(id=a.id)AND(colidin(SELECTcolidFROMsyscolumnsWHERE(id=a.id)AND(name=a.name)))))))AND(xtype='PK'))>0then'√'else''end)N'主键',b.nameN'类型',a.lengthN'占用字节数',COLUMNPROPERTY(a.id,a.name,'PRECISION')asN'长度',isnull(COLUMNPROPERTY(a.id,a.name,
'Scale'),0)asN'小数位数',(casewhena.isnullable=1then'√'else''end)N'允许空',isnull(e.text,'')N'默认值',isnull(g.[value],'')ASN'字段说明'--into##tx
FROMsyscolumnsaleftjoinsystypesbona.xtype=b.xusertypeinnerjoinsysobjectsdona.id=d.idandd.xtype='U'andd.name<>'dtproperties'leftjoinsyscommentseona.cdefault=e.idleftjoinsyspropertiesgona.id=g.idANDa.colid=g.smallidorderbyobject_name(a.id),a.colorder
六、时间格式转换问题因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过convert函数和case语句,还有"+"操作符在不同上下文环境也会起到不同的作用,把我搞晕了要,不过现在看来是差不多弄好了。1、把所有"70.07.06"这样的值变成"1970-07-06"UPDATElvshiSETshengri='19'+REPLACE(shengri,'.','-')WHERE(zhiyezheng='139770070153')
2、在"1970-07-06"里提取"70","07","06"SELECTSUBSTRING(shengri,3,2)ASyear,SUBSTRING(shengri,6,2)ASmonth,SUBSTRING(shengri,9,2)ASdayFROMlvshiWHERE(zhiyezheng='139770070153')
3、把一个时间类型字段转换成"1970-07-06"UPDATElvshiSETshenling=CONVERT(varchar(4),YEAR(shenling))+''+CASEWHENLEN(MONTH(shenling))=1THEN'0'+CONVERT(varchar(2),month(shenling))ELSECONVERT(varchar(2),month(shenling))END+''+CASEWHENLEN(day(shenling))=1THEN'0'+CONVERT(char(2),day(shenling))ELSECONVERT(varchar(2),day(shenling))ENDWHERE(zhiyezheng='139770070153')
七、分区视图分区视图是提高查询性能的一个很好的办法--看下面的示例
--示例表createtabletempdb.dbo.t_10(idintprimarykeycheck(idbetween1and10),namevarchar(10))
createtablepubs.dbo.t_20(idintprimarykeycheck(idbetween11and20),namevarchar(10))
createtablenorthwind.dbo.t_30(idintprimarykeycheck(idbetween21and30),namevarchar(10))go--分区视图createviewv_tasselect*fromtempdb.dbo.t_10unionallselect*frompubs.dbo.t_20unionallselect*fromnorthwind.dbo.t_30go--插入数据insertv_tselect1,'aa'unionallselect2,'bb'unionallselect11,'cc'unionallselect12,'dd'unionallselect21,'ee'unionallselect22,'ff'--更新数据updatev_tsetname=name+'_更新'whereright(id,1)=1
--删除测试deletefromv_twhereright(id,1)=2--显示结果select*fromv_tgo--删除测试droptablenorthwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10dropviewv_t/**//*--测试结果
id11121
nameaa_更新cc_更新ee_更新
---------------------
(所影响的行数为3行)==*/
八、树型的实现
--参考
--树形数据查询示例--作者:邹建
--示例数据createtable[tb]([id]intidentity(1,1),[pid]int,namevarchar(20))insert[tb]select0,'中国'unionallselect0,'美国'unionallselect0,'加拿大'unionallselect1,'北京
'unionallselect1,'上海'unionallselect1,'江苏'unionallselect6,'苏州'unionallselect7,'常熟'unionallselect6,'南京'unionallselect6,'无锡'unionallselect2,'纽约'unionallselect2,'旧金山'go--查询指定id的所有子createfunctionf_cid(@idint)returns@retable([id]int,[level]int)
asbegindeclare@lintset@l=0insert@reselect@id,@lwhile@@rowcount>0beginset@l=@l+1insert@reselecta.[id],@lfrom[tb]a,@rebwherea.[pid]=b.[id]andb.[level]=@l-1end/**//**//**//*--如果只显示最明细的子(下面没有子),则加上这个删除deleteafrom@reawhereexists(select1from[tb]where[pid]=a.[id])--*/returnendgo--调用(查询所有的子)selecta.*,层次=b.[level]from[tb]a,f_cid(2)bwherea.[id]=b.[id]go--删除测试droptable[tb]dropfunctionf_cidgo
九、排序问题CREATETABLE[t]([id][int]IDENTITY(1,1)NOTNULL,[GUID][uniqueidentifier]NULL)ON[PRIMARY]GO
下面这句执行5次inserttvalues(newid())
查看执行结果select*fromt
1、第一种select*fromtorderbycaseidwhen4then1when5then2when1then3when2then4when3then5end
2、第二种select*fromtorderby(id+2)%6
3、第三种select*fromtorderbycharindex(cast(idasvarchar),'45123')
4、第四种select*fromtWHEREidbetween0and5orderbycharindex(cast(idasvarchar),'45123')
5、第五种select*fromtorderbycasewhenid>3thenid-5elseidend
6、第六种select*fromtorderbyid/4desc,idasc
十、一条语句删除一批记录首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你
不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删除了,比循环用多条语句高效吧应该。deletefrom[fujian]wherecharindex(','+cast([id]asvarchar)+',',','+'5,6,8,9,10,11,'+',')>0
还有一种就是deletefromtable1whereidin(1,2,3,4)
十一、获取子表内的一列数据的组合字符串下面这个函数获取05年已经注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的所有律师。CREATEFUNCTIONfn_Get05LvshiNameBySuo(@p_suoNvarchar(50))
RETURNSNvarchar(2000)ASBEGINDECLARE@LvshiNamesvarchar(2000),@namevarchar(50)select@LvshiNames=''DECLARElvshi_cursorCURSORFOR数据库里有1,2,3,4,5共5条记录,要用一条sql语句让其排序,使它排列成4,5,1,2,3,怎么写?--数据操作
SELECT--从数据库表中检索数据行和列INSERT--向数据库表添加新数据行DELETE--从数据库表中删除数据行UPDATE--更新数据库表中的数据
--数据定义
CREATETABLE--创建一个数据库表D
ROPTABLE--从数据库中删除表ALTERTABLE--修改数据库表结构CREATEVIEW--创建一个视图DROPVIEW--从数据库中删除视图CREATEINDEX--为数据库表创建一个索引DROPINDEX--从数据库中删除索引
CREATEPROCEDURE--创建一个存储过程DROPPROCEDURE--从数据库中删除存储过程CREATETRIGGER--创建一个触发器DROPTRIGGER--从数据库中删除触发器CREATESCHEMA--向数据库添加一个新模式DROPSCHEMA--从数据库中删除一个模式CREATEDOMAIN--创建一个数据值域ALTERDOMAIN--改变域定义DROPDOMAIN--从数据库中删除一个域
--数据控制
GRANT--授予用户访问权限DENY--拒绝用户访问REVOKE--解除用户访问权限
--事务控制
COMMIT--结束当前事务ROLLBACK--中止当前事务SETTRANSACTION--定义当前事务数据访问特征
--程序化SQL
DECLARE--为查询设定游标EXPLAN--为查询描述数据访问计划OPEN--检索查询结果打开一个游标FETCH--检索一行查询结果CLOSE--关闭游标PREPARE--为动态执行准备SQL语句EXECUTE--动态地执行SQL语句DESCRIBE--描述准备好的查询
---局部变量
declare@idchar(10)--set@id='10010001'select@id='10010001'
---全局变量
---必须以@@开头
--IFELSE
declare@xint@yint@zintselect@x=1@y=2@z=3if@x>@yprint'x>y'--打印字符串'x>y'elseif@y>@zprint'y>z'elseprint'z>y'--CASEusepanguupdateemployeesete_wage=casewhenjob_level=’1’thene_wage*1.08whenjob_level=’2’thene_wage*1.07whenjob_level=’3’thene_wage*1.06elsee_wage*1.05end--WHILECONTINUEBREAKdeclare@xint@yint@cintselect@x=1@y=1while@x<3beginprint@x--打印变量x的值while@y<3beginselect@c=100*@x+@yprint@c--打印变量c的值select@y=@y+1endselect@x=@x+1select@y=1
end--WAITFOR--例等待1小时2分零3秒后才执行SELECT语句
waitfordelay’01:02:03’select*fromemployee--例等到晚上11点零8分后才执行SELECT语句
waitfortime’23:08:00’
SELECTselect*(列名)fromtable_name(表名)wherecolumn_nameoperatorvalueex宿主)select*fromstock_informationwherestockid=str(nid)stockname='str_name'stocknamelike'%findthis%'stocknamelike'[a-zA-Z]%'---------([]指定值的范围)stocknamelike'[^F-M]%'---------(^排除指定范围)---------只能在使用like关键字的where子句中使用通配符)orstockpath='stock_path'orstocknumber<1000andstockindex=24notstocksex='man'stocknumberbetween20and100stocknumberin(10,20,30)orderbystockiddesc(asc)---------排序,desc-降序,asc-升序orderby1,2---------by列号stockname=(selectstocknamefromstock_informationwherestockid=4)---------子查询---------除非能确保内层select只返回一个行的值---------否则应在外层where子句中
用一个in限定符selectdistinctcolumn_nameformtable_name---------distinct指定检索独有的列值,不重复
selectstocknumber,"stocknumber+10"=stocknumber+10fromtable_nameselectstockname,"stocknumber"=count(*)fromtable_namegroupbystockname---------groupby将表按行分组,指定列中有相同的值havingcount(*)=2---------having选定指定的组
select*fromtable1,table2wheretable1.id*=table2.id--------左外部连接,table1中有的而table2中没有得以null表示table1.id=*table2.id--------右外部连接selectstocknamefromtable1union[all]--------union合并查询结果集,all-保留重复行selectstocknamefromtable2
insert
insertintotable_name(Stock_name,Stock_number)value("xxx","xxxx"value(selectStockname,StocknumberfromStock_table2)-------value为select语句
update
updatetable_namesetStockname="xxx"[whereStockid=3]Stockname=defaultStockname=nullStocknumber=Stockname+4
delete
deletefromtable_namewhereStockid=3truncatetable_name---------删除表中所有行,仍保持表的完整性droptabletable_name---------完全删除表
altertable--------修改数据库表结构
altertabledatabase.owner.table_nameaddcolumn_namechar(2)null..
sp_helptable_name--------显示表已有特征createtabletable_name(namechar(20),agesmallint,lnamevarchar(30))insertintotable_nameselect--------实现删除列的方法(创建新表)altertabletable_namedropconstraintStockname_default---------删除Stockname的default约束
常用函数(function)
转换函数
convert(数据类型,值,格式)
统计函数
AVG--求平均值COUNT--统计数目MAX--求最大值MIN--求最小值SUM--求和
AVG
usepanguselectavg(e_wage)asdept_avgWagefromemployeegroupbydept_id
MAX--求工资最高的员工usepanguselecte_namefromemployeewheree_wage=
(selectmax(e_wage)fromemployee)
STDEV()--STDEV()函数返回表达式中所有数据的标准差--STDEVP()--STDEVP()函数返回总体标准差
VAR()--VAR()函数返回表达式中所有值的统计变异数
VARP()--VARP()函数返回总体变异数
算术函数
三角函数
SIN(float_expression)--返回以弧度表示的角的正弦COS(float_expression)--返回以弧度表示的角的余弦TAN(float_expression)--返回以弧度表示的角的正切COT(float_expression)--返回以弧度表示的角的余切
反三角函数
ASIN(float_expression)--返回正弦是FLOAT值的以弧度表示的角ACOS(float_expression)--返回余弦是FLOAT值的以弧度表示的角ATAN(float_expression)--返回正切是FLOAT值的以弧度表示的角ATAN2(float_expression1,float_expression2)------返回正切是float_expression1/float_expres-sion2的以弧度表示的角DEGREES(numeric_expression)------把弧度转换为角度返回与表达式相同的数据类型可为------INT
EGER/MONEY/REAL/FLOAT类型RADIANS(numeric_expression)------把角度转换为弧度返回与表达式相同的数据类型可为
------INTEGER/MONEY/REAL/FLOAT类型EXP(float_expression)--返回表达式的指数值LOG(float_expression)--返回表达式的自然对数值LOG10(float_expression)--返回表达式的以10为底的对数值SQRT(float_expression)--返回表达式的平方根
取近似值函数
CEILING(numeric_expression)-------返回>=表达式的最小整数返回的数据类型与表达式相同可为-------INTEGER/MONEY/REAL/FLOAT类型FLOOR(numeric_expression)-------返回<=表达式的最小整数返回的数据类型与表达式相同可为-------INTEGER/MONEY/REAL/FLOAT类型ROUND(numeric_expression)-------返回以integer_expression为精度的四舍五入值返回的数据-------类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型ABS(numeric_expression)-------返回表达式的绝对值返回的数据类型与表达式相同可为-------INTEGER/MONEY/REAL/FLOAT类型SIGN(numeric_expression)-------测试参数的正负号返回0零值1正数或-1负数返回的数据类型-------与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型PI()-------返回值为π即3.1415926535897936RAND([integer_expression])-------用任选的[integer_expression]做种子值得出0-1间的随机浮点数
字符串函数
ASCII()------函数返回字符表达式最左端字符的ASCII码值CHAR()------函数用于将ASCII码转换为字符------如果没有输入0~255之间的ASCII码值CHAR函数会返回一个NULL值LOWER()------函数把字符串全部转换为小写UPPER()------函数把字符串全部转换为大写STR()------函数把数值型数据转换为字符型数据LTRIM()------函数把字符串头部的空格去掉
RTRIM()------函数把字符串尾部的空格去掉LEFT(),RIGHT(),SUBSTRING()--函数返回部分字符串CHARINDEX(),PATINDEX()--函数返回字符串中某个指定的子串出现的开始位置SOUNDEX()------函数返回一个四位字符码------SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0值DIFFERENCE()------函数返回由SOUNDEX函数返回的两个字符表达式的值的差异------0两个SOUNDEX函数返回值的第一个字符不同------1两个SOUNDEX函数返回值的第一个字符相同------2两个SOUNDEX函数返回值的第一二个字符相同------3两个SOUNDEX函数返回值的第一二三个字符相同------4两个SOUNDEX函数返回值完全相同同QUOTENAME()------函数返回被特定字符括起来的字符串
/**//*selectquotename('abc','{')quotename('abc')运行结果如下
{{abc}[abc]*/REPLICATE()------函数返回一个重复character_expression指定次数的字符串/**//*selectreplicate('abc',3)replicate('abc',-2)
运行结果如下
abcabcabcNULL*/REVERSE()------函数将指定的
字符串的字符排列顺序颠倒REPLACE()------函数返回被替换了指定子串的字符串/**//*selectreplace('abc123g','123','def')
运行结果如下
abcdefg*/SPACE()------函数返回一个有指定长度的空白字符串STUFF()------函数用另一子串替换字符串指定位置长度的子串
数据类型转换函数
CAST()函数语法如下CAST()(AS[length])CONVERT()函数语法如下CONVERT()([length],[,style])selectcast(100+99aschar)convert(varchar(12),getdate())
运行结果如下199Jan152000
日期函数
DAY()------函数返回date_expression中的日期值MONTH()------函数返回date_expression中的月份值YEAR()------函数返回date_expression中的年份值DATEADD(,,)-----函数返回指定日期date加上指定的额外日期间隔number产生的新日期DATEDIFF(,,)-----函数返回两个指定日期在datepart方面的不同之处
DATENAME(,------函数以字符串的形式返回日期的指定部分DATEPART(,------函数以整数值的形式返回日期的指定部分GETDATE()------函数以DATETIME的缺省格式返回系统当前的日期和时间
系统函数
APP_NAME()------函数返回当前执行的应用程序的名称COALESCE()-----函数返回众多表达式中第一个非NULL表达式的值COL_LENGTH(<'table_name'>,<'column_name'>----函数返回表中指定字段的长度值COL_NAME(,----函数返回表中指定字段的名称即列名DATALENGTH()-----函数返回数据表达式的数据的实际长度DB_ID(['database_name'])------函数返回数据库的编号DB_NAME(database_id)------函数返回数据库的名称HOST_ID()-----函数返回服务器端计算机的名称HOST_NAME()-----函数返回服务器端计算机的名称IDENTITY([,seedincrement])[AScolumn_name])--IDENTITY()函数只在SELECTINTO语句中使用用于插入一个identitycolumn列到新表中
/**//*selectidentity(int,1,1)ascolumn_nameintonewtablefromoldtable*/ISDATE()----函数判断所给定的表达式是否为合理日期ISNULL(,--函数将表达式中的NULL值用指定值替换ISNUMERIC()----函数判断所给定的表达式是否为合理的数值NEWID()----函数返回一个UNIQUEIDENTIFIER类型的数值NULLIF(,----NULLIF函数在expression1与expression2相等时返回NULL值若不相等时则返回xpression1的值*******************Transact_SQL********************--语句--数据操作SELECTINSERTDELETEUPDATE--数据定义CREATETABLEDROPTABLEALTERTABLECREATEVIEWDROPVIEWCREATEINDEXDROPINDEX--创建一个数据库表--从数据库中删除表--修改数据库表结构--创建一个视图--从数据库中删除视图--为数据库表创建一个索引--从数据库中删除索引--创建一个存储过程--从数据库中删除存储过程--创建一个触发器--从数据库中删除触发器--向数据库添加一个新模式--从数据库中
删除一个模式--创建一个数据值域--改变域定义--从数据库中删除一个域--从数据库表中检索数据行和列--向数据库表添加新数据行--从数据库表中删除数据行--更新数据库表中的数据
功能
CREATEPROCEDUREDROPPROCEDURECREATETRIGGERDROPTRIGGERCREATESCHEMADROPSCHEMACREATEDOMAINALTERDOMAINDROPDOMAIN--数据控制GRANT
--授予用户访问权限
DENYREVOKE
--拒绝用户访问--解除用户访问权限
--事务控制COMMITROLLBACK--结束当前事务--中止当前事务--定义当前事务数据访问特征
SETTRANSACTION--程序化SQLDECLAREEXPLANOPENFETCHCLOSEPREPAREEXECUTEDESCRIBE
--为查询设定游标--为查询描述数据访问计划--检索查询结果打开一个游标--检索一行查询结果--关闭游标--为动态执行准备SQL语句--动态地执行SQL语句--描述准备好的查询
---局部变量declare@idchar(10)--set@id='10010001'select@id='10010001'---全局变量---必须以@@开头
--IFELSEdeclare@xint@yint@zintselect@x=1@y=2@z=3if@x>@yprint'x>y'--打印字符串'x>y'elseif@y>@zprint'y>z'elseprint'z>y'
--CASEusepanguupdateemployeesete_wage=case
whenjob_level=’1’thene_wage*1.08whenjob_level=’2’thene_wage*1.07whenjob_level=’3’thene_wage*1.06elsee_wage*1.05end
--WHILECONTINUEBREAKdeclare@xint@yint@cintselect@x=1@y=1while@x<3beginprint@x--打印变量x的值while@y<3beginselect@c=100*@x+@yprint@c--打印变量c的值select@y=@y+1endselect@x=@x+1select@y=1end
--WAITFOR--例等待1小时2分零3秒后才执行SELECT语句waitfordelay’01:02:03’select*fromemployee--例等到晚上11点零8分后才执行SELECT语句waitfortime’23:08:00’select*fromemployee
***SELECT***select*(列名)fromtable_name(表名)wherecolumn_nameoperatorvalueex:(宿主)select*fromstock_informationwherestockidstockname='str_name'=str(nid)
stocknamelike'%findthis%'stocknamelike'[a-zA-Z]%'---------([]指定值的范围)stocknamelike'[^F-M]%'---------(^排除指定范围)
---------只能在使用like关键字的where子句中使用通配符)orstockpath='stock_path'orstocknumber<1000andstockindex=24notstocksex='man'stocknumberbetween20and100stocknumberin(10,20,30)orderbystockiddesc(asc)---------排序,desc-降序,asc-升序orderby1,2---------by列号stockname=(selectstocknamefromstock_informationwherestockid=4)---------子查询---------除非能确保内层select只返回一个行的值,---------否则应在外层where子句中用一个in限定符selectdistinctcolumn_nameformtable_name---------distinct指定检索独有的列值,不重复selectstocknumber,"stocknumber+10"=stocknumber+10fromtable_nameselectstockname,"stocknu
mber"=count(*)fromtable_namegroupbystockname---------groupby将表按行分组,指定列中有相同的值havingcount(*)=2---------having选定指定的组
select*fromtable1,table2wheretable1.id*=table2.id--------左外部连接,table1中有的而table2中没有得以null表示table1.id=*table2.id--------右外部连接
selectstocknamefromtable1union[all]-----union合并查询结果集,all-保留重复行selectstocknamefromtable2
***insert***
insertintotable_name(Stock_name,Stock_number)value("xxx","xxxx")
value(selectStockname,StocknumberfromStock_table2)---value为select语句
***update***
updatetable_namesetStockname="xxx"[whereStockid=3]Stockname=defaultStockname=nullStocknumber=Stockname+4
***delete***
deletefromtable_namewhereStockid=3truncatetable_name-----------删除表中所有行,仍保持表的完整性droptabletable_name---------------完全删除表
***altertable***---修改数据库表结构
altertabledatabase.owner.table_nameaddcolumn_namechar(2)nullsp_helptable_name----显示表已有特征
..
createtabletable_name(namechar(20),agesmallint,lnamevarchar(30))insertintotable_nameselect的default约束-----实现删除列的方法(创建新表)altertabletable_namedropconstraintStockname_default----删除Stockname
***function(/*常用函数*/)***
----统计函数---AVG--求平均值--统计数目--求最大值--求最小值--求和
COUNTMAXMINSUM
--AVGusepanguselectavg(e_wage)asdept_avgWagefromemployee
groupbydept_id
--MAX--求工资最高的员工usepanguselecte_namefromemployeewheree_wage=(selectmax(e_wage)fromemployee)
--STDEV()--STDEV()函数返回表达式中所有数据的标准差
--STDEVP()--STDEVP()函数返回总体标准差
--VAR()--VAR()函数返回表达式中所有值的统计变异数
--VARP()--VARP()函数返回总体变异数
----算术函数----
/***三角函数***/SIN(float_expression)--返回以弧度表示的角的正弦COS(float_expression)--返回以弧度表示的角的余弦TAN(float_expression)--返回以弧度表示的角的正切COT(float_expression)--返回以弧度表示的角的余切/***反三角函数***/ASIN(float_expression)--返回正弦是FLOAT值的以弧度表示的角ACOS(float_expression)--返回余弦是FLOAT值的以弧度表示的角ATAN(float_expression)--返回正切是FLOAT值的以弧度表示的角ATAN2(float_expression1,float_expression2)--返回正切是float_expression1/float_expres-sion2的以弧度表示的角DEGREES(numeric_expression)--把弧度转换为角度返回与表达式相同的数据类型可为
--INTEGER/MONEY/REAL/FLOAT类型RADIANS(numeric_expression)--把角度转换为弧度返回与表达式相同的数据类型可为--INTEGER/MONEY/REAL/FLOAT类型EXP(float_expression)--返回表达式的指数值LOG(float_expre
ssion)--返回表达式的自然对数值LOG10(float_expression)--返回表达式的以10为底的对数值SQRT(float_expression)--返回表达式的平方根/***取近似值函数***/CEILING(numeric_expression)--返回>=表达式的最小整数返回的数据类型与表达式相同可为--INTEGER/MONEY/REAL/FLOAT类型FLOOR(numeric_expression)同可为--INTEGER/MONEY/REAL/FLOAT类型ROUND(numeric_expression)回的数据--类型与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型ABS(numeric_expression)--返回表达式的绝对值返回的数据类型与表达式相同可为--返回以integer_expression为精度的四舍五入值返--返回<=表达式的最小整数返回的数据类型与表达式相
--INTEGER/MONEY/REAL/FLOAT类型SIGN(numeric_expression)数据类型--与表达式相同可为INTEGER/MONEY/REAL/FLOAT类型PI()--返回值为π即3.1415926535897936--用任选的[integer_expression]做种子值得出0-1间--测试参数的正负号返回0零值1正数或-1负数返回的
RAND([integer_expression])的随机浮点数
----字符串函数---ASCII()CHAR()--函数返回字符表达式最左端字符的ASCII码值--函数用于将ASCII码转换为字符
--如果没有输入0~255之间的ASCII码值CHAR函数会返回一个NULL值LOWER()UPPER()STR()--函数把字符串全部转换为小写--函数把字符串全部转换为大写
--函数把数值型数据转换为字符型数据--函数把字符串头部的空格去掉--函数把字符串尾部的空格去掉
LTRIM()RTRIM()
LEFT(),RIGHT(),SUBSTRING()--函数返回部分字符串CHARINDEX(),PATINDEX()--函数返回字符串中某个指定的子串出现的开始位置
SOUNDEX()--函数返回一个四位字符码--SOUNDEX函数可用来查找声音相似的字符串但SOUNDEX函数对数字和汉字均只返回0值DIFFERENCE()--函数返回由SOUNDEX函数返回的两个字符表达式的值的差异
--0两个SOUNDEX函数返回值的第一个字符不同--1两个SOUNDEX函数返回值的第一个字符相同--2两个SOUNDEX函数返回值的第一二个字符相同--3两个SOUNDEX函数返回值的第一二三个字符相同--4两个SOUNDEX函数返回值完全相同
QUOTENAME()--函数返回被特定字符括起来的字符串/*selectquotename('abc','{')quotename('abc')运行结果如下----------------------------------{{abc}[abc]*/REPLICATE()--函数返回一个重复character_expression指定次数的字符串
/*selectreplicate('abc',3)replicate('abc',-2)运行结果如下---------------------abcabcabcNULL*/REVERSE()REPLACE()--函数将指定的字符串的字符排列顺序颠倒--函数返回被替换了指定子串的字符串
/*selectreplace('abc123g','123','def')运行结果如下---------------------abcdefg*/SPACE()STUFF()--函数返回一个有指定长度的空白字符串--函数用另一子串替换字符串指定位置
长度的子串
----数据类型转换函数---CAST()函数语法如下CAST()(
AS[length])CONVERT()函数语法如下
CONVERT()([length],[,style])
selectcast(100+99aschar)convert(varchar(12),getdate())运行结果如下-----------------------------------------199Jan152000
----日期函数---DAY()--函数返回date_expression中的日期值--函数返回date_expression中的月份值
MONTH()YEAR()
--函数返回date_expression中的年份值
DATEADD(,,)--函数返回指定日期date加上指定的额外日期间隔number产生的新日期DATEDIFF(,,)--函数返回两个指定日期在datepart方面的不同之处DATENAME(,)--函数以字符串的形式返回日期的指定部分DATEPART(,)--函数以整数值的形式返回日期的指定部分GETDATE()--函数以DATETIME的缺省格式返回系统当前的日期和时间
----系统函数---APP_NAME()--函数返回当前执行的应用程序的名称
COALESCE()--函数返回众多表达式中第一个非NULL表达式的值COL_LENGTH(<'table_name'>,<'column_name'>)--函数返回表中指定字段的长度值COL_NAME(,)--函数返回表中指定字段的名称即列名
DATALENGTH()--函数返回数据表达式的数据的实际长度DB_ID(['database_name'])--函数返回数据库的编号DB_NAME(database_id)--函数返回数据库的名称HOST_ID()HOST_NAME()--函数返回服务器端计算机的名称--函数返回服务器端计算机的名称
IDENTITY([,seedincrement])[AScolumn_name])--IDENTITY()函数只在SELECTINTO语句中使用用于插入一个identitycolumn列到新表中/*selectidentity(int,1,1)ascolumn_nameintonewtablefromoldtable*/ISDATE()--函数判断所给定的表达式是否为合理日期ISNULL(,)--函数将表达式中的NULL值
用指定值替换ISNUMERIC()--函数判断所给定的表达式是否为合理的数值NEWID()--函数返回一个UNIQUEIDENTIFIER类型的数值
NULLIF(,)--NULLIF函数在expression1与expression2相等时返回NULL值若不相等时则返回expression1的值