设为首页 收藏本站
查看: 1162|回复: 0

[经验分享] 一些t-sql技巧

[复制链接]

尚未签到

发表于 2016-11-12 05:27:07 | 显示全部楼层 |阅读模式
  一、只复制一个表结构,不复制数据
DSC0000.gif selecttop0*into[t1]from[t2]

  
二、获取数据库中某个对象的创建脚本
  1、先用下面的脚本创建一个函数

ifexists(select1fromsysobjectswhereid=object_id('fgetscript')andobjectproperty(id,'IsInlineFunction')=0)
dropfunctionfgetscript
go

createfunctionfgetscript(
@servernamevarchar(50)--服务器名
,@useridvarchar(50)='sa'--用户名,如果为nt验证方式,则为空
,@passwordvarchar(50)=''--密码
,@databasenamevarchar(50)--数据库名称
,@objectnamevarchar(250)--对象名

)
returnsvarchar(8000)
as
begin
declare@revarchar(8000)--返回脚本
declare@srvidint,@dbsidint--定义服务器、数据库集id
declare@dbidint,@tbidint--数据库、表id
declare@errint,@srcvarchar(255),@descvarchar(255)--错误处理变量

--创建sqldmo对象
exec@err=sp_oacreate'sqldmo.sqlserver',@srvidoutput
if@err<>0gotolberr

--连接服务器
ifisnull(@userid,'')=''--如果是Nt验证方式
begin
exec@err=sp_oasetproperty@srvid,'loginsecure',1
if@err<>0gotolberr

exec@err=sp_oamethod@srvid,'connect',null,@servername
end
else
exec@err=sp_oamethod@srvid,'connect',null,@servername,@userid,@password

if@err<>0gotolberr

--获取数据库集
exec@err=sp_oagetproperty@srvid,'databases',@dbsidoutput
if@err<>0gotolberr

--获取要取得脚本的数据库id
exec@err=sp_oamethod@dbsid,'item',@dbidoutput,@databasename
if@err<>0gotolberr

--获取要取得脚本的对象id
exec@err=sp_oamethod@dbid,'getobjectbyname',@tbidoutput,@objectname
if@err<>0gotolberr

--取得脚本
exec@err=sp_oamethod@tbid,'script',@reoutput
if@err<>0gotolberr

--print@re
return(@re)

lberr:
execsp_oageterrorinfoNULL,@srcout,@descout
declare@errbvarbinary(4)
set@errb=cast(@errasvarbinary(4))
execmaster..xp_varbintohexstr@errb,@reout
set@re='错误号:'+@re
+char(13)+'错误源:'+@src
+char(13)+'错误描述:'+@desc
return(@re)
end
go



  2、用法如下
用法如下,
printdbo.fgetscript('服务器名','用户名','密码','数据库名','表名或其它对象名')


  3、如果要获取库里所有对象的脚本,如如下方式

declare@namevarchar(250)
declare#aacursorfor
selectnamefromsysobjectswherextypenotin('S','PK','D','X','L')
open#aa
fetchnextfrom#aainto@name
while@@fetch_status=0
begin
printdbo.fgetscript('onlytiancai','sa','sa','database',@name)
fetchnextfrom#aainto@name
end
close#aa
deallocate#aa


  4、声明,此函数是csdn邹建邹老大提供的
三、分隔字符串
如果有一个用逗号分割开的字符串,比如说"a,b,c,d,1,2,3,4",如何用t-sql获取这个字符串有几个元素,获取第几个元素的值是多少呢?因为t-sql里没有split函数,也没有数组的概念,所以只能自己写几个函数了。
1、获取元素个数的函数

createfunctiongetstrarrlength(@strvarchar(8000))
returnsint
as
begin
declare@int_returnint
declare@startint
declare@nextint
declare@locationint
select@str=','+@str+','
select@str=replace(@str,',,',',')
select@start=1
select@next=1
select@location=charindex(',',@str,@start)
while(@location<>0)
begin
select@start=@location+1
select@location=charindex(',',@str,@start)
select@next=@next+1
end
select@int_return=@next-2
return@int_return
end


  2、获取指定索引的值的函数

createfunctiongetstrofindex(@strvarchar(8000),@indexint=0)
returnsvarchar(8000)
as
begin
declare@str_returnvarchar(8000)
declare@startint
declare@nextint
declare@locationint
select@start=1
select@next=1--如果习惯从0开始则select@next=0
select@location=charindex(',',@str,@start)
while(@location<>0and@index>@next)
begin
select@start=@location+1
select@location=charindex(',',@str,@start)
select@next=@next+1
end
if@location=0select@location=len(@str)+1--如果是因为没有逗号退出,则认为逗号在字符串后
select@str_return=substring(@str,@start,@location-@start)--@start肯定是逗号之后的位置或者就是初始值1
if(@index<>@next)select@str_return=''--如果二者不相等,则是因为逗号太少,或者@index小于@next的初始值1。
return@str_return
end


  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


  五、怎样获取一个表中所有的字段信息
蛙蛙推荐:怎样获取一个表中所有字段的信息
先创建一个视图

Createviewfielddesc
as
selecto.nameastable_name,c.nameasfield_name,t.nameastype,c.lengthas

length,c.isnullable
asisnullable,convert(varchar(30),p.value)asdesp
fromsyscolumnsc
joinsystypestonc.xtype=t.xusertype
joinsysobjectsoono.id=c.id
leftjoinsyspropertiesponp.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(*)
FROMsysobjects
WHERE(namein
(
SELECTname
FROMsysindexes
WHERE(id=a.id)AND(indidin
(
SELECTindid
FROMsysindexkeys
WHERE(id=a.id)AND(colidin
(
SELECTcolid
FROMsyscolumns
WHERE(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

FROMsyscolumnsaleftjoinsystypesb
ona.xtype=b.xusertype
innerjoinsysobjectsd
ona.id=d.idandd.xtype='U'andd.name<>'dtproperties'
leftjoinsyscommentse
ona.cdefault=e.id
leftjoinsyspropertiesg
ona.id=g.idANDa.colid=g.smallid
orderbyobject_name(a.id),a.colorder



  六、时间格式转换问题
因为新开发的软件需要用一些旧软件生成的一些数据,在时间格式上不统一,只能手工转换,研究了一下午写了三条语句,以前没怎么用过convert函数和case语句,还有"+"操作符在不同上下文环境也会起到不同的作用,把我搞晕了要,不过现在看来是差不多弄好了。
  1、把所有"70.07.06"这样的值变成"1970-07-06"

UPDATElvshi
SETshengri='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)ASday
FROMlvshi
WHERE(zhiyezheng='139770070153')


  3、把一个时间类型字段转换成"1970-07-06"

UPDATElvshi
SETshenling=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))END
WHERE(zhiyezheng='139770070153')


  七、分区视图
分区视图是提高查询性能的一个很好的办法

--看下面的示例

--示例表
createtabletempdb.dbo.t_10(
id
intprimarykeycheck(idbetween1and10),namevarchar(10))

createtablepubs.dbo.t_20(
id
intprimarykeycheck(idbetween11and20),namevarchar(10))

createtablenorthwind.dbo.t_30(
id
intprimarykeycheck(idbetween21and30),namevarchar(10))
go

--分区视图
createviewv_t
as
select*fromtempdb.dbo.t_10
unionall
select*frompubs.dbo.t_20
unionall
select*fromnorthwind.dbo.t_30
go

--插入数据
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_t
go

--删除测试
droptablenorthwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
dropviewv_t

DSC0001.gif DSC0002.gif
/**//*--测试结果
DSC0003.gif
idname
---------------------
1aa_更新
11cc_更新
21ee_更新

(所影响的行数为3行)
DSC0004.gif ==
*/


  
八、树型的实现

--参考

--树形数据查询示例
--
作者:邹建

--示例数据
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)
as
begin
declare@lint
set@l=0
insert@reselect@id,@l
while@@rowcount>0
begin
set@l=@l+1
insert@reselecta.[id],@l
from[tb]a,@reb
wherea.[pid]=b.[id]andb.[level]=@l-1
end
/**//**//**//*--如果只显示最明细的子(下面没有子),则加上这个删除
deleteafrom@rea
whereexists(
select1from[tb]where[pid]=a.[id])
--
*/
return
end
go

--调用(查询所有的子)
selecta.*,层次=b.[level]from[tb]a,f_cid(2)bwherea.[id]=b.[id]
go

--删除测试
droptable[tb]
dropfunctionf_cid
go



  九、排序问题
CREATETABLE[t](
[id][int]IDENTITY(1,1)NOTNULL,
[GUID][uniqueidentifier]NULL
)
ON[PRIMARY]
GO

  
下面这句执行5次

inserttvalues(newid())

  
查看执行结果

select*fromt

  
1、第一种

select*fromt
orderbycaseidwhen4then1
when5then2
when1then3
when2then4
when3then5end

  
2、第二种

select*fromtorderby(id+2)%6

  
3、第三种

select*fromtorderbycharindex(cast(idasvarchar),'45123')

  
4、第四种

select*fromt
WHEREidbetween0and5
orderbycharindex(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 DSC0005.gif )

  
十一、获取子表内的一列数据的组合字符串
下面这个函数获取05年已经注册了的某个所的律师,唯一一个参数就是事务所的名称,然后返回zhuce字段里包含05字样的所有律师。

CREATEFUNCTIONfn_Get05LvshiNameBySuo(@p_suoNvarchar(50))
RETURNSNvarchar(2000)
AS
BEGIN
DECLARE@LvshiNamesvarchar(2000),@namevarchar(50)
select@LvshiNames=''
DECLARElvshi_cursorCURSORFOR


数据库里有1,2,3,4,5 共5条记录,要用一条sql语句让其排序,使它排列成4,5,1,2,3,怎么写?
DSC0006.gif   --数据操作

  
SELECT--从数据库表中检索数据行和列
      INSERT--向数据库表添加新数据行
      DELETE--从数据库表中删除数据行
      UPDATE--更新数据库表中的数据

  
--数据定义

  
CREATETABLE--创建一个数据库表
      DROPTABLE--从数据库中删除表
      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@zint
      
select@x=1@y=2@z=3
      
if@x>@y
      
print'x>y'--打印字符串'x>y'
      elseif@y>@z
      
print'y>z'
      
elseprint'z>y'
      
--CASE
      usepangu
      
updateemployee
      
sete_wage=
      
case
      
whenjob_level=1thene_wage*1.08
      
whenjob_level=2thene_wage*1.07
      
whenjob_level=3thene_wage*1.06
      
elsee_wage*1.05
      
end
      
--WHILECONTINUEBREAK
      declare@xint@yint@cint
      
select@x=1@y=1
      
while@x<3
      
begin
      
print@x--打印变量x的值
      while@y<3
      
begin
      
select@c=100*@x+@y
      
print@c--打印变量c的值
      select@y=@y+1
      
end
      
select@x=@x+1
      
select@y=1
      
end
      
--WAITFOR

  
--例等待1小时2分零3秒后才执行SELECT语句

  
waitfordelay’01:02:03
      
select*fromemployee

    
--例等到晚上11点零8分后才执行SELECT语句

    
waitfortime’23:08:00


SELECT  

  
select*(列名)fromtable_name(表名)wherecolumn_nameoperatorvalueex宿主)
    
select*fromstock_informationwherestockid=str(nid)
    stockname
='str_name'
    stockname
like'%findthis%'
    stockname
like'[a-zA-Z]%'---------([]指定值的范围)
    stocknamelike'[^F-M]%'---------(^排除指定范围)
    ---------只能在使用like关键字的where子句中使用通配符)
    orstockpath='stock_path'
    
orstocknumber<1000
    
andstockindex=24
    
notstocksex='man'
    stocknumber
between20and100
    stocknumber
in(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_name
    
selectstockname,"stocknumber"=count(*)fromtable_namegroupbystockname
    
---------groupby将表按行分组,指定列中有相同的值
    havingcount(*)=2---------having选定指定的组

  
select*
    
fromtable1,table2
wheretable1.id*=table2.id--------左外部连接,table1中有的而table2中没有得以null表示
    table1.id=*table2.id--------右外部连接
    selectstocknamefromtable1
    
union[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
=default
  Stockname
=null
  Stocknumber
=Stockname+4  

  
delete  

  
deletefromtable_namewhereStockid=3
  
truncatetable_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

  
usepangu
  
selectavg(e_wage)asdept_avgWage
  
fromemployee
  
groupbydept_id  

  
MAX

  
--求工资最高的员工姓名
  usepangu
  
selecte_name
  
fromemployee
  
wheree_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_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.1415926535897936
  RAND([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()------函数返回被特定字符括起来的字符串

DSC0007.gif DSC0008.gif   
/**//**//**//*selectquotename('abc','{')quotename('abc')
DSC0009.gif   运行结果如下

  {
DSC00010.gif   {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_name
  intonewtable
  fromoldtable
*/

  
ISDATE()----函数判断所给定的表达式是否为合理日期
  ISNULL(,--函数将表达式中的NULL值用指定值替换
  ISNUMERIC()----函数判断所给定的表达式是否为合理的数值
  NEWID()----函数返回一个UNIQUEIDENTIFIER类型的数值
  NULLIF(,
  
----NULLIF函数在expression1与expression2相等时返回NULL值若不相等时则返回xpression1的值
*******************Transact_SQL********************

--语句功能
--
数据操作
SELECT--从数据库表中检索数据行和列
INSERT--向数据库表添加新数据行
DELETE--从数据库表中删除数据行
UPDATE--更新数据库表中的数据
--
数据定义
CREATETABLE--创建一个数据库表
DROPTABLE--从数据库中删除表
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@zint
select@x=1@y=2@z=3
if@x>@y
print'x>y'--打印字符串'x>y'
elseif@y>@z
print'y>z'
elseprint'z>y'

--CASE
usepangu
updateemployee
sete_wage=
case
whenjob_level=1thene_wage*1.08
whenjob_level=2thene_wage*1.07
whenjob_level=3thene_wage*1.06
elsee_wage*1.05
end

--WHILECONTINUEBREAK
declare@xint@yint@cint
select@x=1@y=1
while@x<3
begin
print@x--打印变量x的值
while@y<3
begin
select@c=100*@x+@y
print@c--打印变量c的值
select@y=@y+1
end
select@x=@x+1
select@y=1
end

--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_nameoperatorvalue
ex:(宿主)
select*fromstock_informationwherestockid=str(nid)
stockname
='str_name'
stockname
like'%findthis%'
stockname
like'[a-zA-Z]%'---------([]指定值的范围)
stocknamelike'[^F-M]%'---------(^排除指定范围)
---------只能在使用like关键字的where子句中使用通配符)
orstockpath='stock_path'
orstocknumber<1000
andstockindex=24
notstocksex='man'
stocknumber
between20and100
stocknumber
in(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_name
selectstockname,"stocknumber"=count(*)fromtable_namegroupbystockname
---------groupby将表按行分组,指定列中有相同的值
havingcount(*)=2---------having选定指定的组

select*
fromtable1,table2
wheretable1.id*=table2.id--------左外部连接,table1中有的而table2中没有得以null表示
table1.id=*table2.id--------右外部连接

selectstocknamefromtable1
union[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
=default
Stockname
=null
Stocknumber
=Stockname+4

***delete***

deletefromtable_namewhereStockid=3
truncatetable_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(/**//*常用函数*/)***

----统计函数----
AVG--求平均值
COUNT--统计数目
MAX--求最大值
MIN--求最小值
SUM--求和

--AVG
usepangu
selectavg(e_wage)asdept_avgWage
fromemployee
groupbydept_id

--MAX
--
求工资最高的员工姓名
usepangu
selecte_name
fromemployee
wheree_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_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.1415926535897936
RAND([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()(<expression>AS<data_type>[length])
CONVERT()函数语法如下
CONVERT()(<data_type>[length],<expression>[,style])

selectcast(100+99aschar)convert(varchar(12),getdate())
运行结果如下
------------------------------------------
199Jan152000

----日期函数----
DAY()--函数返回date_expression中的日期值
MONTH()--函数返回date_expression中的月份值
YEAR()--函数返回date_expression中的年份值
DATEADD(<datepart>,<number>,<date>)
--函数返回指定日期date加上指定的额外日期间隔number产生的新日期
DATEDIFF(<datepart>,<number>,<date>)
--函数返回两个指定日期在datepart方面的不同之处
DATENAME(<datepart>,<date>)--函数以字符串的形式返回日期的指定部分
DATEPART(<datepart>,<date>)--函数以整数值的形式返回日期的指定部分
GETDATE()--函数以DATETIME的缺省格式返回系统当前的日期和时间

----系统函数----
APP_NAME()--函数返回当前执行的应用程序的名称
COALESCE()--函数返回众多表达式中第一个非NULL表达式的值
COL_LENGTH(<'table_name'>,<'column_name'>)--函数返回表中指定字段的长度值
COL_NAME(<table_id>,<column_id>)--函数返回表中指定字段的名称即列名
DATALENGTH()--函数返回数据表达式的数据的实际长度
DB_ID(['database_name'])--函数返回数据库的编号
DB_NAME(database_id)--函数返回数据库的名称
HOST_ID()--函数返回服务器端计算机的名称
HOST_NAME()--函数返回服务器端计算机的名称
IDENTITY(<data_type>[,seedincrement])[AScolumn_name])
--IDENTITY()函数只在SELECTINTO语句中使用用于插入一个identitycolumn列到新表中
/**//*selectidentity(int,1,1)ascolumn_name
intonewtable
fromoldtable
*/
ISDATE()--函数判断所给定的表达式是否为合理日期
ISNULL(<check_expression>,<replacement_value>)--函数将表达式中的NULL值用指定值替换
ISNUMERIC()--函数判断所给定的表达式是否为合理的数值
NEWID()--函数返回一个UNIQUEIDENTIFIER类型的数值
NULLIF(<expression1>,<expression2>)
--NULLIF函数在expression1与expression2相等时返回NULL值若不相等时则返回expression1的值

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-298989-1-1.html 上篇帖子: SQL语句及其关键字总结(四) 下篇帖子: Java链接数据库SQl Server2005
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表