t-sql (来自http://dev.csdn.net/develop/article/83/83138.shtm )

来自 http://dev.csdn.net/develop/article/83/83138.shtm

一、 只复制一个表结构,不复制数据

 

select   top   0   *   into   [ t1 ]   from   [ t2 ]


二、 获取数据库中某个对象的创建脚本

1、 先用下面的脚本创建一个函数

if   exists ( select   1   from  sysobjects  where  id = object_id ( ' fgetscript ' and   objectproperty (id, ' IsInlineFunction ' ) = 0 )
 
drop   function  fgetscript
go

create   function  fgetscript(
 
@servername   varchar ( 50 )      -- 服务器名
 , @userid   varchar ( 50 ) = ' sa '      -- 用户名,如果为nt验证方式,则为空
 , @password   varchar ( 50 ) = ''      -- 密码
 , @databasename   varchar ( 50 )     -- 数据库名称
 , @objectname   varchar ( 250 )     -- 对象名

returns   varchar ( 8000 )
as
begin
 
declare   @re   varchar ( 8000 )         -- 返回脚本
  declare   @srvid   int , @dbsid   int         -- 定义服务器、数据库集id
  declare   @dbid   int , @tbid   int          -- 数据库、表id
  declare   @err   int , @src   varchar ( 255 ),  @desc   varchar ( 255 -- 错误处理变量

-- 创建sqldmo对象
  exec   @err = sp_oacreate  ' sqldmo.sqlserver ' , @srvid  output
 
if   @err <> 0   goto  lberr

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

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

 
if   @err <> 0   goto  lberr

-- 获取数据库集
  exec   @err = sp_oagetproperty  @srvid , ' databases ' , @dbsid  output
 
if   @err <> 0   goto  lberr

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

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

-- 取得脚本
  exec   @err = sp_oamethod  @tbid , ' script ' , @re  output
 
if   @err <> 0   goto  lberr

 
-- print @re
  return ( @re )

lberr:
 
exec  sp_oageterrorinfo  NULL @src  out,  @desc  out 
 
declare   @errb   varbinary ( 4 )
 
set   @errb = cast ( @err   as   varbinary ( 4 ))
 
exec  master..xp_varbintohexstr  @errb , @re  out
 
set   @re = ' 错误号:  ' + @re
   
+ char ( 13 ) + ' 错误源:  ' + @src
   
+ char ( 13 ) + ' 错误描述:  ' + @desc
 
return ( @re )
end
go

2、 用法如下
用法如下,

print  dbo.fgetscript( ' 服务器名 ' , ' 用户名 ' , ' 密码 ' , ' 数据库名 ' , ' 表名或其它对象名 ' )

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

declare   @name   varchar ( 250 )
declare  #aa  cursor   for
 
select  name  from  sysobjects  where  xtype  not   in ( ' S ' , ' PK ' , ' D ' , ' X ' , ' L ' )
open  #aa
fetch   next   from  #aa  into   @name
while   @@fetch_status = 0
begin
 
print  dbo.fgetscript( ' onlytiancai ' , ' sa ' , ' sa ' , ' database ' , @name )
 
fetch   next   from  #aa  into   @name
end
close  #aa
deallocate  #aa

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

create   function  getstrarrlength ( @str   varchar ( 8000 ))
returns   int
as
begin
  
declare   @int_return   int
  
declare   @start   int
  
declare   @next   int
  
declare   @location   int
  
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、 获取指定索引的值的函数

create   function  getstrofindex ( @str   varchar ( 8000 ), @index   int   = 0 )
returns   varchar ( 8000 )
as
begin
  
declare   @str_return   varchar ( 8000 )
  
declare   @start   int
  
declare   @next   int
  
declare   @location   int
  
select   @start   = 1
  
select   @next   = 1   -- 如果习惯从0开始则select @next =0
   select   @location   =   charindex ( ' , ' , @str , @start )
  
while  ( @location   <> 0   and   @index   >   @next  )
  
begin
    
select   @start   =   @location   + 1
    
select   @location   =   charindex ( ' , ' , @str , @start )
    
select   @next   = @next   + 1
  
end
  
if   @location   = 0   select   @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   *   from   OPENDATASOURCE ( ' SQLOLEDB ' , ' Data Source=远程ip;User ID=sa;Password=密码 ' ).库名.dbo.表名

第二种方法:
先使用联结服务器:

EXEC  sp_addlinkedserver  ' 别名 ' , '' , ' MSDASQL ' , NULL , NULL , ' DRIVER={SQL Server};SERVER=远程名;UID=用户;PWD=密码; '
exec  sp_addlinkedsrvlogin   @rmtsrvname = ' 别名 ' , @useself = ' false ' , @locallogin = ' sa ' , @rmtuser = ' sa ' , @rmtpassword = ' 密码 '
GO

然后你就可以如下:

select   *   from  别名.库名.dbo.表名
insert  库名.dbo.表名  select   *   from  别名.库名.dbo.表名
select   *   into  库名.dbo.新表名  from  别名.库名.dbo.表名
go

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

Create   view  fielddesc    
as
select  o.name  as  table_name,c.name  as  field_name,t.name  as  type,c.length  as  

length,c.isnullable 
as  isnullable, convert ( varchar ( 30 ),p.value)  as  desp 
from  syscolumns c  
join  systypes t  on  c.xtype  =  t.xusertype
join  sysobjects o  on  o.id = c.id 
left   join     sysproperties p  on  p.smallid = c.colid  and  p.id = o.id    
where  o.xtype = ' U '

查询时:

Select   *   from  fielddesc  where  table_name  =   ' 你的表名 '

 

还有个更强的语句,是邹建写的,也写出来吧

SELECT  
 (
case   when  a.colorder = 1   then  d.name  else   ''   end ) N ' 表名 ' ,
 a.colorder N
' 字段序号 ' ,
 a.name N
' 字段名 ' ,
 (
case   when   COLUMNPROPERTY ( a.id,a.name, ' IsIdentity ' ) = 1   then   ' ' else   ''   end ) N ' 标识 ' ,
 (
case   when  ( SELECT   count ( * )
 
FROM  sysobjects
 
WHERE  (name  in
           (
SELECT  name
          
FROM  sysindexes
          
WHERE  (id  =  a.id)  AND  (indid  in
                    (
SELECT  indid
                   
FROM  sysindexkeys
                   
WHERE  (id  =  a.id)  AND  (colid  in
                             (
SELECT  colid
                            
FROM  syscolumns
                            
WHERE  (id  =  a.id)  AND  (name  =  a.name)))))))  AND
        (xtype 
=   ' PK ' )) > 0   then   ' '   else   ''   end ) N ' 主键 ' ,
 b.name N
' 类型 ' ,
 a.length N
' 占用字节数 ' ,
 
COLUMNPROPERTY (a.id,a.name, ' PRECISION ' as  N ' 长度 ' ,
 
isnull ( COLUMNPROPERTY (a.id,a.name, ' Scale ' ), 0 as  N ' 小数位数 ' ,
 (
case   when  a.isnullable = 1   then   ' ' else   ''   end ) N ' 允许空 ' ,
 
isnull (e. text , '' ) N ' 默认值 ' ,
 
isnull (g. [ value ] , '' AS  N ' 字段说明 '
-- into ##tx

FROM   syscolumns  a  left   join  systypes b 
on   a.xtype = b.xusertype
inner   join  sysobjects d 
on  a.id = d.id   and   d.xtype = ' U '   and   d.name <> ' dtproperties '
left   join  syscomments e
on  a.cdefault = e.id
left   join  sysproperties g
on  a.id = g.id  AND  a.colid  =  g.smallid  
order   by   object_name (a.id),a.colorder

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

1、把所有"70.07.06"这样的值变成"1970-07-06"

UPDATE  lvshi
SET  shengri  =   ' 19 '   +   REPLACE (shengri,  ' . ' ' - ' )
WHERE  (zhiyezheng  =   ' 139770070153 ' )

 

2、在"1970-07-06"里提取"70","07","06"

SELECT   SUBSTRING (shengri,  3 2 AS   year SUBSTRING (shengri,  6 2 AS   month
      
SUBSTRING (shengri,  9 2 AS   day
FROM  lvshi
WHERE  (zhiyezheng  =   ' 139770070153 ' )

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

UPDATE  lvshi
SET  shenling  =   CONVERT ( varchar ( 4 ),  YEAR (shenling)) 
      
+   ' - '   +   CASE   WHEN   LEN ( MONTH (shenling))  =   1   THEN   ' 0 '   +   CONVERT ( varchar ( 2 ), 
      
month (shenling))  ELSE   CONVERT ( varchar ( 2 ),  month (shenling)) 
      
END   +   ' - '   +   CASE   WHEN   LEN ( day (shenling))  =   1   THEN   ' 0 '   +   CONVERT ( char ( 2 ), 
      
day (shenling))  ELSE   CONVERT ( varchar ( 2 ),  day (shenling))  END
WHERE  (zhiyezheng  =   ' 139770070153 ' )

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

-- 看下面的示例

-- 示例表
create   table  tempdb.dbo.t_10(
id 
int   primary   key   check (id  between   1   and   10 ),name  varchar ( 10 ))

create   table  pubs.dbo.t_20(
id 
int   primary   key   check (id  between   11   and   20 ),name  varchar ( 10 ))

create   table  northwind.dbo.t_30(
id 
int   primary   key   check (id  between   21   and   30 ),name  varchar ( 10 ))
go

-- 分区视图
create   view  v_t
as
select   *   from  tempdb.dbo.t_10
union   all
select   *   from  pubs.dbo.t_20
union   all
select   *   from  northwind.dbo.t_30
go

-- 插入数据
insert  v_t  select   1  , ' aa '
union    all   select   2  , ' bb '
union    all   select   11 , ' cc '
union    all   select   12 , ' dd '
union    all   select   21 , ' ee '
union    all   select   22 , ' ff '

-- 更新数据
update  v_t  set  name = name + ' _更新 '   where   right (id, 1 ) = 1

-- 删除测试
delete   from  v_t  where   right (id, 1 ) = 2

-- 显示结果
select   *   from  v_t
go

-- 删除测试
drop   table  northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10
drop   view  v_t

/*--测试结果

id          name       
----------- ---------- 
1           aa_更新
11          cc_更新
21          ee_更新

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


八、 树型的实现

-- 参考

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

-- 示例数据
create   table   [ tb ] ( [ id ]   int   identity ( 1 , 1 ), [ pid ]   int ,name  varchar ( 20 ))
insert   [ tb ]   select   0 , ' 中国 '
union    all    select   0 , ' 美国 '
union    all    select   0 , ' 加拿大 '
union    all    select   1 , ' 北京 '
union    all    select   1 , ' 上海 '
union    all    select   1 , ' 江苏 '
union    all    select   6 , ' 苏州 '
union    all    select   7 , ' 常熟 '
union    all    select   6 , ' 南京 '
union    all    select   6 , ' 无锡 '
union    all    select   2 , ' 纽约 '
union    all    select   2 , ' 旧金山 '
go

-- 查询指定id的所有子
create   function  f_cid(
@id   int
)
returns   @re   table ( [ id ]   int , [ level ]   int )
as
begin
 
declare   @l   int
 
set   @l = 0
 
insert   @re   select   @id , @l
 
while   @@rowcount > 0
 
begin
  
set   @l = @l + 1
  
insert   @re   select  a. [ id ] , @l
  
from   [ tb ]  a, @re  b
  
where  a. [ pid ] = b. [ id ]   and  b. [ level ] = @l - 1
 
end
/**/ /*--如果只显示最明细的子(下面没有子),则加上这个删除
 delete a from @re a
 where exists(
  select 1 from [tb] where [pid]=a.[id])
--
*/

 
return
end
go

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

-- 删除测试
drop   table   [ tb ]
drop   function  f_cid
go

 

九、 排序问题

CREATE   TABLE   [ t ]  (
 
[ id ]   [ int ]   IDENTITY  ( 1 1 NOT   NULL  ,
 
[ GUID ]   [ uniqueidentifier ]   NULL  
ON   [ PRIMARY ]
GO


下面这句执行5次

insert  t  values  ( newid ())


查看执行结果

select   *   from  t


1、 第一种

select   *   from  t
 
order   by   case  id  when   4   then   1
                  
when   5   then   2
                  
when   1   then   3
                  
when   2   then   4
                  
when   3   then   5   end


2、 第二种

select   *   from  t  order   by  (id + 2 ) % 6


3、 第三种

select   *   from  t  order   by   charindex ( cast (id  as   varchar ), ' 45123 ' )


4、 第四种

select   *   from  t
WHERE  id  between   0   and   5
order   by   charindex ( cast (id  as   varchar ), ' 45123 ' )


5、 第五种

select   *   from  t  order   by   case   when  id  > 3   then  id - 5   else  id  end


6、 第六种

select   *   from  t  order   by  id  /   4   desc ,id  asc

 

十、 一条语句删除一批记录
首先id列是int标识类类型,然后删除ID值为5,6,8,9,10,11的列,这里的cast函数不能用convert函数代替,而且转换的类型必须是varchar,而不能是char,否则就会执行出你不希望的结果,这里的"5,6,8,9,10,11"可以是你在页面上获取的一个chkboxlist构建成的值,然后用下面的一句就全部删
除了,比循环用多条语句高效吧应该。

delete   from   [ fujian ]   where   charindex ( ' , ' + cast ( [ id ]   as   varchar ) + ' , ' , ' , ' + ' 5,6,8,9,10,11, ' + ' , ' ) > 0


还有一种就是

delete   from  table1  where  id  in ( 1 , 2 , 3 , 4  )


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

CREATE     FUNCTION  fn_Get05LvshiNameBySuo  ( @p_suo   Nvarchar ( 50 ))
RETURNS   Nvarchar ( 2000 )
AS
BEGIN   
 
DECLARE   @LvshiNames   varchar ( 2000 ),  @name   varchar ( 50 )
 
select   @LvshiNames = ''
 
DECLARE  lvshi_cursor  CURSOR   FOR

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

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

  
-- 数据定义 

   
CREATE   TABLE   -- 创建一个数据库表 
       DROP   TABLE   -- 从数据库中删除表 
       ALTER   TABLE   -- 修改数据库表结构 
       CREATE   VIEW   -- 创建一个视图 
       DROP   VIEW   -- 从数据库中删除视图 
       CREATE   INDEX   -- 为数据库表创建一个索引 
       DROP   INDEX   -- 从数据库中删除索引 
       CREATE   PROCEDURE   -- 创建一个存储过程 
       DROP   PROCEDURE   -- 从数据库中删除存储过程 
       CREATE   TRIGGER   -- 创建一个触发器 
       DROP   TRIGGER   -- 从数据库中删除触发器 
       CREATE   SCHEMA   -- 向数据库添加一个新模式 
       DROP   SCHEMA   -- 从数据库中删除一个模式 
       CREATE  DOMAIN  -- 创建一个数据值域 
       ALTER  DOMAIN  -- 改变域定义 
       DROP  DOMAIN  -- 从数据库中删除一个域 

  
-- 数据控制 

   
GRANT   -- 授予用户访问权限 
       DENY   -- 拒绝用户访问 
       REVOKE   -- 解除用户访问权限 

  
-- 事务控制 

   
COMMIT   -- 结束当前事务 
       ROLLBACK   -- 中止当前事务 
       SET   TRANSACTION   -- 定义当前事务数据访问特征 

  
-- 程序化SQL 

   
DECLARE   -- 为查询设定游标 
      EXPLAN  -- 为查询描述数据访问计划 
       OPEN   -- 检索查询结果打开一个游标 
       FETCH   -- 检索一行查询结果 
       CLOSE   -- 关闭游标 
       PREPARE   -- 为动态执行准备SQL 语句 
       EXECUTE   -- 动态地执行SQL 语句 
      DESCRIBE  -- 描述准备好的查询   

  
-- -局部变量 

   
declare   @id   char ( 10
      
-- set @id = '10010001' 
       select   @id   =   ' 10010001 '    

  
-- -全局变量 

  
-- -必须以@@开头   

  
-- IF ELSE 

  
declare   @x   int   @y   int   @z   int  
      
select   @x   =   1   @y   =   2   @z = 3  
      
if   @x   >   @y  
       
print   ' x > y '   -- 打印字符串'x > y' 
       else   if   @y   >   @z  
       
print   ' y > z '  
      
else   print   ' z > y '  
      
-- CASE 
       use  pangu 
      
update  employee 
      
set  e_wage  =  
       
case  
       
when  job_level  =  ’ 1 ’  then  e_wage * 1.08  
       
when  job_level  =  ’ 2 ’  then  e_wage * 1.07  
       
when  job_level  =  ’ 3 ’  then  e_wage * 1.06  
       
else  e_wage * 1.05  
       
end  
      
-- WHILE CONTINUE BREAK 
       declare   @x   int   @y   int   @c   int  
      
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 语句 

  
waitfor  delay ’ 01 : 02 : 03 ’ 
      
select   *   from  employee 

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

    
waitfor  time ’ 23 : 08 : 00 ’ 


SELECT    

   
select   * (列名)  from  table_name(表名)  where  column_name operator value ex宿主) 
     
select   *   from  stock_information  where  stockid  =   str (nid) 
     stockname 
=   ' str_name '  
     stockname 
like   ' % find this % '  
     stockname 
like   ' [a-zA-Z]% '   -- ------- ([]指定值的范围) 
     stockname  like   ' [^F-M]% '   -- ------- (^排除指定范围) 
      -- ------- 只能在使用like关键字的where子句中使用通配符) 
      or  stockpath  =   ' stock_path '  
     
or  stocknumber  <   1000  
     
and  stockindex  =   24  
     
not  stocksex  =   ' man '  
     stocknumber 
between   20   and   100  
     stocknumber 
in ( 10 , 20 , 30
     
order   by  stockid  desc ( asc -- ------- 排序,desc-降序,asc-升序 
      order   by   1 , 2   -- ------- by列号 
     stockname  =  ( select  stockname  from  stock_information  where  stockid  =   4
     
-- ------- 子查询 
      -- ------- 除非能确保内层select只返回一个行的值 
      -- ------- 否则应在外层where子句中用一个in限定符 
      select   distinct  column_name form table_name 
   
-- ------- distinct指定检索独有的列值,不重复 
      select  stocknumber ,"stocknumber  +   10 =  stocknumber  +   10   from  table_name 
     
select  stockname , "stocknumber"  =   count ( * from  table_name  group   by  stockname 
     
-- ------- group by 将表按行分组,指定列中有相同的值 
      having   count ( * =   2   -- ------- having选定指定的组 

   
select   *  
     
from  table1, table2 
where  table1.id  *=  table2.id  -- ------ 左外部连接,table1中有的而table2中没有得以null表示 
     table1.id  =*  table2.id  -- ------ 右外部连接 
      select  stockname  from  table1 
     
union   [ all ]   -- ------ union合并查询结果集,all-保留重复行 
      select  stockname  from  table2  

   
insert   

   
insert   into  table_name (Stock_name,Stock_number) value ("xxx","xxxx" 
   value (
select  Stockname , Stocknumber  from  Stock_table2) 
   
-- -----value为select语句   

   
update    

   
update  table_name  set  Stockname  =  "xxx"  [ where Stockid = 3 ]  
   Stockname 
=   default  
   Stockname 
=   null  
   Stocknumber 
=  Stockname  +   4    

   
delete    

   
delete   from  table_name  where  Stockid  =   3  
   
truncate  table_name  -- ------- 删除表中所有行,仍保持表的完整性 
    drop   table  table_name  -- ------- 完全删除表  

   
alter   table   -- ------ 修改数据库表结构   

   
alter   table   database .owner.table_name  add  column_name  char ( 2 null  .. 
   sp_help table_name 
-- ------ 显示表已有特征 
    create   table  table_name (name  char ( 20 ), age  smallint , lname  varchar ( 30 )) 
   
insert   into  table_name  select   -- ------ 实现删除列的方法(创建新表) 
    alter   table  table_name  drop   constraint  Stockname_default 
   
-- ------- 删除Stockname的default约束 




常用函数(
function )   

    转换函数

    
convert (数据类型,值,格式)

  统计函数 

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

  
AVG  

  
use  pangu 
  
select   avg (e_wage)  as  dept_avgWage 
  
from  employee 
  
group   by  dept_id   

  
MAX  

  
-- 求工资最高的员工姓名 
   use  pangu 
  
select  e_name 
  
from  employee 
  
where  e_wage  =  
   (
select   max (e_wage) 
   
from  employee)   

  
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 ()  -- ----函数返回被特定字符括起来的字符串 

  
/**/ /*select quotename('abc', '{') quotename('abc') 
  运行结果如下 

  { 
  {abc} [abc]
*/
 
  
REPLICATE ()  -- ----函数返回一个重复character_expression 指定次数的字符串 
   /**/ /*select replicate('abc', 3) replicate( 'abc', -2) 

  运行结果如下 

  abcabcabc NULL
*/
 
  
REVERSE ()  -- ----函数将指定的字符串的字符排列顺序颠倒 
   REPLACE ()  -- ----函数返回被替换了指定子串的字符串 
   /**/ /*select replace('abc123g', '123', 'def') 

  运行结果如下 
   
  abcdefg
*/
   

  
SPACE ()  -- ----函数返回一个有指定长度的空白字符串 
   STUFF ()  -- ----函数用另一子串替换字符串指定位置长度的子串   

  数据类型转换函数 

  
CAST () 函数语法如下 
  
CAST () (  AS   [  length  ]
  
CONVERT () 函数语法如下 
  
CONVERT () ( [  length  ] [ , style ]
  
select   cast ( 100 + 99   as   char convert ( varchar ( 12 ),  getdate ()) 

  运行结果如下 
  
199  Jan  15   2000   

  日期函数 

  
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 ( [ , seed increment ] [ AS column_name ]
   
-- IDENTITY() 函数只在SELECT INTO 语句中使用用于插入一个identity column列到新表中 
   /**/ /*select identity(int, 1, 1) as column_name 
   into newtable 
   from oldtable
*/
 

  
ISDATE ()  -- --函数判断所给定的表达式是否为合理日期 
   ISNULL (,   -- 函数将表达式中的NULL 值用指定值替换 
   ISNUMERIC ()  -- --函数判断所给定的表达式是否为合理的数值 
   NEWID ()  -- --函数返回一个UNIQUEIDENTIFIER 类型的数值 
   NULLIF (,  
   
-- --NULLIF 函数在expression1 与expression2 相等时返回NULL 值若不相等时则返回xpression1 的值 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值