社区应用 最新帖子 精华区 社区服务 会员列表 统计排行 社区论坛任务 迷你宠物
  • 6191阅读
  • 0回复

[转贴]精妙SQL语句收集

级别: 店掌柜
发帖
5692
铜板
103378
人品值
1520
贡献值
26
交易币
0
好评度
5373
信誉值
0
金币
0
所在楼道

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 gO$!_!@LM  
OW #pBeX99  
[X~H Uk??  
一、基础 vW]BOzK  
1、说明:创建数据库 ipU"|{NK  
CREATE DATABASE database-name }bB_[+YV`{  
2、说明:删除数据库 #m8Oy|Y9`  
drop database dbname .(`u'G=  
3、说明:备份sql server #p_ ~L4iW  
--- 创建 备份数据的 device >!a*wf~]  
USE master rH-_L&  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' kkd<CEz2IM  
--- 开始 备份 xX|-5cM;  
BACKUP DATABASE pubs TO testBack 9ykmz (  
4、说明:创建新表 sq<y2j1oF  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) lJU[9)Q_  
根据已有的表创建新表: i$%V)pH~F  
A:create table tab_new like tab_old (使用旧表创建新表) ;dPLi4=o  
B:create table tab_new as select col1,col2... from tab_old definition only Ay56@_d2  
5、说明:删除新表 i<@|+*>M  
drop table tabname M4DRG%21  
6、说明:增加一个列 L[O+9Yh  
Alter table tabname add column col type ~Q6ufTGhpM  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 C w$y  
7、说明:添加主键: Alter table tabname add primary key(col) K-#Rm%J+Wy  
说明:删除主键: Alter table tabname drop primary key(col) lI&0 V5  
8、说明:创建索引:create [unique] index idxname on tabname(col....) T1e}WJbFE  
删除索引:drop index idxname DrB=   
注:索引是不可更改的,想更改必须删除重新建。 &}P62&  
9、说明:创建视图:create view viewname as select statement !{ )H  
删除视图:drop view viewname !hJKI.XH  
10、说明:几个简单的基本的sql语句 ,:;_j<g`e  
选择:select * from table1 where 范围 xQ$*K]VP  
插入:insert into table1(field1,field2) values(value1,value2) v"bOv"!al  
删除:delete from table1 where 范围 yWX:`*GV  
更新:update table1 set field1=value1 where 范围 NB, iC [e  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! W=G[hT5L{  
排序:select * from table1 order by field1,field2 [desc] "}ZD-O`!  
总数:select count as totalcount from table1 C\fc 4  
求和:select sum(field1) as sumvalue from table1 Z7%>O:@z  
平均:select avg(field1) as avgvalue from table1 [!DLT6Qk  
最大:select max(field1) as maxvalue from table1 F%< 0pi  
最小:select min(field1) as minvalue from table1 rV1JJ.I  
|'a5n h!  
Va !HcG1^:  
%=_ Iq\lC  
11、说明:几个高级查询运算词 rb,&i1  
JEBx|U$'Y  
ogQbST  
A: UNION 运算符 M)-+j{<  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 y]@_DL#J=  
B: EXCEPT 运算符 Kh%9Oy  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 0p~:fm  
C: INTERSECT 运算符 o&X!75^G>  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 Ig S.U  
注:使用运算词的几个查询结果行必须是一致的。 am@\$Sa4  
12、说明:使用外连接 l tQ:c  
A、left outer join: )vo PH)!  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 JQ0KXS Nr  
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c &)`A4bf%  
B:right outer join: XhTp'2,]  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 Ag}>gbz~G  
C:full outer join: 7gPkg63  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 yyBfLPXZ  
N{E >R&,q  
{?#g*QF|^  
二、提升 L2Mcs  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) R$cg\DD  
法一:select * into b from a where 1<>1 3hb1^HNT  
法二:select top 0 * into b from a \Mt(9jNK  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) PcJ,Y\"[  
insert into b(a, b, c) select d,e,f from b; iPI6 _h  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) ]<{BDXIGIE  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 >Rx^@yQ!+z  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. o6oZk0  
4、说明:子查询(表名1:a 表名2:b) L?0dZY-"  
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3) lq+FH&  
5、说明:显示文章、提交人和最后回复时间 %6*xnB?  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b t0Ec` +)  
6、说明:外连接查询(表名1:a 表名2:b) <7u*OYjA  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c J/ <[irC  
7、说明:在线视图查询(表名1:a ) He&dVP  
select * from (SELECT a,b,c FROM a) T where t.a > 1; Rs5G5W@"A  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 !`Bb[BTf  
select * from table1 where time between time1 and time2 t'FY*|xk  
select a,b,c, from table1 where a not between 数值1 and 数值2 k\1q Jr  
9、说明:in 的使用方法 yO$]9  
select * from table1 where a [not] in ('值1','值2','值4','值6') Hz*!c#  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 64`V+Hd  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) (<2PhJ|  
11、说明:四表联查问题: ?%B%[u  
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where ..... H@5:x8  
12、说明:日程安排提前五分钟提醒 ADlPdkmym  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 ^!N_Nx/M  
13、说明:一条sql 语句搞定数据库分页 j9%=8Dn.<  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 Sxf<8Px9i  
14、说明:前10条记录 El]Rrku  
select top 10 * form table1 where 范围 7BdvJ"  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) [2.pZB  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) }-YD_Pm K-  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 _T8#36iR  
(select a from tableA ) except (select a from tableB) except (select a from tableC) sf7'8+wj>  
17、说明:随机取出10条数据 w6v P a  
select top 10 * from tablename order by newid() >*{\N^:z  
18、说明:随机选择记录 i wQ'=M  
select newid() <~vamim#K  
19、说明:删除重复记录 ^|-xmUC  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) }(O 7tC  
20、说明:列出数据库里所有的表名 J{\S+O2,*  
select name from sysobjects where type='U' :C_\.pA  
21、说明:列出表里的所有的 O0';j!?X  
select name from syscolumns where id=object_id('TableName') _`*x}  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 >mi%L3Pk  
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type [:TOU^  
显示结果: $kvF]|<bu  
type vender pcs T&X*[kP  
电脑 A 1 OGrp {s  
电脑 A 1 P ;PS+S9  
光盘 B 2 <eI7xifD  
光盘 A 2 _(TavL>l =  
手机 B 3 |:L<Ko  
手机 C 3 Qte=<Z)  
23、说明:初始化表table1 ^SVdaQ{7  
TRUNCATE TABLE table1 Iy6 "2$%a  
24、说明:选择从10到15的记录 9)3ok#pQ/  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc #ZeZs31  
p4bQCI  
`oXUVr  
<dLdSEw  
三、技巧 |9{l8`9}_  
1、1=1,1=2的使用,在SQL语句组合时用的较多 VfAIx]Fa  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, >-c;  
如: J`Q#p%W  
if @strWhere !='' cRDjpc]  
begin @;"HslU\Q  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere ]SFB_5Gb  
end ,H'O`oV!1E  
else .3Jggp  
begin (|Y[5O)  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 4Fgy<^94`  
end 6~ev5SD;f  
我们可以直接写成 Xd!=1 ::  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere #(?EL@5  
2、收缩数据库 !6'j W!  
--重建索引 w(]Q `  
DBCC REINDEX #E3Y; b%v  
DBCC INDEXDEFRAG t.v@\[{ -  
--收缩数据和日志 w3a`G|  
DBCC SHRINKDB r%}wPN(?D  
DBCC SHRINKFILE ^!3Sz1  
3、压缩数据库 u0^GB9q  
dbcc shrinkdatabase(dbname) MW &iNioX  
4、转移数据库给新用户以已存在用户权限 X8~ cWW  
exec sp_change_users_login 'update_one','newname','oldname' vq B)PL5)  
go Jk!}z+X'A  
5、检查备份集 -4m UGh1dy  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' O~.A}  
6、修复数据库 M~t S *  
ALTER DATABASE [dvbbs] SET SINGLE_USER 3l0x~  
GO BI?M/pIm  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK L NmsvU  
GO >j{phZ  
ALTER DATABASE [dvbbs] SET MULTI_USER we9R4 *j  
GO Z)Nl\e& M  
7、日志清除 2VyLt=mdh  
SET NOCOUNT ON sa36=:5x-  
DECLARE @LogicalFileName sysname, ]xBQ7Xqf|  
        @MaxMinutes INT, }Y~o =3-  
        @NewSize INT { aqce g  
USE    tablename            -- 要操作的数据库名 `PnB<rf:*1  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 <\|f;7/  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. / Li?;H  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) 5 5>^H1M  
-- Setup / initialize |tC!`.^\  
DECLARE @OriginalSize int a*o#,T5A  
SELECT @OriginalSize = size @5K/z<p%  
  FROM sysfiles .-T^ S"`d|  
  WHERE name = @LogicalFileName ABvB1[s#  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + w&:"x@ -|  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + b/5  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' glbU\K> >  
  FROM sysfiles % zHsh  
  WHERE name = @LogicalFileName ' \Z54$  
CREATE TABLE DummyTrans cd)yj&:?Bt  
  (DummyColumn char (8000) not null) %Ak"d+OH4  
DECLARE @Counter  INT, X!V@jo9?  
        @StartTime DATETIME, SxcNr5F   
        @TruncLog  VARCHAR(255) n,SDJsS^  
SELECT  @StartTime = GETDATE(), Z6\OkD  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' (dvCejc^p  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) "l6v[yv  
EXEC (@TruncLog) xG@zy4  
-- Wrap the log if necessary. [vV]lWOp'  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired f mILkXKz  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  jXB<"bw  
      AND (@OriginalSize * 8 /1024) > @NewSize  H@GiHej  
  BEGIN -- Outer loop. Ufd{.o[{-  
    SELECT @Counter = 0 6|+I~zJ88  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) ;0(|06=  
      BEGIN -- update *6=2UJcJ  
        INSERT DummyTrans VALUES ('Fill Log')  ,{MA90!  
        DELETE DummyTrans /MKcS%/H/  
        SELECT @Counter = @Counter + 1 gF+Uj( d  
      END  !%>p;H%0  
    EXEC (@TruncLog)  PB*m D7"  
  END  /co^swz  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + CKeT%3  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + '+LC.lM  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' tYK 5?d  
  FROM sysfiles ZG+8kt!w  
  WHERE name = @LogicalFileName }t#uSz^  
DROP TABLE DummyTrans FWcE\;%yVg  
SET NOCOUNT OFF >/k[6r5  
8、说明:更改某个表 c,-3+b  
exec sp_changeobjectowner 'tablename','dbo' oMk6ZzZ,>  
9、存储更改全部表 cL}} ^  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch $x#0m  
@OldOwner as NVARCHAR(128), *J,VvO 9  
@NewOwner as NVARCHAR(128) T!u&r  
AS EUevR/S  
DECLARE @Name  as NVARCHAR(128) (+lw t  
DECLARE @Owner  as NVARCHAR(128) ~'k.'O{  
DECLARE @OwnerName  as NVARCHAR(128) musZCg$  
DECLARE curObject CURSOR FOR '|V"!R)  
select 'Name'  = name, ,\ [R\s  
  'Owner'  = user_name(uid) YMx]i,u'+  
from sysobjects f-&4x_5  
where user_name(uid)=@OldOwner Q]wM WV  
order by name &6V[@gmD  
OPEN  curObject <XG&f  
FETCH NEXT FROM curObject INTO @Name, @Owner E0]B=-  
WHILE(@@FETCH_STATUS=0) aGY R:jR$  
BEGIN    IGqg,OEAp  
if @Owner=@OldOwner L ldZ"%P  
begin _3v6c  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) }xXUCU<  
  exec sp_changeobjectowner @OwnerName, @NewOwner |#G.2hMFr  
end ]/&qv6D*d  
-- select @name,@NewOwner,@OldOwner 5'>DvCp%M  
FETCH NEXT FROM curObject INTO @Name, @Owner ,xmmS\  
END 5nC#<EE  
close curObject |Xz-rgkQ  
deallocate curObject %" kF i  
GO w@,Yj#_9cx  
10、SQL SERVER中直接循环写入数据 ;cKN5#7  
declare @i int R"%zmA@o=  
set @i=1 NH+?7rf8  
while @i<30 L|O[u^  
begin x{y}pH"H  
  insert into test (userid) values(@i) }Fs;sfH  
  set @i=@i+1 *9Eep~ 6  
end \~u7 k  
小记存储过程中经常用到的本周,本月,本年函数 b?S,%  
Dateadd(wk,datediff(wk,0,getdate()),-1) OI:G~Wg  
Dateadd(wk,datediff(wk,0,getdate()),6) _D<=Yo  
Dateadd(mm,datediff(mm,0,getdate()),0) +ZOjbI)  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) tbMf_-g  
Dateadd(yy,datediff(yy,0,getdate()),0) ?}p~8{ '  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) .yK~FzLs  
上面的SQL代码只是一个时间段 84(NylZ  
Dateadd(wk,datediff(wk,0,getdate()),-1) = cQK^$6(  
Dateadd(wk,datediff(wk,0,getdate()),6) uW4 )DT9[5  
就是表示本周时间段. 5,Rxc=  
下面的SQL的条件部分,就是查询时间段在本周范围内的: NL`}rj  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) 8x":7 yV&  
而在存储过程中 DXFU~J*  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) ]=Im0s  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) SLI(;, s  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

简单生活
执著追求
别笑我浅溥,天真的以为用一腔真诚就能感动这个冷漠的世界。
也别说我幼稚,竟想用不长的人生去诠释繁杂的红尘。
然而除了真诚,我还能给你什么,的确我真的一无所有!

描述
快速回复

您目前还是游客,请 登录注册
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:
验证问题:
10+5=?,请输入中文答案:十五