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

[转贴]精妙SQL语句收集

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

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 xFZA1 8  
$t' .  
&V;^xMO!  
一、基础 LQVa,'  
1、说明:创建数据库 ["|' f  
CREATE DATABASE database-name "e WN5 2  
2、说明:删除数据库 a`.] 8Jy)  
drop database dbname \I r&&%  
3、说明:备份sql server y~)rZ-eSB  
--- 创建 备份数据的 device qTK\'trgx]  
USE master w_30g6tA  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' 7I~Ww{  
--- 开始 备份 n-m+@jRz  
BACKUP DATABASE pubs TO testBack nZ?BC O  
4、说明:创建新表 { 3=\x  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) MB42 3{j  
根据已有的表创建新表: _%G)Uz{3  
A:create table tab_new like tab_old (使用旧表创建新表) # 4E@y<l$  
B:create table tab_new as select col1,col2... from tab_old definition only "bFt+N  
5、说明:删除新表 HJl$v#]#+  
drop table tabname %mR roR6  
6、说明:增加一个列 (P;z* "q  
Alter table tabname add column col type =ogzq.+|  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 e %VJ:Dj  
7、说明:添加主键: Alter table tabname add primary key(col)  <b7 4L  
说明:删除主键: Alter table tabname drop primary key(col) et|P5%G  
8、说明:创建索引:create [unique] index idxname on tabname(col....) =j[zMO  
删除索引:drop index idxname !a&@y#x  
注:索引是不可更改的,想更改必须删除重新建。 V|.3Z\(  
9、说明:创建视图:create view viewname as select statement 5>.)7D%  
删除视图:drop view viewname [uxhdR`T  
10、说明:几个简单的基本的sql语句 wT?.Mte  
选择:select * from table1 where 范围 G)28#aH  
插入:insert into table1(field1,field2) values(value1,value2) rK%<2i  
删除:delete from table1 where 范围 ajIgL<x  
更新:update table1 set field1=value1 where 范围 5Z{h!}Y  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! %AbA(F  
排序:select * from table1 order by field1,field2 [desc] J{$+\  
总数:select count as totalcount from table1 +RexQE  
求和:select sum(field1) as sumvalue from table1 F"O{eK0T  
平均:select avg(field1) as avgvalue from table1 +W+O7SK\y  
最大:select max(field1) as maxvalue from table1 td^2gjr^5  
最小:select min(field1) as minvalue from table1 O_8ERxj g]  
!4uTi [e  
f(.@]eu X  
reml|!F-)  
11、说明:几个高级查询运算词 3nt&Sf  
wCiDvHF5+C  
srfFJX7*  
A: UNION 运算符 .5+*,+-  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 D8P<mIu}Y  
B: EXCEPT 运算符 `_Bvae j?,  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 %lZ++?&^  
C: INTERSECT 运算符 j.MpQ^eJ7  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 8%s ^>.rG  
注:使用运算词的几个查询结果行必须是一致的。 eCB(!Y|  
12、说明:使用外连接 B<c7&!B  
A、left outer join: 2 g"_ *[  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 910Ym!\{:  
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 -|^}~yOx0=  
B:right outer join: b#0y-bR  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 j`I[M6Qxh  
C:full outer join: 7sECbbJT  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 y3T- ^  
BcaMeb-Z  
kR%bdN  
二、提升 WrhC q6  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) Zd@'s.,J  
法一:select * into b from a where 1<>1 LO@.aJpp  
法二:select top 0 * into b from a %Kd&A*  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) hNB;29r~  
insert into b(a, b, c) select d,e,f from b; .$b]rx7$ ~  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) e*_8B2da  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 lcgT9 m#  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. 96;17h$  
4、说明:子查询(表名1:a 表名2:b) (g,lDU[=  
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) \&\_[y8U  
5、说明:显示文章、提交人和最后回复时间 bF %#KSVw  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b rDkAeX0  
6、说明:外连接查询(表名1:a 表名2:b) lTe}[@(  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c K7}EL|Kx  
7、说明:在线视图查询(表名1:a ) h: :'s&|  
select * from (SELECT a,b,c FROM a) T where t.a > 1; "pq#A*  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 ]#]m_+} Z  
select * from table1 where time between time1 and time2 7"F w8;k  
select a,b,c, from table1 where a not between 数值1 and 数值2 .{D[!Dp#h  
9、说明:in 的使用方法 bHcb+TR3  
select * from table1 where a [not] in ('值1','值2','值4','值6') b u%p,u!  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 xP 3_  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) S/-[OA>N  
11、说明:四表联查问题: TkhbnO g6  
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 ..... >T{9-_#P  
12、说明:日程安排提前五分钟提醒 Tz.!  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 $Tu%dE(OF  
13、说明:一条sql 语句搞定数据库分页 wVk2Fr(  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 6'W79  
14、说明:前10条记录 ~rE U83  
select top 10 * form table1 where 范围 xB:,l'\G  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) %Qc#v$;+J  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) >XP]NY}Po[  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 aNb=gjLpt  
(select a from tableA ) except (select a from tableB) except (select a from tableC) VVeO>jd  
17、说明:随机取出10条数据 X5U.8qI3  
select top 10 * from tablename order by newid() L>$yslH; b  
18、说明:随机选择记录 #(3w6 l2  
select newid()  g#~jF  
19、说明:删除重复记录 +]H9:ARI  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) +U&aK dQs  
20、说明:列出数据库里所有的表名 ?H1I,]Di  
select name from sysobjects where type='U' h!56?4,%Y  
21、说明:列出表里的所有的 Gxv@a   
select name from syscolumns where id=object_id('TableName') F.c`0u;=  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 \1D~4Gz6}  
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 %j=dKd>  
显示结果: d.tjLeY  
type vender pcs p?X.I]=vRv  
电脑 A 1 i;xH  
电脑 A 1 BZEY^G  
光盘 B 2  fI[tU(x  
光盘 A 2 YIb5jK `  
手机 B 3 *%(8z~(\  
手机 C 3 v=nq P{  
23、说明:初始化表table1 ]]@jvU_?kS  
TRUNCATE TABLE table1 JC`|GaUy  
24、说明:选择从10到15的记录 :FwXoJc_+5  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc /Ik_U?$*  
6PT ,m  
)hK5_]"lmj  
%KNnss}  
三、技巧 kH d_q.  
1、1=1,1=2的使用,在SQL语句组合时用的较多 O_0|Q@  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, :bwdEni1P  
如: {g\Yy(r  
if @strWhere !='' sLK J<=0i  
begin Gm^@lWzG  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere EU]{S=T  
end 9 Am&G  
else w/KHS#~  
begin >x@]w sj  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' X!&DKE  
end M_+&XLnzsJ  
我们可以直接写成 !y$H r[v  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere {%. _cR2  
2、收缩数据库 <`5>;Xn=  
--重建索引 K"VphKvR  
DBCC REINDEX LtbL[z>]  
DBCC INDEXDEFRAG EHkb{Q8  
--收缩数据和日志 k:s}`h _n  
DBCC SHRINKDB k(<5tvd  
DBCC SHRINKFILE _CAW D;P  
3、压缩数据库 tY !fO>Fn~  
dbcc shrinkdatabase(dbname) ~1wAk0G`n  
4、转移数据库给新用户以已存在用户权限 xB3;%Lc  
exec sp_change_users_login 'update_one','newname','oldname' ?XL[[vyr  
go Mcc774'*9  
5、检查备份集 [VIdw 92  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' A?|KA<&m#u  
6、修复数据库 85$MHod}[,  
ALTER DATABASE [dvbbs] SET SINGLE_USER pBiC  
GO [J\5DctX;c  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK 9_ JK.  
GO 'VFxg,  
ALTER DATABASE [dvbbs] SET MULTI_USER ]Rohf WHX  
GO o,9E~Q'`{  
7、日志清除 u /JEQz1  
SET NOCOUNT ON 1QtT*{zm$F  
DECLARE @LogicalFileName sysname, >Mj :'  
        @MaxMinutes INT, En8-Hc#NC  
        @NewSize INT qqT6C%Q`kG  
USE    tablename            -- 要操作的数据库名 hD{+V!{  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 B<DvH"+$  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. ^~-i>gTD  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) I !9u](\0  
-- Setup / initialize ]0by6hQ  
DECLARE @OriginalSize int cf1Ve\(YGI  
SELECT @OriginalSize = size .3qaaXeH  
  FROM sysfiles suj? e6  
  WHERE name = @LogicalFileName GBtBmV/`  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + n9gj{]%  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + xB]~%nC[O  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' 0z&3jWWY@  
  FROM sysfiles pD##lkJr  
  WHERE name = @LogicalFileName ;[0<QmeI!  
CREATE TABLE DummyTrans GBu&2}  
  (DummyColumn char (8000) not null)  LD: w wH  
DECLARE @Counter  INT, S0/@y'q3en  
        @StartTime DATETIME, ]kbmbO?M  
        @TruncLog  VARCHAR(255)  rmUT l  
SELECT  @StartTime = GETDATE(), Hq$AF  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' sn_]7d+ Q  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) 6xr$  
EXEC (@TruncLog) * gr{{c  
-- Wrap the log if necessary. kLR4?tX!  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired m46Q%hwV  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  sI/Hcm  
      AND (@OriginalSize * 8 /1024) > @NewSize  \ lP c,8)  
  BEGIN -- Outer loop. oc?,8I[P5  
    SELECT @Counter = 0 Ge@./SGT  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) d{hb gUSj  
      BEGIN -- update D#x D-c  
        INSERT DummyTrans VALUES ('Fill Log')  -Vn9YeH+  
        DELETE DummyTrans c?CwxI_b8  
        SELECT @Counter = @Counter + 1 );@Dr!H  
      END  E:4`x_~qQ  
    EXEC (@TruncLog)  uTA /E9OY  
  END  F)j-D(c4  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + Fj"g CBaR  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + Y4 ){{bEp  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' A|CW4f,  
  FROM sysfiles 5xwztcR-  
  WHERE name = @LogicalFileName Bt[`p\p@  
DROP TABLE DummyTrans z!)_'A  
SET NOCOUNT OFF SW UHHl  
8、说明:更改某个表 wg^#S  
exec sp_changeobjectowner 'tablename','dbo' &fdH HN  
9、存储更改全部表 m;WUp{'  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch  "@Bc eD  
@OldOwner as NVARCHAR(128), Xlw&hKS  
@NewOwner as NVARCHAR(128) C16MzrB}(N  
AS <oI{:KH  
DECLARE @Name  as NVARCHAR(128) w3PE.A"Q  
DECLARE @Owner  as NVARCHAR(128) v#a`*^ ^  
DECLARE @OwnerName  as NVARCHAR(128) M<r' j $g  
DECLARE curObject CURSOR FOR Zn1+} Z@I  
select 'Name'  = name, kwMuL>5  
  'Owner'  = user_name(uid) yTz@q>6s-  
from sysobjects *;Dd:D9  
where user_name(uid)=@OldOwner 1s-k=3)  
order by name x6* {@J&5*  
OPEN  curObject kCL)F\v"iT  
FETCH NEXT FROM curObject INTO @Name, @Owner T_\HU*\  
WHILE(@@FETCH_STATUS=0) N)lzX X  
BEGIN    w}G2m)(  
if @Owner=@OldOwner 6%JKY+n^  
begin @L { x;  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) +G"=1sxJ  
  exec sp_changeobjectowner @OwnerName, @NewOwner yrnB]$hf  
end pAtHU(}  
-- select @name,@NewOwner,@OldOwner eU1= :n&&\  
FETCH NEXT FROM curObject INTO @Name, @Owner nj!)\U  
END DOaEz?2)  
close curObject Vs]+MAL  
deallocate curObject X |.'_6l.  
GO Id *Gs>4U  
10、SQL SERVER中直接循环写入数据 jx!)N>  
declare @i int lInq=  
set @i=1 j.uN`cU!  
while @i<30 -i V&-oP  
begin }el. qZ  
  insert into test (userid) values(@i) e7t).s)b{  
  set @i=@i+1 >1`FR w<  
end +&jWM-T"-  
小记存储过程中经常用到的本周,本月,本年函数 u ?7(A %  
Dateadd(wk,datediff(wk,0,getdate()),-1) sT[)r]`T  
Dateadd(wk,datediff(wk,0,getdate()),6) xoTS?7  
Dateadd(mm,datediff(mm,0,getdate()),0) C.C)&&|X  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) H4 Ca+;  
Dateadd(yy,datediff(yy,0,getdate()),0) FviLlly6  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) ?O8NyCeb7  
上面的SQL代码只是一个时间段  02Ur'|  
Dateadd(wk,datediff(wk,0,getdate()),-1) ME[Wg\  
Dateadd(wk,datediff(wk,0,getdate()),6) -9~kp'_a  
就是表示本周时间段. L5(rP\B  
下面的SQL的条件部分,就是查询时间段在本周范围内的: ' jZ2^  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) v!E0/ gD  
而在存储过程中 E8T4Nh_  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) @b=tjQO_  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6) 5`{+y]  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
温馨提示:欢迎交流讨论,请勿纯表情、纯引用!
认证码:
验证问题:
3+5=?,请输入中文答案:八 正确答案:八