首页 > 开发 > 综合 > 正文

精典SQL FAQ收藏

2024-07-21 02:05:43
字体:
来源:转载
供稿:网友



在网上经常转,常常看到有些人为了求得某些sql语句而焦头烂额,现在我特别把自己收藏的一些比较精典的sql拿出来和大家分享一下

1. 行列转换--普通

假设有张学生成绩表(cj)如下name    subject     result张三    语文        80张三    数学        90张三    物理        85李四    语文        85李四    数学        92李四    物理        82

想变成    姓名   语文   数学   物理张三   80     90     85李四   85     92     82

declare @sql varchar(4000)set @sql = 'select name'select @sql = @sql + ',sum(case subject when '''+subject+''' then result end) ['+subject+']' from (select distinct subject from cj) as aselect @sql = @sql+' from test group by name'exec(@sql)

2. 行列转换--合并

有表a, id pid 1   1 1   2 1   3 2   1 2   2 3   1如何化成表b: id pid  1  1,2,3  2  1,2  3  1

创建一个合并的函数create function fmerg(@id int)returns varchar(8000)asbegindeclare @str varchar(8000)set @str=''select @[email protected]+','+cast(pid as varchar) from 表a where [email protected] @str=right(@str,len(@str)-1)return(@str)endgo

--调用自定义函数得到结果select distinct id,dbo.fmerg(id) from 表a

3. 如何取得一个数据表的所有列名

方法如下:先从systemobject系统表中取得数据表的systemid,然后再syscolumn表中取得该数据表的所有列名。sql语句如下:declare @objid int,@objname char(40)set @objname = 'tablename'select @objid = id from sysobjects where id = object_id(@objname)select 'column_name' = name from syscolumns where id = @objid order by colid

是不是太简单了? 呵呵 不过经常用阿.

4. 通过sql语句来更改用户的密码

修改别人的,需要sysadmin  role    exec  sp_password  null,  'newpassword',  'user'

如果帐号为sa执行exec  sp_password  null,  'newpassword',  sa 

5. 怎么判断出一个表的哪些字段不允许为空?

select  column_name  from  information_schema.columns  where  is_nullable='no'  and  table_name=tablename 

6. 如何在数据库里找到含有相同字段的表?a. 查已知列名的情况select  b.name  as  tablename,a.name  as  columnname  from  syscolumns    a  inner  join    sysobjects  b    on  a.id=b.id    and  b.type='u'    and  a.name='你的字段名字' 

b. 未知列名查所有在不同表出现过的列名select  o.name  as  tablename,s1.name  as  columnname  from  syscolumns  s1,  sysobjects  o  where  s1.id  =  o.id     and  o.type  =  'u'     and  exists  (         select  1  from  syscolumns  s2           where  s1.name  =  s2.name           and  s1.id  <>  s2.id         )

7. 查询第xxx行数据

假设id是主键:  select  *  from  (select  top  xxx  *  from  yourtable)  aa  where  not  exists(select  1  from  (select  top  xxx-1  *  from  yourtable)  bb  where  aa.id=bb.id)  如果使用游标也是可以的  fetch  absolute  [number]  from  [cursor_name]  行数为绝对行数

8. sql server日期计算a. 一个月的第一天select  dateadd(mm,  datediff(mm,0,getdate()),  0)  b. 本周的星期一select  dateadd(wk,  datediff(wk,0,getdate()),  0) c. 一年的第一天select  dateadd(yy,  datediff(yy,0,getdate()),  0)  d. 季度的第一天select  dateadd(qq,  datediff(qq,0,getdate()),  0)  e. 上个月的最后一天 select  dateadd(ms,-3,dateadd(mm,  datediff(mm,0,getdate()),  0))  f. 去年的最后一天select  dateadd(ms,-3,dateadd(yy,  datediff(yy,0,getdate()),  0)) g. 本月的最后一天select  dateadd(ms,-3,dateadd(mm,  datediff(m,0,getdate())+1,  0))  h. 本月的第一个星期一select  dateadd(wk,  datediff(wk,0,                                                                                         dateadd(dd,6-datepart(day,getdate()),getdate())                                                                                                         ),  0)      i. 本年的最后一天select  dateadd(ms,-3,dateadd(yy,  datediff(yy,0,getdate())+1,  0))。



感谢那些网上提供相关sql的作者
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表