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

[转贴]精妙SQL语句收集

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

SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 q]F4Lq(  
S$S_nNq  
&foD&  
一、基础 MinbE13?U  
1、说明:创建数据库 IeO-O'^&`  
CREATE DATABASE database-name =Nw2;TkB[  
2、说明:删除数据库 _GE=kw;:  
drop database dbname #]?tY }~  
3、说明:备份sql server ^Y$QR]  
--- 创建 备份数据的 device pI  &o?n  
USE master 2K3MAd{  
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' J cP~-cp  
--- 开始 备份 7 rH'1U  
BACKUP DATABASE pubs TO testBack 0Xp nbB~~I  
4、说明:创建新表 %_>Tcm=  
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) -oU@D  
根据已有的表创建新表: Ynvj;  
A:create table tab_new like tab_old (使用旧表创建新表) [6O04"6K  
B:create table tab_new as select col1,col2... from tab_old definition only DYc.to-  
5、说明:删除新表 9~=gwP  
drop table tabname 1Wv{xML"  
6、说明:增加一个列 E3y6c)<  
Alter table tabname add column col type U?^OD  
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 lco~X DI  
7、说明:添加主键: Alter table tabname add primary key(col) ^SEc./$  
说明:删除主键: Alter table tabname drop primary key(col) Tj Mb>w9  
8、说明:创建索引:create [unique] index idxname on tabname(col....) p`\3if'  
删除索引:drop index idxname cvhlRI%6  
注:索引是不可更改的,想更改必须删除重新建。 ^)|&|  
9、说明:创建视图:create view viewname as select statement A_@I_V$  
删除视图:drop view viewname FH4u$ g+  
10、说明:几个简单的基本的sql语句 kmIoJH5  
选择:select * from table1 where 范围 {nTG~d  
插入:insert into table1(field1,field2) values(value1,value2) -<|Y1PQ  
删除:delete from table1 where 范围  wjL|Z8  
更新:update table1 set field1=value1 where 范围 oBb?"2~9  
查找:select * from table1 where field1 like '%value1%' ---like的语法很精妙,查资料! 4 ^4d9?c  
排序:select * from table1 order by field1,field2 [desc] yDzdE;  
总数:select count as totalcount from table1 IeZ&7u  
求和:select sum(field1) as sumvalue from table1 UIQQ \,3  
平均:select avg(field1) as avgvalue from table1 vuXS/ d  
最大:select max(field1) as maxvalue from table1 HF]EU!OT  
最小:select min(field1) as minvalue from table1 j]>=1Rd0b(  
>o#ERNf  
4ffU;6~l'  
~xw5\Y^  
11、说明:几个高级查询运算词 ,`y yR:F  
K|US~Hgv  
:"VujvFX  
A: UNION 运算符 D@#0dDT  
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 XjxPIdX_H  
B: EXCEPT 运算符 uWh|C9Y!A  
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。  O)OUy  
C: INTERSECT 运算符 /oFc 03d  
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 vmvFBzLR  
注:使用运算词的几个查询结果行必须是一致的。 ZBF1rx?  
12、说明:使用外连接 \<X2ns@Tf  
A、left outer join: l nfm0  
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 #XcU{5Qm5  
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 -/zp&*0gcx  
B:right outer join: <>]1Y$^Y  
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 pL! a  
C:full outer join: O"\nR:\  
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。 aV<^IxE;  
xHHV=M2l(s  
&-=K:;x  
二、提升 `os8;`G  
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) {8 N=WZ  
法一:select * into b from a where 1<>1 x )3~il5  
法二:select top 0 * into b from a qJ 95  
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用) kQIfYtT  
insert into b(a, b, c) select d,e,f from b; )%qtE34`  
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) ~\ [?wN  
insert into b(a, b, c) select d,e,f from b in '具体数据库' where 条件 9qr UM`z$g  
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where.. IO"hF  
4、说明:子查询(表名1:a 表名2:b) q4k.f_{  
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) {c@G$  
5、说明:显示文章、提交人和最后回复时间 @UO}W_0ZD  
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b \-c#jo.$8  
6、说明:外连接查询(表名1:a 表名2:b) :@/"abv  
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c U;p e:  
7、说明:在线视图查询(表名1:a )  &+G; R  
select * from (SELECT a,b,c FROM a) T where t.a > 1; R]Ek}1~?  
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括 IM=+3W;ak  
select * from table1 where time between time1 and time2 ei|cD[ NY  
select a,b,c, from table1 where a not between 数值1 and 数值2 \DS^i`o)rY  
9、说明:in 的使用方法 .TJ">?  
select * from table1 where a [not] in ('值1','值2','值4','值6') (i]Z|@|)  
10、说明:两张关联表,删除主表中已经在副表中没有的信息 1%jH^,t/m  
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) v,jhE9_O0  
11、说明:四表联查问题: AWT"Y4Ie  
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 ..... U<[jT=L  
12、说明:日程安排提前五分钟提醒 Oc~aW3*A(  
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 &\^rQi/tf  
13、说明:一条sql 语句搞定数据库分页 U-g9C.  
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 yUe+":7k.  
14、说明:前10条记录 3cixQzb}u  
select top 10 * form table1 where 范围 nvt$F%+  
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) I+",b4  
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b) Ak A!:!l  
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 @1bH}QS  
(select a from tableA ) except (select a from tableB) except (select a from tableC) CW-Ae  
17、说明:随机取出10条数据 'E-FO_N  
select top 10 * from tablename order by newid() ^C7C$TZS  
18、说明:随机选择记录 G6Nb{m  
select newid() \ha-"Aqze3  
19、说明:删除重复记录 )7Ixz1I9g  
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) W5Zqgsy($F  
20、说明:列出数据库里所有的表名 )xt4Wk/  
select name from sysobjects where type='U' -zKxf@"  
21、说明:列出表里的所有的 Q'K$L9q  
select name from syscolumns where id=object_id('TableName') f-D>3qSS  
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 41yOXy ;~l  
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 )Gb,^NGr  
显示结果: 7@l<? (  
type vender pcs ="'- &  
电脑 A 1 DP*@dFU"  
电脑 A 1 O%g\B8 ;  
光盘 B 2 !Lkm? (_  
光盘 A 2 "Pj}E=!k  
手机 B 3 \$pkk6Q3,w  
手机 C 3 Qqq <e  
23、说明:初始化表table1 bX2"89{  
TRUNCATE TABLE table1 74f9|~%  
24、说明:选择从10到15的记录 LT_iS^&1  
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc *_"u)<J  
3sbK7,4  
{G*OR,HN  
h1f8ktF  
三、技巧 1bSD,;$sQ  
1、1=1,1=2的使用,在SQL语句组合时用的较多 [@G`Afaf  
"where 1=1" 是表示选择全部  "where 1=2"全部不选, " U8S81'  
如: ^npJUa  
if @strWhere !='' 1'O0`Me>#  
begin Im)EDTm$  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere  zF: j  
end Uu'dv#4Iw  
else $Q/Ya@o  
begin :=fvZAWD  
set @strSQL = 'select count(*) as Total from [' + @tblName + ']' iM5vrz`n  
end 9Cvn6{  
我们可以直接写成 ;LMWNy4  
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere c1%rV`)]  
2、收缩数据库 FjFwvO_.  
--重建索引 Fo}7hab  
DBCC REINDEX _Y!sVJ){,c  
DBCC INDEXDEFRAG KDTDJ8  
--收缩数据和日志 CS@&^SEj  
DBCC SHRINKDB T)SbHp Y  
DBCC SHRINKFILE H?Jm'\~  
3、压缩数据库 Z<"K_bj   
dbcc shrinkdatabase(dbname) > 0.W`j(s  
4、转移数据库给新用户以已存在用户权限 Eju~}:Lo  
exec sp_change_users_login 'update_one','newname','oldname' WG5W0T_  
go fdv`7u+}a  
5、检查备份集 !w2gGy:I>  
RESTORE VERIFYONLY from disk='E:\dvbbs.bak' f/y`  
6、修复数据库 DWm SC}{.  
ALTER DATABASE [dvbbs] SET SINGLE_USER n7l%gA*  
GO >]?H`>4(  
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK |W7rr1]~S  
GO >EP(~G3u  
ALTER DATABASE [dvbbs] SET MULTI_USER 4["&O=:d  
GO -JV~[-,  
7、日志清除 ( u`W!{1\  
SET NOCOUNT ON HOZRYIQB  
DECLARE @LogicalFileName sysname, OYmi?y\  
        @MaxMinutes INT, 8)wt$b  
        @NewSize INT s9j7Psd  
USE    tablename            -- 要操作的数据库名 C@gXT]Q 0}  
SELECT  @LogicalFileName = 'tablename_log',  -- 日志文件名 q p~g P  
@MaxMinutes = 10,              -- Limit on time allowed to wrap log. >/^#Drwb!i  
        @NewSize = 1                  -- 你想设定的日志文件的大小(M) UtJa3ya  
-- Setup / initialize qf8[!5GM  
DECLARE @OriginalSize int S$[k Q|Am  
SELECT @OriginalSize = size 0rE(p2  
  FROM sysfiles rU2iy"L  
  WHERE name = @LogicalFileName kWW w<cA  
SELECT 'Original Size of ' + db_name() + ' LOG is ' + <Q5Le dN  
        CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + =6T 4>rP  
        CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB' Cifd21v4  
  FROM sysfiles ll<NIdf\r  
  WHERE name = @LogicalFileName M1!pQC_9  
CREATE TABLE DummyTrans \Fb| {6+  
  (DummyColumn char (8000) not null) -iN.Iuc{b_  
DECLARE @Counter  INT, jH *)%n5,\  
        @StartTime DATETIME, Q8qz*v]{  
        @TruncLog  VARCHAR(255) =Ho"N`Qy  
SELECT  @StartTime = GETDATE(), lMifpK  
        @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY' h(' )"  
DBCC SHRINKFILE (@LogicalFileName, @NewSize) t"AzI8O  
EXEC (@TruncLog) } !s!;BOx  
-- Wrap the log if necessary. DQXS$uBT  
WHILE    @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired Wa'sZ#  
      AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  Q-eCHr)  
      AND (@OriginalSize * 8 /1024) > @NewSize  g,kzQ}_  
  BEGIN -- Outer loop. uT_!'l$fr  
    SELECT @Counter = 0 !#x=JX  
    WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000)) !GK$[9  
      BEGIN -- update q/gB<p9  
        INSERT DummyTrans VALUES ('Fill Log')  G/?~\ }:s  
        DELETE DummyTrans <{J5W6  
        SELECT @Counter = @Counter + 1 >e&:`2%.  
      END  -?a<qa?$  
    EXEC (@TruncLog)  GWP dv  
  END  <4`eQ  
SELECT 'Final Size of ' + db_name() + ' LOG is ' + -1r2K  
        CONVERT(VARCHAR(30),size) + ' 8K pages or ' + +K$NAT  
        CONVERT(VARCHAR(30),(size*8/1024)) + 'MB' [QczlwmO  
  FROM sysfiles *"{& FEV  
  WHERE name = @LogicalFileName 0 P|&Pq&IH  
DROP TABLE DummyTrans acW'$@y9?N  
SET NOCOUNT OFF G^Tk 20*  
8、说明:更改某个表 C"w {\ &R  
exec sp_changeobjectowner 'tablename','dbo' Ru\_dr2yI}  
9、存储更改全部表 1np^(['ih  
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch U 4,2br>  
@OldOwner as NVARCHAR(128), TMVryb  
@NewOwner as NVARCHAR(128) }5 9U}@xC  
AS yL1bS|@  
DECLARE @Name  as NVARCHAR(128) g:#d l\k  
DECLARE @Owner  as NVARCHAR(128) z1V#'$_5-  
DECLARE @OwnerName  as NVARCHAR(128) [_6&N.  
DECLARE curObject CURSOR FOR pW?& J>\6  
select 'Name'  = name, }_OM$nzj  
  'Owner'  = user_name(uid) fI|[Z+"  
from sysobjects f4('gl9  
where user_name(uid)=@OldOwner 5g ;ac~g  
order by name d/,E2i{I7  
OPEN  curObject 8cxai8  
FETCH NEXT FROM curObject INTO @Name, @Owner NAFsFngqH  
WHILE(@@FETCH_STATUS=0) 'r} fZ  
BEGIN    p@Q5b}xCG_  
if @Owner=@OldOwner @gfDp<  
begin ]!{y a8  
  set @OwnerName = @OldOwner + '.' + rtrim(@Name) K k[`dR;  
  exec sp_changeobjectowner @OwnerName, @NewOwner kBEmmgL  
end sz95i|@/  
-- select @name,@NewOwner,@OldOwner /SR^C$h'I  
FETCH NEXT FROM curObject INTO @Name, @Owner 8;\sU?  
END <vc`^Q&4B  
close curObject -$a>f4]  
deallocate curObject XhW %,/<  
GO M8;lLcgu.  
10、SQL SERVER中直接循环写入数据 eE8ULtO  
declare @i int uG J"!K  
set @i=1 3Rv7Qx  
while @i<30 x4K`]Fvhl  
begin }IkQA#4$  
  insert into test (userid) values(@i) hfM;/  
  set @i=@i+1 nBLj [  
end h{iEZ#  
小记存储过程中经常用到的本周,本月,本年函数 ,/Cq v   
Dateadd(wk,datediff(wk,0,getdate()),-1) A.%CAGU5w  
Dateadd(wk,datediff(wk,0,getdate()),6) B |{I:[  
Dateadd(mm,datediff(mm,0,getdate()),0) (?&=T.*^  
Dateadd(ms,-3,dateadd(mm,datediff(m,0,getdate())+1,0)) ;h/pnmhP  
Dateadd(yy,datediff(yy,0,getdate()),0) L/r@ S'  
Dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0)) )@g;j>  
上面的SQL代码只是一个时间段 2XSHZ|;  
Dateadd(wk,datediff(wk,0,getdate()),-1) zY9 H%  
Dateadd(wk,datediff(wk,0,getdate()),6) 0Bolv_e  
就是表示本周时间段. XSRdqU>Aun  
下面的SQL的条件部分,就是查询时间段在本周范围内的: 2%UBw SiqR  
Where Time BETWEEN Dateadd(wk,datediff(wk,0,getdate()),-1) AND Dateadd(wk,datediff(wk,0,getdate()),6) i u]&;  
而在存储过程中 / !xF?OmVd  
select @begintime = Dateadd(wk,datediff(wk,0,getdate()),-1) 6vy7l(%  
select @endtime = Dateadd(wk,datediff(wk,0,getdate()),6)  z01>'  
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水

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

描述
快速回复

您目前还是游客,请 登录注册
批量上传需要先选择文件,再选择上传
认证码:
验证问题:
10+5=?,请输入中文答案:十五