会员登录 用户名: 密码: 登录 新会员注册 [找回密码]
当前位置:编程论坛 >> 数据库技术专区 >> SQL Server 论坛 >> [分享]精典的SQL语句,推荐收藏 - SQL Server 论坛
首页
中资源
  发表一个新主题  发表一个新投票  回复主题 您是本帖的第 2525 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
 * 贴子主题:[分享]精典的SQL语句,推荐收藏 报告本帖给版主  显示可打印的版本  把本贴打包邮递  把本贴加入论坛收藏夹  发送本页面给朋友  把本贴加入IE收藏夹 
 一直学下去 美女呀,离线,快来找我吧!双鱼座1987-3-17
  
  
  头 衔:快乐鱼儿
  等 级:职业侠客
  积 分:6734
  专家分:3012
  提问帖:5/5
  回答帖:301
  总帖数:462
  经验值:691
  注 册:2008-7-1
给一直学下去发送一个短消息 把一直学下去加入好友 查看一直学下去的个人资料 搜索一直学下去在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子楼主

发贴心情 [分享]精典的SQL语句,推荐收藏

在网上经常转,常常看到有些人为了求得某些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 CJ 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 SERVER 与EXCEL的数据转换
1、在SQL SERVER里查询Excel数据:
-- ======================================================
SELECT * 
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。
SELECT * 
FROM OpenDataSource ( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------------------------------------------------------------------

2、将Excel的数据导入SQL server :
-- ======================================================
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

实例:
SELECT * into newtable
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Finance\account.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions
-------------------------------------------------------------------------------------------------

3、将SQL SERVER中查询到的数据导成一个Excel文件
-- ======================================================
T-SQL代码:
EXEC master..xp_cmdshell 'bcp 库名.dbo.表名out c:\Temp.xls -c -q -S"servername" -U"sa" -P""'
参数:S 是SQL服务器名;U是用户;P是密码
说明:还可以导出文本文件等多种格式

实例:EXEC master..xp_cmdshell 'bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S"pmserver" -U"sa" -P"sa"'

EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout C:\ authors.xls -c -Sservername -Usa -Ppassword'

在VB6中应用ADO导出EXCEL文件代码: 
Dim cn As New ADODB.Connection
cn.open "Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;"
cn.execute "master..xp_cmdshell 'bcp "SELECT col1, col2 FROM 库名.dbo.表名" queryout E:\DT.xls -c -Sservername -Usa -Ppassword'"
-------------------------------------------------------------------------------------------------

4、在SQL SERVER里往Excel插入数据:
-- ======================================================
insert into OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:\Temp.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...table1 (A1,A2,A3) values (1,2,3)

T-SQL代码:
INSERT INTO 
OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 
'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$] 
(bestand, produkt) VALUES (20, 'Test') 

[此贴子已经被作者于2008-10-22 11:03:25编辑过]

年轻没有失败,成功没有终点!

发帖:2008-7-25 15:50:00
  鲜花(0)  鸡蛋(0)
 财神 帅哥哟,离线,有人找我吗?
  
  
  等 级:中级剑客
  积 分:15063
  专家分:11350
  提问帖:3/4
  回答帖:835
  总帖数:1227
  经验值:1355
  注 册:2006-11-18
给财神发送一个短消息 把财神加入好友 查看财神的个人资料 搜索财神在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子2

发贴心情 

楼主可以通过发布中心啊,还有积分可以得

按此在新窗口浏览图片

发帖:2008-7-25 18:49:00
 yourleon 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:201
  专家分:0
  提问帖:0/0
  回答帖:0
  总帖数:1
  经验值:51
  注 册:2008-7-27
给yourleon发送一个短消息 把yourleon加入好友 查看yourleon的个人资料 搜索yourleon在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子3

发贴心情 

收下了,谢谢楼主
发帖:2008-7-27 15:44:00
 julong8866 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:20
  专家分:15
  提问帖:2/0
  回答帖:6
  总帖数:39
  经验值:91
  注 册:2008-5-27
给julong8866发送一个短消息 把julong8866加入好友 查看julong8866的个人资料 搜索julong8866在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子4

发贴心情 

谢谢楼主
发帖:2008-7-29 8:08:00
 pwf825 帅哥哟,离线,有人找我吗?
  
  
  等 级:论坛游民
  积 分:941
  专家分:373
  提问帖:5/4
  回答帖:74
  总帖数:107
  经验值:228
  注 册:2007-11-12
给pwf825发送一个短消息 把pwf825加入好友 查看pwf825的个人资料 搜索pwf825在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子5

发贴心情 

多谢楼主,收藏了

岁月本长,而忙者自促,
天地本宽,而卑者自隘。
风花雪月本闲,而劳忧者自冗;
天行健,君子以自强不息;
地势坤,君子以厚德载物;
宠辱不惊,闲看庭前花开花落;
去留无意,漫随天外云卷云舒。
不妄取,不妄予,不妄想,不妄求,与人方便,随遇而安。

发帖:2008-7-29 11:06:00
 zjhnui 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:154
  专家分:0
  提问帖:1/0
  回答帖:0
  总帖数:2
  经验值:54
  注 册:2008-7-29
给zjhnui发送一个短消息 把zjhnui加入好友 查看zjhnui的个人资料 搜索zjhnui在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子6

发贴心情 

支持.....我是刚刚打算学,不会,但也收起来,,
发帖:2008-7-29 16:25:00
 jzm-219 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:209
  专家分:0
  提问帖:0/0
  回答帖:1
  总帖数:2
  经验值:52
  注 册:2008-8-5
给jzm-219发送一个短消息 把jzm-219加入好友 查看jzm-219的个人资料 搜索jzm-219在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子7

发贴心情 

非常好,帮助我解决了好些问题。感谢ing!!!
发帖:2008-8-6 9:12:00
 liyuanliyh 帅哥哟,离线,有人找我吗?
  
  
  等 级:初出江湖
  积 分:271
  专家分:0
  提问帖:0/0
  回答帖:2
  总帖数:14
  经验值:76
  注 册:2008-9-25
给liyuanliyh发送一个短消息 把liyuanliyh加入好友 查看liyuanliyh的个人资料 搜索liyuanliyh在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子8

发贴心情 

谢谢楼主分享哦
先收藏起来
发帖:2008-10-13 19:52:00
 cnhawk 帅哥哟,离线,有人找我吗?天蝎座1987-10-27
  
  
  等 级:初出江湖
  积 分:205
  专家分:3
  提问帖:1/0
  回答帖:4
  总帖数:16
  经验值:74
  注 册:2008-10-14
给cnhawk发送一个短消息 把cnhawk加入好友 查看cnhawk的个人资料 搜索cnhawk在SQL Server 论坛的所有贴子  引用回复这个贴子 回复这个贴子9

发贴心情 

这些在做数据的时候都是比较常用的,也比较经典!支持一下!

论坛有哪位仁兄,帮忙介绍一份好点的工作!
联系电话:13579389363
QQ:378120749

发帖:2008-10-14 10:43:00
 woodling 美女呀,离线,快来找我吧!
  
  
  等 级:初出江湖
  积 分:217
  专家分:0
  提问帖:0/0
  回答帖:0
  总帖数:1
  经验值:52
  注 册:2008-10-14
给woodling发送一个短消息 把woodling加入好友 查看woodling的个人资料 搜索woodling在SQL Server 论坛的所有贴子 引用回复这个贴子 回复这个贴子10

发贴心情 


好东西!
发帖:2008-10-15 17:02:00

本主题贴数30,分页:[返回帖子列表] [上一页] [1] [2] [3] [下一页]
 *快速回复:[分享]精典的SQL语句,推荐收藏  [ 回帖是一种美德 :) ]
会员账号 用户名    还没注册?    密码    忘记密码?
内容
  • HTML标签: 不可用
  • UBB标签: 可用
  • 贴图标签: 可用
  • 多媒体标签:可用
  • 表情字符转换:可用
  • 上传图片:不可用
  • 最多15KB
  • 点击表情图即可在帖子中加入相应的表情
                                
    邮件回复 显示签名   [Ctrl+Enter直接提交贴子]

    管理选项锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告