注册 登录
编程论坛 SQL Server论坛

精典的SQL语句,推荐收藏

卜酷塔 发布于 2005-04-09 11:40, 20498 次点击

在网上经常转,常常看到有些人为了求得某些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 a select @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) as begin declare @str varchar(8000) set @str='' select @str=@str+','+cast(pid as varchar) from 表A where id=@id set @str=right(@str,len(@str)-1) return(@str) End go

--调用自定义函数得到结果 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的作者

84 回复
#2
fokin2005-04-13 10:54
还不错!!~~~
#3
EA_Games2005-04-14 19:18
不错不错。对新手很有帮助。
#4
suyongtao2005-06-06 09:42
不错,,
#5
光明之子2005-06-08 16:11
一般拉,我好多都见过的!
#6
刹那2005-06-10 10:47
不错的
#7
我心依旧2005-06-10 20:54
想加你QQ做个朋友,以后多沟通沟通
#8
极速尽2005-08-13 11:04
看的我晕……我真是新的不能再新的新人啊……
#9
gaofangtao2005-08-15 00:17
不错,很好,加油
#10
yichen2005-08-16 18:22
学习就是靠总结的么!
#11
julycy2005-08-22 11:15
Qiang!
Tks!
#12
aerial2005-08-30 17:23
很好,楼主真是好人
#13
zhuomou2005-09-06 16:53
我晕,没有看懂。以后要多看看。
#14
meccoy2005-11-07 20:01
谢谢,版主真好心,提倡共享精神!
#15
caiyakang2005-11-08 18:34

帮顶

#16
mahongqiang2005-11-12 00:40

我已保存
对我很有帮助
谢了

#17
chenwf11962005-11-25 12:20
收藏!
#18
jiudi2005-11-25 20:40
非常好!真乃及时雨,我正需要.

另,垦请赐请,下面的解决办法.不知是否ALTER TABLE语法中不支持变量,如是想从数据表中提取内容做为新增列的标题,有其他解决方案吗?


在存储过程中使用变量@subName做为要增加的列名,但是并不执行,如何解决?如果新增列名用常量,则一切正常。

ALTER TABLE ClaAchSumTb ADD @subName Nvarchar(20) NULL


用EXEC来执行上面语句也不执行,

#19
jiudi2005-11-25 20:55
非常好!真乃及时雨,我正需要.

另,垦请赐请,下面的解决办法.不知是否ALTER TABLE语法中不支持变量,如是想从数据表中提取内容做为新增列的标题,有其他解决方案吗?


在存储过程中使用变量@subName做为要增加的列名,但是并不执行,如何解决?如果新增列名用常量,则一切正常。

ALTER TABLE ClaAchSumTb ADD @subName Nvarchar(20) NULL


用EXEC来执行上面语句也不执行,

#20
muyexin2005-11-25 22:36

不错
顶一下

#21
追梦者2005-11-28 11:14

不错,不错,帮顶,继续努力.

#22
laifeir2005-11-28 14:43

支持

#23
chenwf11962005-11-28 20:36
好帖!
#24
aolong2005-11-28 23:46
经典
顶一下
#25
史前大暴龙2005-12-01 01:30
真是不错啊,对于我们这些新手来说,还真是受益不少,谢谢楼主了
#26
傻男孩2005-12-01 11:28

谢谢,对我有用!

#27
llijin_7262005-12-10 18:15
谢谢了,很好!
#28
llijin_7262005-12-10 18:16
谢谢了,很好!
#29
潇洒老乌龟2005-12-13 23:17
看看。
#30
seraph1262006-01-04 09:26

嗯,不错

#31
jxj8292006-01-07 11:12
顶一下!!!
#32
存诚2006-01-07 21:40
学习了,什么也看不动
#33
welldone20062006-01-08 13:18
不错,支持一下!!
#34
sliao612006-01-18 08:55
好 好 好!
#35
PB爱好者2006-01-18 10:53

希望版主能多发一些这方面的帖子,让大家分享!! 谢谢!!

#36
jingming2006-01-18 14:23
不错,,我顶
#37
softwing2006-01-20 15:49
太好用了,我正被access的pivot弄得晕头转向,谢谢版主
#38
雨溪2006-01-22 02:43

偶也是青岛的,QQ:14550535
希望多交流~~~~~~~~~~

#39
雨溪2006-01-22 02:44
有一点现代,有一点古韵,像山,像海。山海与城市相组合,是青色的岛。
正所谓红瓦,绿树,碧海,蓝天。
这就是青岛。
嘿嘿~~~~~~~~楼主概括的不错~~~~~~~~~~~~~~
#40
dayo2006-01-23 13:04


问;楼主个问题
用Transact -SQL 编制一个函数,用于对给定的分数进行判断:大于60,返回及格。小于60,则返回不及格。

该怎么做 谢谢

#41
marydan2006-02-22 10:18
第三个,好像只用一句就可以了

select name
from syscolumns
where id=object_id('tablename')

#42
marydan2006-02-22 10:29
第5个也可以这样
select name
from syscolumns
where id=object_id('tablename')
and isnullable=0

#43
marydan2006-02-22 11:27
都很好:)
#44
xqiang2006-03-24 14:22
好东西不是一下子可以看懂的,回去慢慢研究
#45
xqiang2006-03-24 14:22
哦,忘顶了,


顶!
#46
Tailor2006-03-24 16:25

顶了.不错的.

#47
自由震魂曲2006-03-27 11:08
以下是引用卜酷塔在2005-4-9 11:40:00的发言:

在网上经常转,常常看到有些人为了求得某些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 a
select @sql = @sql+' from test group by name'
exec(@sql)

请教一下.此例中  select @sql = @sql+' from test group by name'  这句中的test是什么表???我建了一个题目中的表做试验,运行了程序后,提示错误是:
       服务器: 消息 208,级别 16,状态 1,行 1
       对象名 'test' 无效。

#48
luke9112006-03-27 16:42

好东西

#49
文盲2006-03-29 11:51
看不懂
#50
wdlrczt2006-03-29 13:16
支持
#51
smartgenius2006-04-08 15:49
12